ansible自动化运维详细教程及playbook详解

前言

当下有许多的运维自动化工具( 配置管理 ),例如:Ansible、SaltStack、Puppet、Fabric 等。

Ansible 一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,是 AnsibleWorks 公司名下的项目,该公司由 Cobbler 及 Func 的作者于 2012 年创建成立。

Ansible 基于 Python 语言实现,由 Paramiko 和 PyYAML 两个关键模块构建。

Ansible 特点:

  • 部署简单,只需在主控端部署 Ansible 环境,被控端无需做任何操作。
  • 默认使用 SSH(Secure Shell)协议对设备进行管理。
  • 主从集中化管理。
  • 配置简单、功能强大、扩展性强。
  • 支持 API 及自定义模块,可通过 Python 轻松扩展。
  • 通过 Playbooks 来定制强大的配置、状态管理。
  • 对云计算平台、大数据都有很好的支持。
  • 提供一个功能强大、操作性强的 Web 管理界面和 REST API 接口 —- AWX 平台。

Ansible 与 SaltStack:

  • 最大的区别是 Ansible 无需在被监控主机部署任何客户端代理,默认通过 SSH 通道进行远程命令执行或下发配置。
  • 相同点是都具备功能强大、灵活的系统管理、状态配置,都使用 YAML 格式来描述配置,两者都提供丰富的模板及 API,对云计算平台、大数据都有很好的支持。

安装ansible

1
yum -y install ansible

配置ansible

1
2
3
4
ls /etc/ansible
ansible.cfg hosts roles

# ansible.cfg 是 Ansible 工具的配置文件;hosts 用来配置被管理的机器;roles 是一个目录,playbook 将使用它

SSH秘钥认证

1
2
ssh-keygen -t rsa
ssh-copy-id root@agent_host_ip

添加被管理主机

1
2
3
4
5
vim /etc/ansible/hosts

[Client]
angent_host_ip_1
angent_host_ip_2

测试ansible

1
2
3
4
5
6
7
8
9
10
11
12
shell > ansible Client -m ping     # 操作 Client 组 ( all 为操作 hosts 文件中所有主机 ),-m 指定执行 ping 模块,下面是返回结果
192.168.12.129 | SUCCESS => {
"changed": false,
"ping": "pong"
}

# -i 指定 hosts 文件位置
# -u username 指定 SSH 连接的用户名
# -k 指定远程用户密码
# -f 指定并发数
# -s 如需要 root 权限执行时使用 ( 连接用户不是 root 时 )
# -K -s 时,-K 输入 root 密码

hosts主机文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
shell > vim /etc/ansible/hosts

www.abc.com # 定义域名

192.168.1.100 # 定义 IP

192.168.1.150:37268 # 指定端口号

[WebServer] # 定义分组

192.168.1.10
192.168.1.20
192.168.1.30

[DBServer] # 定义多个分组

192.168.1.50
192.168.1.60

Monitor ansible_ssh_port=12378 ansible_ssh_host=192.168.1.200 # 定义别名

# ansible_ssh_host 连接目标主机的地址

# ansible_ssh_port 连接目标主机的端口,默认 22 时无需指定

# ansible_ssh_user 连接目标主机默认用户

# ansible_ssh_pass 连接目标主机默认用户密码

# ansible_ssh_connection 目标主机连接类型,可以是 local 、ssh 或 paramiko

# ansible_ssh_private_key_file 连接目标主机的 ssh 私钥

# ansible_*_interpreter 指定采用非 Python 的其他脚本语言,如 Ruby 、Perl 或其他类似 ansible_python_interpreter 解释器

[webservers] # 主机名支持正则描述

www[01:50].example.com

[dbservers]

db-[a:f].example.com

ansible常用模块

1
2
3
shell > ansible-doc -l    # 列出 Ansible 支持的模块

shell > ansible-doc ping # 查看该模块帮助信息

远程命令模块(command / script / shell)

command

command 作为 Ansible 的默认模块,可以运行远程权限范围所有的 shell 命令,不支持管道符。

1
shell > ansible Client -m command -a "free -m"               # 查看 Client 分组主机内存使用情况

script

script 的功能是在远程主机执行主控端存储的 shell 脚本文件,相当于 scp + shell 组合。

1
shell > ansible Client -m script -a "/home/test.sh 12 34"    # 远程执行本地脚本

shell

shell模块基本和command相同,但是shell支持管道符

1
shell > ansible Client -m shell -a "/home/test.sh"           # 执行远程脚本

copy模块

实现主控端向目标主机拷贝文件,类似于 scp 功能

1
shell > ansible Client -m copy -a "src=/home/test.sh dest=/tmp/ owner=root group=root mode=0755"   # 向 Client 组中主机拷贝 test.sh 到 /tmp 下,属主、组为 root ,权限为 0755

