一、Ansible管理工具简介及原理
目前IT运维主流自动化管理工具有Puppet、SaltStack、Ansible等。下面简单介绍Ansible的特点。
Ansible与SaltStack均是基于Python语言开发,Ansible只需要在一台普通的服务器上运行即可,不需要在客户端服务器上安装客户端。因为Ansible是基于SSH远程管理,而Linux服务器大都离不开SSH,所以Ansible不需要为配置工作添加额外的支持。Ansible安装使用非常简单,而且基于上千个插件和模块,实现各种软件、平台、版本的管理,支持虚拟容器多层级的部署。很多人在使用Ansible工具时,认为Ansible比SaltStatck执行效率慢,其实不是软件本身慢,是由于SSH服务慢,可以优化SSH连接速度及使用Ansible加速模块,满足企业上万台服务器的维护和管理。
Ansible自动运维管理工具优点如下:
□轻量级,更新时只需要在操作机上进行一次更新即可;
□采用SSH协议;
□不需要客户端安装agent;
□批量任务执行可以写成脚本,而且不用分发到远程客户端;
□使用Python编写,维护更简单;
□支持sudo普通用户命令;
□去中心化管理。
二、Ansible管理工具安装配置
Ansible可以工作在Linux、BSD、Mac OS X等平台,对Python环境的版本最低要求为Python2.6以上,如果操作系统Python软件版本为2.4,需要升级方可使用Ansible工具。Red Hat、CentOS操作系统可以直接基于YUM工具自动安装Ansible,CentOS 6.X或者CentOS 7.X安装前,需先安装epel扩展源,代码如下:
yum -y install epel-release
yum -y install ansible
Ansible工具默认主目录为/etc/ansib le/,其中hosts文件为被管理机IP或者主机名列表,ansible.cfg为ansible主配置文件,roles为角色或者插件路径,默认该目录为空,如下:
[root@localhost ~]# cd /etc/ansible/
[root@localhost ansible]# ls
ansible.cfg hosts roles
[root@localhost ansible]# ll
total 24
-rw-r--r-- 1 root root 19985 Jun 19 11:04 ansible.cfg
-rw-r--r-- 1 root root 1068 Jun 28 07:33 hosts
drwxr-xr-x 2 root root 6 Jun 19 11:04 roles
[root@localhost ansible]#
[root@localhost ansible]# pwd
/etc/ansible
[root@localhost ansible]#
Ansible远程批量管理,其中执行命令是通过Ad-Hoc来完成,也即点对点执行命令,能够快速执行,而且不需要保存执行的命令。默认hosts文件配置主机列表,可以配置分组,可以定义各种IP及规则,配置文件如下:
# If you have multiple hosts following a pattern you can specify
# them like this:
## www[001:006].example.com
# Ex 3: A collection of database servers in the 'dbservers' group
## [dbservers]
##
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57
# Here's another example of host ranges, this time there are no
# leading 0s:
## db-[99:101]-node.example.com
[zabbixagent] ##分组标签,可自定义
10.0.108.58 ##主机IP,被管理机
[zabbixserver]
10.0.108.30
Ansible基于多模块管理,常用的Ansible工具管理模块包括:command、shell、script、yum、copy、file、async、docker、cron、mysql_user、ping、sysctl、user、acl、add_host、easy_install、haproxy等。可以使用ansible-doc|more查看Ansible支持的模块,也可以查看每个模块的帮助文档,用法为ansible-doc module_name,如下:
[root@localhost ansible]# ansible-doc|more
ERROR! Incorrect options passed
usage: ansible-doc [-h] [--version] [-v] [-M MODULE_PATH]
[--playbook-dir BASEDIR]
[-t {become,cache,callback,cliconf,connection,httpapi,inventory,lookup,netcon
f,shell,module,strategy,vars}]
[-j] [-F | -l | -s | --metadata-dump]
[plugin [plugin ...]]
plugin documentation tool
positional arguments:
plugin Plugin
optional arguments:
--metadata-dump **For internal testing only** Dump json metadata for
all plugins.
--playbook-dir BASEDIR
Since this tool does not use playbooks, use this as a
substitute playbook directory.This sets the relative
path for many features including roles/ group_vars/
etc.
--version show program's version number, config file location,
configured module search path, module location,
executable location and exit
-F, --list_files Show plugin names and their source files without
summaries (implies --list)
-M MODULE_PATH, --module-path MODULE_PATH
prepend colon-separated path(s) to module library (def
ault=~/.ansible/plugins/modules:/usr/share/ansible/plu
gins/modules)
-h, --help show this help message and exit
-j, --json Change output into json format.
-l, --list List available plugins
-s, --snippet Show playbook snippet for specified plugin(s)
-t {become,cache,callback,cliconf,connection,httpapi,inventory,lookup,netconf,shell,module,str
ategy,vars}, --type {become,cache,callback,cliconf,connection,httpapi,inventory,lookup,netconf,s
hell,module,strategy,vars}
Choose which plugin type (defaults to "module").
Available plugin types are : ('become', 'cache',
'callback', 'cliconf', 'connection', 'httpapi',
'inventory', 'lookup', 'netconf', 'shell', 'module',
'strategy', 'vars')
-v, --verbose verbose mode (-vvv for more, -vvvv to enable
connection debugging)
See man pages for Ansible CLI options or website for tutorials
https://docs.ansible.com
三、Ansible工具参数详解
基于Ansible批量管理,需将被管理的服务器IP列表添加至/etc/ansible/hosts文件中。如图添加被管理端IP地址,分成zabbixagent和zabbixserver两组,本机也可以是被管理机。
# them like this:
## www[001:006].example.com
# Ex 3: A collection of database servers in the 'dbservers' group
## [dbservers]
##
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57
# Here's another example of host ranges, this time there are no
# leading 0s:
## db-[99:101]-node.example.com
[zabbixagent]
10.0.108.58
10.0.108.31
[zabbixserver]
10.0.108.30
Ansible自动运维工具管理客户端案例操作,由于Ansible管理远程服务器基于SSH,在登录远程服务器执行命令时需要远程服务器的用户名和密码,也可以加入-k参数手动输入密码或者基于ssh-keygen生成免秘钥。Ansible自动化批量管理工具主要参数详解如下:
□-v,-verbose:打印详细模式。
□-i PATH,-inventory=PATH:指定host文件路径。
□-f NUM,-forks=NUM:指定fork开启同步进程的个数,默认为5。
□-m NAME,-module-name=NAME:指定module名称,默认模块为command。
□-a MODULE_ARGS:module模块的参数或者命令。
□-k,-ask-pass:输入远程被管理端密码。
□-sudo:基于sudo用户执行。
□-K,-ask-sudo-pass:提示输入sudo密码与sudo一起使用。
□-u USERNAME,-user=USERNAME:指定执行用户。
□-C,--check:测试执行过程,不改变真实内容,相当于预演。
□-T TIMEOUT:执行命令超时时间,默认为10s。
□--version:查看Ansible软件版本信息。
四、运用实例——批量安装配置zabbix-agent
1、在hosts中添加被管理端IP地址
[root@localhost ansible]# vim hosts
[zabbixagent]
10.0.108.58
10.0.108.31
[zabbixserver]
10.0.108.30
2、创建roles\目录
[root@localhost ~]# mkdir /etc/ansible/roles/zabbixagent/{files,tasks} -pv
[root@localhost ~]# cd /etc/ansible/roles/zabbixagent/
[root@localhost zabbixagent]# ls
files tasks
这里的“/zabbixagent”可自定义
3、创建install_zabbixagent.sh
可自行选择安装方式,如果选择离线安装,则可使用copy模块,将源文件copy到被管理机相关路径。
我这里选择的的是yum安装。
[root@localhost zabbixagent]# vim /etc/ansible/roles/zabbixagent/install_zabbixagent.sh
#!/bin/bash
rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.19-1.el7.x86_64.rpm
yum -y install zabbix-agent
4、在flies下创建zabbix_agent.conf及zabbix.repo文件
这里的创建的配置文件就是zabbix-agent的配置文件,你也可以拷贝你配置好的文件。
创建zabbix_agent.conf:
[root@localhost flies]# vim zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
LogRemoteCommands=1
Server=10.0.108.30
ServerActive=10.0.108.30
Hostname=agent
Include=/etc/zabbix/zabbix_agentd.d/*.conf
创建zabbix.repo:
[root@localhost flies]# vim zabbix.repo
[zabbix]
name=Zabbix Official Repository - \$basearch
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/\$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591
[zabbix-non-supported]
name=Zabbix Official Repository non-supported - \$basearch
baseurl=https://mirrors.aliyun.com/zabbix/non-supported/rhel/7/\$basearch/
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX
gpgcheck=1
5、在tasks下创建剧本
[root@localhost tasks]# vim main.yml
- name: copy script
copy: src=/etc/ansible/roles/zabbixagent/install_zabbixagent.sh dest=/etc/zabbix/ mode=700
- name: run script
shell: ect/zabbix/zabbixagent.sh
- name: config zabbix
copy: src=/etc/ansible/roles/zabbixagent/flies/zabbix_agentd.conf dest=/etc/zabbix/
- name: start service
service: name=zabbix-agent state=started
6、创建执行剧本
[root@localhost ansible]# vim /etc/ansible/zabbixagent.yml
- hosts: zabbixagent
remote_user: root
roles:
- zabbixagent
Ansible文件夹树形结构如下:
[root@localhost ansible]# tree
.
├── ansible.cfg
├── hosts
├── install_zabbixagent.yml
├── roles
│ └── zabbixagent
│ ├── files
│ │ ├── zabbix_agentd.conf
│ │ └── zabbix.repo
│ ├── install_zabbixagent.sh
│ └── tasks
│ └── main.yml
└── zabbixagent.yml
4 directories, 8 files
7、运行剧本
[root@localhost ansible]# ansible-playbook -k zabbixagent.yml
SSH password:
PLAY [zabbixagent] *******************************************************************************
TASK [Gathering Facts] ***************************************************************************
ok: [10.0.108.58]
PLAY RECAP ***************************************************************************************
10.0.108.58 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
如图,运行成功。