一、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安装配置zabbix-agent_第1张图片

二、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

如图,运行成功。