file模块

file模块可以帮助我们完成一些对文件的基本操作,比如,创建文件或目录、删除文件或目录、修改文件权限等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
在test70主机上创建一个名为testfile的文件,如果testfile文件已经存在,则会更新文件的时间戳,与touch命令的作用相同。
ansible test70 -m file -a "path=/testdir/testfile state=touch"

在test70主机上创建一个名为testdir的目录,如果testdir目录已经存在,则不进行任何操作。
ansible test70 -m file -a "path=/testdir/testdir state=directory"

在test70上为testfile文件创建软链接文件,软链接名为linkfile,执行下面命令的时候,testfile已经存在。
ansible test70 -m file -a "path=/testdir/linkfile state=link src=/testdir/testfile"

在test70上为testfile文件创建硬链接文件,硬链接名为hardfile,执行下面命令的时候,testfile已经存在。
ansible test70 -m file -a "path=/testdir/hardfile state=hard src=/testdir/testfile"

在创建链接文件时,如果源文件不存在,或者链接文件与其他文件同名时,强制覆盖同名文件或者创建链接文件,参考上述force参数的解释。
ansible test70 -m file -a "path=/testdir/linkfile state=link src=sourcefile force=yes"

删除远程机器上的指定文件或目录
ansible test70 -m file -a "path=/testdir/testdir state=absent"

在创建文件或目录的时候指定属主,或者修改远程主机上的文件或目录的属主。
ansible test70 -m file -a "path=/testdir/abc state=touch owner=zsy"
ansible test70 -m file -a "path=/testdir/abc owner=zsy"
ansible test70 -m file -a "path=/testdir/abc state=directory owner=zsy"

在创建文件或目录的时候指定属组,或者修改远程主机上的文件或目录的属组。
ansible test70 -m file -a "path=/testdir/abb state=touch group=zsy"
ansible test70 -m file -a "path=/testdir/abb group=zsy"
ansible test70 -m file -a "path=/testdir/abb state=directory group=zsy"

在创建文件或目录的时候指定权限,或者修改远程主机上的文件或目录的权限。
ansible test70 -m file -a "path=/testdir/abb state=touch mode=0644"
ansible test70 -m file -a "path=/testdir/abb mode=0644"
ansible test70 -m file -a "path=/testdir/binfile mode=4700"
ansible test70 -m file -a "path=/testdir/abb state=directory mode=0644"

当操作远程主机中的目录时,同时递归的将目录中的文件的属主属组都设置为zsy。
ansible test70 -m file -a "path=/testdir/abd state=directory owner=zsy group=zsy recurse=yes"

unarchive

作用:

  • 将ansible主机上的压缩包在本地解压缩后传到远程主机上,默认设置为copy=yes,
  • 将远程主机上的某个压缩包解压缩到指定路径下,需设置copy=no
1
2
3
4
5
#解压远程主机src路径下的包,解压至/opt/下,并将解压出来的文件属组和属主改为jiii
[root@ljc project1]# ansible web -m unarchive -a 'src=/usr/share/nginx/html/WeCenter_3-2-1.zip copy=no dest=/opt/ group=jiii owner=jiii'

#解压本地管理机src路径下的包,解压至/opt/t下,并将解压出来的文件属组和属主改为jiii
[root@ljc project1]# ansible web -m unarchive -a 'src=/root/project1/phpMyAdmin-4.8.4-all-languages.zip dest=/opt/t group=jiii owner=jiii'

stat模块

获取远程文件状态信息,atime/ctime/mtime/md5/uid/gid 等信息

1
shell > ansible Client -m stat -a "path=/etc/syctl.conf"

get_url

实现在远程主机下载指定 URL 到本地,支持 sha256sum 文件校验

1
shell > ansible Client -m get_url -a "url=http://www.baidu.com dest=/tmp/index.html mode=0440 force=yes"

yum

软件包管理

1
shell > ansible Client -m yum -a "name=curl state=latest"

corn

远程主机 crontab 配置

1
2
3
4
shell > ansible Client -m cron -a "name='check dirs' hour='5,2' job='ls -alh > /dev/null'"

效果:
* 5,2 * * * ls -alh > /dev/null

mount

远程主机分区挂载

1
shell > ansible Client -m mount -a "name=/mnt/data src=/dev/sd0 fstype=ext4 opts=ro state=present"

service

远程主机系统服务管理

1
2
3
shell > ansible Client -m service -a "name=nginx state=stoped"
shell > ansible Client -m service -a "name=nginx state=restarted"
shell > ansible Client -m service -a "name=nginx state=reloaded"

user

远程主机用户管理

1
2
3
shell > ansible Client -m user -a "name=wang comment='user wang'"

shell > ansible Client -m user -a "name=wang state=absent remove=yes" # 添加删除用户

ansible-playbook 详解

命令详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
ansible-playbook playbook.yml [options]

-u REMOTE_USER, --user=REMOTE_USER
# ssh 连接的用户名
-k, --ask-pass
#ssh登录认证密码
-s, --sudo
#sudo 到root用户,相当于Linux系统下的sudo命令
-U SUDO_USER, --sudo-user=SUDO_USER
#sudo 到对应的用户
-K, --ask-sudo-pass #用户的密码(—sudo时使用)
-T TIMEOUT, --timeout=TIMEOUT
# ssh 连接超时,默认 10 秒
-C, --check # 指定该参数后,执行 playbook 文件不会真正去执行,而是模拟执行一遍,然后输出本次执行会对远程主机造成的修改
-e EXTRA_VARS, --extra-vars=EXTRA_VARS
# 设置额外的变量如:key=value 形式 或者 YAML or JSON,以空格分隔变量,或用多个-e
-f FORKS, --forks=FORKS # 进程并发处理,默认 5
-i INVENTORY, --inventory-file=INVENTORY
# 指定 hosts 文件路径,默认 default=/etc/ansible/hosts
-l SUBSET, --limit=SUBSET
# 指定一个 pattern,对- hosts:匹配到的主机再过滤一次
--list-hosts # 只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook
--list-tasks # 列出该 playbook 中会被执行的 task
--private-key=PRIVATE_KEY_FILE # 私钥路径
--step # 同一时间只执行一个 task,每个 task 执行前都会提示确认一遍
--syntax-check # 只检测 playbook 文件语法是否有问题,不会执行该 playbook
-t TAGS, --tags=TAGS #当 play 和 task 的 tag 为该参数指定的值时才执行,多个 tag 以逗号分隔
--skip-tags=SKIP_TAGS # 当 play 和 task 的 tag 不匹配该参数指定的值时,才执行
-v, --verbose #输出更详细的执行过程信息,-vvv可得到所有执行过程信息。

YAML语法

  1. YAML的语法和其他高阶语言类似并且可以简单表达清单、散列表、标量等数据结构。(列表用横杆表示,键值对用冒号分割,键值对里又可以嵌套另外的键值对)
  2. YAML文件扩展名通常为.yaml或者.yml。下面为示例
  3. 一定要对齐,只能使用空格
1
2
3
4
5
6
7
8
9
10
11
12
13
name: tom
age: 21
gender: male
spourse:
name: lily
gender: female
children:
- name: susan
age: 2
gender: feamle
- name: sunny
age: 10
gender: male

Playbook目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[root@localhost project]# tree
.
├── group_vars <- 所有主机的公共变量存放位置
│ └── all <- all对应公共变量
│ │__ group_name <- 必须对应主机组名称
├──inventory
│ └── hosts <- 需要管理的主机的列表信息
├── roles <- roles 存放模块, 当前有 etcd, initial, loop 三个模块
│ ├── etcd
│ │ ├── files <- 需要直接复制到 client 的文件存放位置
│ │ │ └── etcd-proxy.service <--即每个主机配置一样
│ │ ├── handlers <- 用于服务管理用的控制文件
│ │ │ └── main.yml
│ │ ├── tasks <- ansible 任务文件
│ │ │ ├── config.yml
│ │ │ ├── main.yml
│ │ │ ├── package.yml
│ │ │ └── service.yml
│ │ └── templates <- 需要复制到 client 中的模板文件, 会配合变量进行配置变换
│ │ │ └── etcd-proxy.conf <-- 即每个主机配置可能不一样
│ │ │___vars
│ │ └──main.yml <-- roles变量文件
│ ├── initial
│ │ ├── files
│ │ │ ├── hosts
│ │ │ ├── resolv.conf
│ │ │ └── updatedb.conf
│ │ ├── handlers
│ │ ├── tasks
│ │ │ ├── main.yml
│ │ │ ├── mlocate.yml
│ │ │ ├── package.yml
│ │ │ ├── sysctl.yml
│ │ │ └── yumrepo.yml
│ │ └── templates
│ │ ├── centos7.repo
│ │ └── docker.repo
│ └── loop
│ ├── files
│ ├── handlers
│ ├── tasks
│ │ ├── main.yml
│ │ └── t1.yml
│ └── templates
└── site.yml <- 主控制入口文件

核心组件

  • tasks:任务
  • variables:变量
  • templates:模板
  • handlers:处理器
  • roles:角色

标签处理

意义:通过tags和任务对象进行捆绑,控制部分或者指定的task执行

  • 打标签
1
2
3
对一个对象打一个标签
对一个对象打多个标签
打标签的对象包括:单个task任务、include对象、roles对象等
  • 标签使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
-t : 执行指定的tag标签任务
--skip-tags : 执行--skip-tags之外的标签任务

# 示例
devops@devops-virtual-machine:/etc/ansible$ cat f14.yml
---
- hosts : 192.168.56.11
remote_user : root
tasks :
- name: create file 1
shell: touch /tmp/file1.txt
tags:
- cfile1
- cfile3
- name: create file 2
shell : touch /tmp/file2.txt
tags:
- cfile2


# 执行剧本
# 执行剧本,只执行tags为cfile1的任务
devops@devops-virtual-machine:/etc/ansible$ ansible-playbook ./f14.yml -t cfile1

PLAY [192.168.56.11] ************************************************************************************

TASK [Gathering Facts] **********************************************************************************
ok: [192.168.56.11]

TASK [create file 1] ************************************************************************************
[WARNING]: Consider using file module with state=touch rather than running touch

changed: [192.168.56.11]

PLAY RECAP **********************************************************************************************
192.168.56.11 : ok=2 changed=1 unreachable=0 failed=0

# 执行剧本不包含tags为cfile1的任务
devops@devops-virtual-machine:/etc/ansible$ ansible-playbook ./f14.yml --skip-tags cfile1

PLAY [192.168.56.11] ************************************************************************************

TASK [Gathering Facts] **********************************************************************************
ok: [192.168.56.11]

TASK [create file 2] ************************************************************************************
[WARNING]: Consider using file module with state=touch rather than running touch

changed: [192.168.56.11]

PLAY RECAP **********************************************************************************************
192.168.56.11 : ok=2 changed=1 unreachable=0 failed=0

playbook简单示例

第一个示例

1
2
3
4
5
6
7
8
9
10
11
12
13
vim /root/first.yml

- hosts: all
remote_user: root
vars: httpd_port=80

tasks:
- name: install httpd
yum: name=httpd state=present
- name: install php
yum: name=php state=present
- name: start httpd
service: name=httpd state=started enabled=true

hosts 定义单个主机或组,vars定义变量,remote_user定义执行命令的远程用户,tasks定义执行哪些命令,handlers定义调用哪些处理器

vars(变量):

  • 变量命名: 字母数字下划线组成,只能以字母开头

  • 变量种类:

    1. facts(内置变量)

      由远程主机发回的主机属性信息,这些信息被保存在ansible变量当中

      例如:ansible 192.168.238.170 -m setup 来获取远程主机上的属性信息,这些属性信息保存在facts中

    2. 通过命令行传递

      通过命令行传递:ansible-playbook test.yml –extra-vars “host=www user=tom“(如果剧本中已有此处定义的变量则会被覆盖)

    3. 通过roles传递

    4. 主机变量

      在/etc/ansible/hosts中定义

      1
      2
      3
      >      [web1]
      > 192.168.1.1 name=haha
      >
  1. 组变量

    1
    2
    3
    >      [group_name:vars]
    > foo=bar
    >

hosts :

/etc/abible/hosts 中指定的远程主机,并用指定的属性进行连接

1
2
3
4
5
6
> ansible_ssh_port 连接远程主机使用的端口
>
> ansible_ssh_user 连接远程主机使用的用户
>
> ansible_ssh_pass 连接远程主机使用的密码
>
1
2
3
4
5
6
> cat /etc/ansible/hosts
>
> [web1]
> web1.hostname ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123
> web2.hostname
>

第二个示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
vim /root/second.yml

- hosts: web1
remote_user: root
vars:
username: bob
password: 123

tasks:
- name: add user
user: name={{ username }} state=present
when: ansible_os_family == "Debian"
- name: set password
shell: echo {{ password }} |passwd --stdin {{ username }}
- name: install httpd php
yum: name={{ item }} state=present
with_items:
- httpd
- php
- name: add two users
user: name={{ item }} state=present groups={{ item.groups }}
with_items:
- { name: 'user1', groups: 'group1'}
- { name: 'user2', groups: 'group2'}
- 在playbook中调用变量的方式为{{ variable }} - when语句用来条件测试 - ansible_os_family 是facts中内置的属性信息 ansible_os_family的信息可以使用ansible all -m setup | grep ansible_os_family 查看 - 在task中调用内置的item变量;在某task后面使用with_items语句来定义元素列表

第三个示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
vim /root/third.yml

- hosts: web1
remote_user: root
vars:
httpd_port=80

tasks:
- name: install httpd
yum: name=httpd state=present
- name: install php
yum: name=php state=present
- name: copy config file
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
- name: start httpd
service: name=httpd state=started enabled=true

handlers:
- name: restart httpd
service: name=httpd state=restarted

上面的意思是copy中复制过去的文件跟远程主机上的文件不同,就通过notify调用handlers,即重启httpd服务。

handler是重启服务是最通用的用法

第四个示例

1
2
3
vim /etc/ansible/hosts
[web1]
192.168.1.1 http_port=80
1
2
3
4
vim /root/httpd.conf
……
Listen {{ http_port }}
……
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vim /root/fourth.yml

- hosts: web1
remote_user: root
vars:
httpd_port=80

tasks:
- name: install httpd
yum: name=httpd state=present
- name: copy config file
template: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
- name: start httpd
service: name=httpd state=started enabled=true

handlers:
- name: restart httpd
service: name=httpd state=restarted
> templates:用于生成文本文件(配置文件) > > 模板文件中可使用jinja2表达式,表达式要定义在{{ }},也可以简单地仅执行变量替换

第五个示例

roles:roles用于实现“代码复用”,roles以特定的层次型格式组织起来的playbook元素(variables, tasks, templates,handlers);可被playbook以role的名字直接进行调用

roles的文件结构:

  • files/:此角色中用到的所有文件均放置于此目录中
  • templates/: Jinja2模板文件存放位置
  • tasks/:任务列表文件;可以有多个,但至少有一个叫做main.yml的文件
  • handlers/:处理器列表文件;可以有多个,但至少有一个叫做main.yml的文件
  • vars/:变量字典文件;可以有多个,但至少有一个叫做main.yml的文件
  • meta/:此角色的特殊设定及依赖关系
1
2
3
mkdir /root/roles
cd /root/roles
mkdir -p web1/{files, templayes, tasks, handlers, vars, meta}
1
2
3
4
vim web1/vars/main.yml
user: tom
group: tom
http_port: 8080
1
2
3
4
5
6
7
8
9
10
11
12
13
vim web1/tasks/main.yml

- name: install httpd
yum: name=httpd state=present
- name: copy config file
template: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
tags: conf
- name: start httpd
service: name=httpd state=started enabled=true

这里的template指的是相对路径-->web1/templates
tags可以在运行时指定标签任务
1
2
3
4
5
vim web1/handlers/main.yml

handlers:
- name: restart httpd
service: name=httpd state=restarted
1
2
3
4
5
vim web1/templates/httpd.conf

……
Listen {{ http_port }}
……

定义一个调用roles文件

1
2
3
4
5
6
7
8
9
10
11
vim /root/web1.yml

- hosts: web1
remote_user: root
roles:
- web1
- { role:web2, http_port:8080 }

hosts:web1 指在/etc/ansible/hosts中定义的组,上面有定义
roles: web1 指的是当前目录下的web1目录,也可通过role传递变量, 也可调用多个role
这样只需更改hosts的主机就可以实现不同主机的代码重用了

运行

1
2
3
ansible-playbook web1.yml
指定运行任务:
ansible-playbook -t conf web1.yml

使用ansible-playbook安装zabbix

定义hosts

1
2
3
4
5
6
shell > vim /etc/ansible/hosts

[mini]

129.139.153.78:16283
155.139.190.94:12573

定义入口文件install_zabbix_agent.yml

1
2
3
4
5
6
7
8
shell > vim /etc/ansible/install_zabbix_agent.yml

---
- hosts: mini
roles:
- install_zabbix_agent

## 可以看到将要安装的主机组为 mini 组,角色为 install_zabbix_agent

定义角色 install_zabbix_agent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
shell > tree /etc/ansible/roles/install_zabbix_agent/

├── files
│ └── zabbix-2.4.5.tar.gz
├── tasks
│ └── main.yml
├── templates
│ ├── zabbix_agentd
│ └── zabbix_agentd.conf
└── vars
└── main.yml

## 建立 files 目录,存放编译安装过的 zabbix_agent 目录的压缩文件,用于拷贝到远程主机
## 建立 tasks 目录,用于编写将要执行的任务
## 建立 templates 目录,用于存放可变的模板文件
## 建立 vars 目录,用于存放变量信息

建立tasks主文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
shell > cat /etc/ansible/roles/install_zabbix_agent/tasks/main.yml

---
- name: Install Software
yum: name={{ item }} state=latest
with_items:
- libcurl-devel
- name: Create Zabbix User
user: name={{ zabbix_user }} state=present createhome=no shell=/sbin/nologin
- name: Copy Zabbix.tar.gz
copy: src=zabbix-{{ zabbix_version }}.tar.gz dest={{ zabbix_dir }}/src/zabbix-{{ zabbix_version }}.tar.gz owner=root group=root
- name: Uncompression Zabbix.tar.gz
shell: tar zxf {{ zabbix_dir }}/src/zabbix-{{ zabbix_version }}.tar.gz -C {{ zabbix_dir }}/
- name: Copy Zabbix Start Script
template: src=zabbix_agentd dest=/etc/init.d/zabbix_agentd owner=root group=root mode=0755
- name: Copy Zabbix Config File
template: src=zabbix_agentd.conf dest={{ zabbix_dir }}/zabbix/etc/zabbix_agentd.conf owner={{ zabbix_user }} group={{ zabbix_user }} mode=0644
- name: Modify Zabbix Dir Permisson
file: path={{ zabbix_dir }}/zabbix owner={{ zabbix_user }} group={{ zabbix_user }} mode=0755 recurse=yes
- name: Start Zabbix Service
shell: /etc/init.d/zabbix_agentd start
- name: Add Boot Start Zabbix Service
shell: chkconfig --level 35 zabbix_agentd on

建立主变量文件

变量使用说明

1
2
3
4
5
6
7
shell > cat /etc/ansible/roles/install_zabbix_agent/vars/main.yml

zabbix_dir: /usr/local
zabbix_version: 2.4.5
zabbix_user: zabbix
zabbix_port: 10050
zabbix_server_ip: 131.142.101.120

建立模板文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
shell > cat /etc/ansible/roles/install_zabbix_agent/templates/zabbix_agentd

#!/bin/bash
#
# chkconfig: - 90 10
# description: Starts and stops Zabbix Agent using chkconfig
# Tested on Fedora Core 2 - 5
# Should work on all Fedora Core versions
#
# @name: zabbix_agentd
# @author: Alexander Hagenah <hagenah@topconcepts.com>
# @created: 18.04.2006
#
# Modified for Zabbix 2.0.0
# May 2012, Zabbix SIA
#
# Source function library.
. /etc/init.d/functions

# Variables
# Edit these to match your system settings

# Zabbix-Directory
BASEDIR={{ zabbix_dir }}/zabbix

# Binary File
BINARY_NAME=zabbix_agentd

# Full Binary File Call
FULLPATH=$BASEDIR/sbin/$BINARY_NAME

# PID file
PIDFILE=/tmp/$BINARY_NAME.pid

# Establish args
ERROR=0
STOPPING=0

#
# No need to edit the things below
#

# application checking status
if [ -f $PIDFILE ] && [ -s $PIDFILE ]
then
PID=`cat $PIDFILE`

if [ "x$PID" != "x" ] && kill -0 $PID 2>/dev/null && [ $BINARY_NAME == `ps -e | grep $PID | awk '{print $4}'` ]
then
STATUS="$BINARY_NAME (pid `pidof $APP`) running.."
RUNNING=1
else
rm -f $PIDFILE
STATUS="$BINARY_NAME (pid file existed ($PID) and now removed) not running.."
RUNNING=0
fi
else
if [ `ps -e | grep $BINARY_NAME | head -1 | awk '{ print $1 }'` ]
then
STATUS="$BINARY_NAME (pid `pidof $APP`, but no pid file) running.."
else
STATUS="$BINARY_NAME (no pid file) not running"
fi
RUNNING=0
fi

# functions
start() {
if [ $RUNNING -eq 1 ]
then
echo "$0 $ARG: $BINARY_NAME (pid $PID) already running"
else
action $"Starting $BINARY_NAME: " $FULLPATH
touch /var/lock/subsys/$BINARY_NAME
fi
}

stop() {
echo -n $"Shutting down $BINARY_NAME: "
killproc $BINARY_NAME
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$BINARY_NAME
RUNNING=0
}


# logic
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $BINARY_NAME
;;
restart)
stop
sleep 10
start
;;
help|*)
echo $"Usage: $0 {start|stop|status|restart|help}"
cat <<EOF

start - start $BINARY_NAME
stop - stop $BINARY_NAME
status - show current status of $BINARY_NAME
restart - restart $BINARY_NAME if running by sending a SIGHUP or start if not running
help - this screen

EOF
exit 1
;;
esac

exit 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
shell > cat /etc/ansible/roles/install_zabbix_agent/templates/zabbix_agentd.conf

# This is a config file for the Zabbix agent daemon (Unix)
# To get more information about Zabbix, visit http://www.zabbix.com

############ GENERAL PARAMETERS #################

### Option: PidFile
# Name of PID file.
#
# Mandatory: no
# Default:
# PidFile=/tmp/zabbix_agentd.pid

### Option: LogFile
# Name of log file.
# If not set, syslog is used.
#
# Mandatory: no
# Default:
# LogFile=

LogFile=/tmp/zabbix_agentd.log

### Option: LogFileSize
# Maximum size of log file in MB.
# 0 - disable automatic log rotation.
#
# Mandatory: no
# Range: 0-1024
# Default:
# LogFileSize=1

### Option: DebugLevel
# Specifies debug level
# 0 - basic information about starting and stopping of Zabbix processes
# 1 - critical information
# 2 - error information
# 3 - warnings
# 4 - for debugging (produces lots of information)
#
# Mandatory: no
# Range: 0-4
# Default:
# DebugLevel=3

### Option: SourceIP
# Source IP address for outgoing connections.
#
# Mandatory: no
# Default:
# SourceIP=

### Option: EnableRemoteCommands
# Whether remote commands from Zabbix server are allowed.
# 0 - not allowed
# 1 - allowed
#
# Mandatory: no
# Default:
# EnableRemoteCommands=0

### Option: LogRemoteCommands
# Enable logging of executed shell commands as warnings.
# 0 - disabled
# 1 - enabled
#
# Mandatory: no
# Default:
# LogRemoteCommands=0

##### Passive checks related

### Option: Server
# List of comma delimited IP addresses (or hostnames) of Zabbix servers.
# Incoming connections will be accepted only from the hosts listed here.
# If IPv6 support is enabled then '127.0.0.1', '::127.0.0.1', '::ffff:127.0.0.1' are treated equally.
#
# Mandatory: no
# Default:
# Server=

Server={{ zabbix_server_ip }}

### Option: ListenPort
# Agent will listen on this port for connections from the server.
#
# Mandatory: no
# Range: 1024-32767
# Default:
# ListenPort=10050
ListenPort={{ zabbix_port }}

### Option: ListenIP
# List of comma delimited IP addresses that the agent should listen on.
# First IP address is sent to Zabbix server if connecting to it to retrieve list of active checks.
#
# Mandatory: no
# Default:
# ListenIP=0.0.0.0

### Option: StartAgents
# Number of pre-forked instances of zabbix_agentd that process passive checks.
# If set to 0, disables passive checks and the agent will not listen on any TCP port.
#
# Mandatory: no
# Range: 0-100
# Default:
# StartAgents=3

##### Active checks related

### Option: ServerActive
# List of comma delimited IP:port (or hostname:port) pairs of Zabbix servers for active checks.
# If port is not specified, default port is used.
# IPv6 addresses must be enclosed in square brackets if port for that host is specified.
# If port is not specified, square brackets for IPv6 addresses are optional.
# If this parameter is not specified, active checks are disabled.
# Example: ServerActive=127.0.0.1:20051,zabbix.domain,[::1]:30051,::1,[12fc::1]
#
# Mandatory: no
# Default:
# ServerActive=

#ServerActive=127.0.0.1:10051

### Option: Hostname
# Unique, case sensitive hostname.
# Required for active checks and must match hostname as configured on the server.
# Value is acquired from HostnameItem if undefined.
#
# Mandatory: no
# Default:
# Hostname=

Hostname={{ ansible_all_ipv4_addresses[1] }}

### Option: HostnameItem
# Item used for generating Hostname if it is undefined. Ignored if Hostname is defined.
# Does not support UserParameters or aliases.
#
# Mandatory: no
# Default:
# HostnameItem=system.hostname

### Option: HostMetadata
# Optional parameter that defines host metadata.
# Host metadata is used at host auto-registration process.
# An agent will issue an error and not start if the value is over limit of 255 characters.
# If not defined, value will be acquired from HostMetadataItem.
#
# Mandatory: no
# Range: 0-255 characters
# Default:
# HostMetadata=

### Option: HostMetadataItem
# Optional parameter that defines an item used for getting host metadata.
# Host metadata is used at host auto-registration process.
# During an auto-registration request an agent will log a warning message if
# the value returned by specified item is over limit of 255 characters.
# This option is only used when HostMetadata is not defined.
#
# Mandatory: no
# Default:
# HostMetadataItem=

### Option: RefreshActiveChecks
# How often list of active checks is refreshed, in seconds.
#
# Mandatory: no
# Range: 60-3600
# Default:
# RefreshActiveChecks=120

### Option: BufferSend
# Do not keep data longer than N seconds in buffer.
#
# Mandatory: no
# Range: 1-3600
# Default:
# BufferSend=5

### Option: BufferSize
# Maximum number of values in a memory buffer. The agent will send
# all collected data to Zabbix Server or Proxy if the buffer is full.
#
# Mandatory: no
# Range: 2-65535
# Default:
# BufferSize=100

### Option: MaxLinesPerSecond
# Maximum number of new lines the agent will send per second to Zabbix Server
# or Proxy processing 'log' and 'logrt' active checks.
# The provided value will be overridden by the parameter 'maxlines',
# provided in 'log' or 'logrt' item keys.
#
# Mandatory: no
# Range: 1-1000
# Default:
# MaxLinesPerSecond=100

############ ADVANCED PARAMETERS #################

### Option: Alias
# Sets an alias for an item key. It can be used to substitute long and complex item key with a smaller and simpler one.
# Multiple Alias parameters may be present. Multiple parameters with the same Alias key are not allowed.
# Different Alias keys may reference the same item key.
# For example, to retrieve the ID of user 'zabbix':
# Alias=zabbix.userid:vfs.file.regexp[/etc/passwd,^zabbix:.:([0-9]+),,,,\1]
# Now shorthand key zabbix.userid may be used to retrieve data.
# Aliases can be used in HostMetadataItem but not in HostnameItem parameters.
#
# Mandatory: no
# Range:
# Default:

### Option: Timeout
# Spend no more than Timeout seconds on processing
#
# Mandatory: no
# Range: 1-30
# Default:
Timeout=20

### Option: AllowRoot
# Allow the agent to run as 'root'. If disabled and the agent is started by 'root', the agent
# will try to switch to the user specified by the User configuration option instead.
# Has no effect if started under a regular user.
# 0 - do not allow
# 1 - allow
#
# Mandatory: no
# Default:
# AllowRoot=0

### Option: User
# Drop privileges to a specific, existing user on the system.
# Only has effect if run as 'root' and AllowRoot is disabled.
#
# Mandatory: no
# Default:
# User=zabbix

### Option: Include
# You may include individual files or all files in a directory in the configuration file.
# Installing Zabbix will create include directory in /usr/local/etc, unless modified during the compile time.
#
# Mandatory: no
# Default:
# Include=

# Include=/usr/local/etc/zabbix_agentd.userparams.conf
# Include=/usr/local/etc/zabbix_agentd.conf.d/
# Include=/usr/local/etc/zabbix_agentd.conf.d/*.conf

####### USER-DEFINED MONITORED PARAMETERS #######

### Option: UnsafeUserParameters
# Allow all characters to be passed in arguments to user-defined parameters.
# 0 - do not allow
# 1 - allow
#
# Mandatory: no
# Range: 0-1
# Default:
UnsafeUserParameters=1

### Option: UserParameter
# User-defined parameter to monitor. There can be several user-defined parameters.
# Format: UserParameter=<key>,<shell command>
# See 'zabbix_agentd' directory for examples.
#
# Mandatory: no
# Default:
# UserParameter=

####### LOADABLE MODULES #######

### Option: LoadModulePath
# Full path to location of agent modules.
# Default depends on compilation options.
#
# Mandatory: no
# Default:
# LoadModulePath=${libdir}/modules

### Option: LoadModule
# Module to load at agent startup. Modules are used to extend functionality of the agent.
# Format: LoadModule=<module.so>
# The modules must be located in directory specified by LoadModulePath.
# It is allowed to include multiple LoadModule parameters.
#
# Mandatory: no
# Default:
# LoadModule=

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
shell > ansible-playbook /etc/ansible/install_zabbix_agent.yml

PLAY [mini] *******************************************************************

GATHERING FACTS ***************************************************************
ok: [129.139.153.78]
ok: [155.139.190.94]

TASK: [install_zabbix_agent | Install Software] *******************************
changed: [155.139.190.94] => (item=libcurl-devel)
changed: [129.139.153.78] => (item=libcurl-devel)

TASK: [install_zabbix_agent | Create Zabbix User] *****************************
changed: [129.139.153.78]
changed: [155.139.190.94]

TASK: [install_zabbix_agent | Copy Zabbix.tar.gz] *****************************
changed: [129.139.153.78]
changed: [155.139.190.94]

TASK: [install_zabbix_agent | Uncompression Zabbix.tar.gz] ********************
changed: [129.139.153.78]
changed: [155.139.190.94]

TASK: [install_zabbix_agent | Copy Zabbix Start Script] ***********************
changed: [155.139.190.94]
changed: [129.139.153.78]

TASK: [install_zabbix_agent | Copy Zabbix Config File] ************************
changed: [129.139.153.78]
changed: [155.139.190.94]

TASK: [install_zabbix_agent | Modify Zabbix Dir Permisson] ********************
changed: [155.139.190.94]
changed: [129.139.153.78]

TASK: [install_zabbix_agent | Start Zabbix Service] ***************************
changed: [129.139.153.78]
changed: [155.139.190.94]

TASK: [install_zabbix_agent | Add Boot Start Zabbix Service] ******************
changed: [129.139.153.78]
changed: [155.139.190.94]

PLAY RECAP ********************************************************************
155.139.190.94 : ok=10 changed=9 unreachable=0 failed=0
129.139.153.78 : ok=10 changed=9 unreachable=0 failed=0

## 关注一下,启动脚本跟配置文件中变量的引用。
## 完成安装,可以去客户机检查效果了 !
--------------------本文结束,感谢您的阅读--------------------

本文标题:ansible自动化运维详细教程及playbook详解

文章作者:弓昭

发布时间:2018年12月21日 - 20:01

最后更新:2020年04月08日 - 22:20

原始链接:https://gongzhao1.gitee.io/ansible自动化运维详细教程及playbook详解/

联系邮箱:gongzhao1@foxmail.com