Ansible之playbook的使用总结

逆时针 2019-12-05

之前详细介绍了Ansible的安装, 配置, 以及Ansible常用模块的使用. 下面对Ansible的playbook用法做一小结.

为什么引入playbook?
一般运维人员完成一个任务, 比如安装部署一个httpd服务会需要多个模块(一个模块也可以称之为task)提供功能来完成。而playbook就是组织多个task的容器,它的实质就是一个文件,有着特定的组织格式,它采用的语法格式是YAML(Yet Another Markup Language)。YAML语法能够简单的表示散列表,字典等数据结构。简单来说, playbook是由一个或多个模块组成的,使用多个不同的模块,完成一件事情。 

Ansible核心功能
-  pyYAML用于ansible编写剧本所使用的语言格式(saltstack---python);
-  rsync-ini语法, sersync-xml语法, nsible-pyYAML语法;
-  paramiko远程连接与数据传输;
-  Jinja2用于编写ansible的模板信息;

YAML三板斧
缩进: YAML使用一个固定的缩进风格表示层级结构,每个缩进由两个空格组成, 不能使用tabs;
冒号: 以冒号结尾的除外,其他所有冒号后面所有必须有空格;
短横线: 表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一列表;

YAML基本语法
列表:每一个列表成员前面都要有一个短横线和一个空格

1
2
3
4
5
6
7
8
fruits:
    - Apple
    - Orange
    - Strawberry
    - Mango
 
或者:
fruits: [‘Apple‘‘Orange‘‘Strawberry‘‘Mango‘]

字典:每一个成员由键值对组成,注意冒号后面要有空格

1
2
3
4
5
6
martin:
    name: Martin D‘vloper
    job: Developer
    skill: Elite
或者
martin: {name: Martin D‘vloper, job: Developer, skill: Elite}

列表和字典可以混合使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-  martin:
    name: Martin D‘vloper
    job: Developer
    skills:
      - python
      - perl
      - pascal
-  tabitha:
    name: Tabitha Bitumen
    job: Developer
    skills:
      - lisp
      - fortran
      - erlang

playbook基础组件
Hosts:运行执行任务(task)的目标主机
remote_user:在远程主机上执行任务的用户
tasks:任务列表
handlers:任务,与tasks不同的是只有在接受到通知时才会被触发
templates:使用模板语言的文本文件,使用jinja2语法。
variables:变量,变量替换{{ variable_name }}

整个playbook是以task为中心,表明要执行的任务。hosts和remote_user表明在哪些远程主机以何种身份执行。其他组件让其能够更加灵活。下面介绍下这些插件:

1.  variable
变量定义在资产 (inventory) 中, 默认就是/etc/ansible/hosts文件中

1
2
3
4
5
6
7
8
9
10
11
12
主机变量:
192.168.200.136 http_port=808 maxRequestsPerChild=808
192.168.200.137 http_port=8080 maxRequestsPerChild=909
 
主机组变量:
[websers]
192.168.200.136
192.168.200.137
 
[websers:vars] 
ntp_server=ntp.exampl.com
proxy=proxy.exampl.com

变量定义在playbook中

1
2
3
- hosts: webservers
  vars:
    http_port: 80

使用facts变量

1
2
3
4
facts变量是由setup模块获取远程主机的信息。
 
用法:
# ansible 192.168.200.136 -m setup

在roles中定义变量, 这个后面会介绍到.

ansible-playbook 命令中传入参数

1
2
使用 -e选项传入参数
# ansible-playbook 192.168.200.136 -e "httpd_port=808" httpd04.yml

变量的引用

1
{{ var_name }}

2.  templates
它是一个模块功能,与copy不同的是他的文本文件采用了jinga2语法,jinga2基本语法如下:

1
2
3
4
5
6
7
8
9
10
11
12
字面量:
  字符串:使用单引号或双引号
  数字:整型,浮点数
  列表:{item1,item2,...}
  字典:{key1:value1,key2:value2,...}
  布尔型:true/false
算术运算:
  +,-,*,/,//,%,**
比较运算:
  ==,!=,>,>=,<,<=
逻辑运算:
  and,or,not

注意:template只能在palybook中使用。

3.  tasks
执行的模块命令

1
2
3
4
5
6
7
8
9
10
11
12
13
格式:
  action:模块参数(此种方式只在较新的版本中出现)
  module:参数(已键值对的形式出现)
 
每一个task都有一个名称,用于标记此任务。任务示例:
  name: install httpd
  yum: name=httpd state=present
 
注意:shell和command没有参数,可在后面直接跟命令
  shell: ss -tnl | grep :80
 
1)某任务的运行状态为changed后,可通过相应的notify通知相应的handlers
2)任务可以通过tags打标签,然后通过palybook命令-t选项调用.

playbook调用方式

用法:
ansible-playbook  <filename.yml> ... [options]

<filename.yml>: yaml格式的playbook文件路径,必须指明
[options]: 选项

-C, --check:并不在远程主机上执行,只是测试。
-i PATH, --inventory=PATH:资产的文件路径
--flush-cache:清楚fact缓存
--list-hosts:列出匹配的远程主机,并不执行任何动作
-t, TAGS, --tags=TAGS:运行指定的标签任务
--skip-tags:跳过指定的notify,后面详细介绍。

palybook书写格式

1
2
3
4
- hosts: 172.16.60.211                #处理指定服务器.   - (空格)hosts:(空格)172.16.20.211
  task:                               #剧本所要干的事情; (空格)(空格)task:
  - name:                             #(两个空格)-(空格)name:
    commandecho hello clsn linux    #(四个空格)command:(空格)

palybook格式示例

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 /etc/ansible/test.yaml
- hosts: 172.16.60.213
  tasks:
    - name: Install Rsync
      yum: name=rsync state=installed
 
playbook检查方法
[ ~]# ansible-playbook --syntax-check /etc/ansible/test.yaml
 
playbook: /etc/ansible/test.yaml
[ ~]# ansible-playbook -C /etc/ansible/test.yaml
 
PLAY [172.16.60.213] *******************************************************************************************************************
 
TASK [Gathering Facts] *****************************************************************************************************************
ok: [172.16.60.213]
 
TASK [Install Rsync] *******************************************************************************************************************
ok: [172.16.60.213]
 
PLAY RECAP *****************************************************************************************************************************
172.16.60.213              : ok=2    changed=0    unreachable=0    failed=0 
 
上面两个检查命令, 第一个是进行playbook剧本配置信息语法检查; 第二个是模拟playbook剧本执行(彩排)

palybook剧本文件示例

ansible-playbook编写内容扩展剧本任务编写多个任务

1
2
3
4
5
6
- hosts: all
  tasks:
    - name: restart-network
      cron: name=‘restart network‘ minute=00 hour=00 job=‘/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1‘
    - name: sync time
      cron: name=‘sync time‘ minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"

剧本编写内容扩展:剧本任务编写多个主机

1
2
3
4
5
6
7
8
9
10
11
- hosts: 172.16.60.7
  tasks:
    - name: restart-network
      cron: name=‘restart network‘ minute=00 hour=00 job=‘/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1‘
    - name: sync time
      cron: name=‘sync time‘ minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"
 
- hosts: 172.16.60.31
  tasks:
    - name: show ip addr to file
      shell: echo $(hostname -i) >> /tmp/ip.txt

playbook剧本编写方式
-  多主机单任务编写方式
-  多主机多任务编写方式
-  不同主机多任务编写方式

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
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
1) 机器环境
角色                   外网ip                      内网ip                           部署软件
m01                  eth0:10.0.0.61         eth1:172.16.1.61         ansible
backup              eth0:10.0.0.41         eth1:172.16.1.41         rsync
nfs                    eth0:10.0.0.31          eth1:172.16.1.31         nfs、Sersync
web01               eth0:10.0.0.7           eth1:172.16.1.7            httpd
 
2) 目录规划
[ ~]# mkdir /etc/ansible/ansible_playbook/{file,conf,scripts} -p
[ ~]# tree /etc/ansible/ansible_playbook/
/etc/ansible/ansible_playbook/
├── conf
└── file
└── scripts
 
3) rsync配置文件
准备对应的配置文件存放至/etc/ansible/ansible_playbook/conf/
[ conf]# cat /etc/ansible/ansible_playbook/conf/rsyncd.conf
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file /etc/rsync.password
log file /var/log/rsyncd.log
#####################################
 
[backup]
path = /backup
[data]
path = /data
 
4) nfs配置文件
准备nfs配置文件exports
[ ansible_playbook]# cat /etc/ansible/ansible_playbook/conf/nfs_exports
/data/ 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
 
5) Sersync软件包
下载Sersync软件包
[ ansible_playbook]# ll /etc/ansible/ansible_playbook/file/
-rw-r--r-- 1 root root 727290 Aug  1 12:04 sersync.tar.gz
 
6) sersync配置文件
准备sersync实时同步的配置文件
[ ansible_playbook]# cat /etc/ansible/ansible_playbook/conf/confxml.xml.nfs
 
7) 基础环境部署
基础环境:所有机器统一的配置
需要关闭firewalld以及selinux、epel仓库、ssh端口、优化基础配置
需要安装rsync和nfs-utils
准备www用户
需要准备/etc/rsync.pass密码文件
需要准备全网备份脚本
 
基础的playbook剧本
[ ansible_playbook]# cat base.yaml
- hosts: all
  tasks:
    - name: Install Epel Repos
      get_url: url=http://mirrors.aliyun.com/repo/epel-7.repo dest=/etc/yum.repos.d/epel.repo
 
    - name: Install Rsync Nfs-Utils
      yum: name=rsync,nfs-utils state=installed
 
    - name: Create Group WWW
      group: name=www gid=666
 
    - name: Create User WWW
      user: name=www uid=666 group=666 create_home=no shell=/sbin/nologin
 
    - name: Create Rsync_Client_Pass
      copy: content=‘1‘ dest=/etc/rsync.pass mode=600
 
    - name: Create Scripts Directory
      file: path=/server/scripts recurse=yes state=directory
 
    - name: Push File Scripts
      copy: src=./scripts/rsync_backup_md5.sh dest=/server/scripts/
 
    - name: Crontable Scripts
      cron: name="backup scripts" hour=01 minute=00 job="/bin/bash /server/scripts/rsync_backup_md5.sh &>/dev/null"
 
8) 应用环境:Rsync
安装rsync
配置rsync(配置变更,一定要进行重载操作)
创建虚拟用户,权限调整
创建目录/data/  /backup
启动rsync
配置邮箱->邮箱的发件人->校验的脚本
 
[ ansible_playbook]# cat rsync.yaml
- hosts: backup
  tasks:
    - name: Installed Rsync Server
      yum: name=rsync,mailx state=installed
 
    - name: configure Rsync Server
      copy: src=./conf/rsyncd.conf dest=/etc/rsyncd.conf
      notify: Restart Rsync Server
 
    - name: Create Virt User
      copy: content=‘rsync_backup:1‘ dest=/etc/rsync.password mode=600
 
    - name: Create Data
      file: path=/data state=directory recurse=yes owner=www group=www mode=755
 
    - name: Create Backup
      file: path=/backup state=directory recurse=yes owner=www group=www mode=755
 
    - name: Start RsyncServer
      service: name=rsyncd state=started enabled=yes
 
    - name: Push Check Scripts
      copy: src=./scripts/rsync_check_backup.sh dest=/server/scripts/
 
    - name: Crond Check Scripts
      cron: name="check scripts" hour=05 minute=00 job="/bin/bash /server/scripts/rsync_check_backup.sh &>/dev/null"
 
9)  应用环境:NFS
安装nfs-utils
配置nfs (当修改了配置,触发重载操作)
创建目录,授权
启动
 
[ ansible_playbook]# cat nfs.yaml
- hosts: nfs
  tasks:
    - name: Installed Nfs Server
      yum: name=nfs-utils state=installed
 
    - name: Configure Nfs Server
      copy: src=./conf/exports dest=/etc/exports
      notify: Restart Nfs Server
 
    - name: Create Share Data
      file: path=/data state=directory recurse=yes owner=www group=www mode=755
 
    - name: Start Nfs Server
      service: name=nfs-server state=started enabled=yes
 
  handlers:
    - name: Restart Nfs Server
      service: name=nfs-server state=restarted
 
10) 应用环境:Sersync
下载sersync
解压,改名,配置
启动
 
[ ansible_playbook]# cat sersync.yaml
- hosts: nfs
  tasks:
    - name: Scp Sersync
      copy: src=./file/sersync2.5.4_64bit_binary_stable_final.tar.gz dest=/usr/local/sersync.tar.gz
 
    - name: Zip
      shell: cd /usr/local && tar xf sersync.tar.gz && mv GNU-Linux-x86 sersync
      args:
        creates: /usr/local/sersync
 
    - name: configure Sersync
      copy: src=./conf/confxml.xml dest=/usr/local/sersync/
 
    - name: Start Sersync
      shell: /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
 
11) 应用环境:WEB
挂载nfs共享的目录
 
[ ansible_playbook]# cat web.yaml
- hosts: web
  tasks:
    - name: Mount NFS Server Share Data
      mount: src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=mounted
 
12) 包含include
[ ansible_playbook]# cat mail.yaml
- import_playbook: base.yaml
- import_playbook: rsync.yaml
- import_playbook: nfs.yaml
- import_playbook: sersync.yaml
- import_playbook: web.yaml
 
13) 操作后测试步骤
快照还原
推送公钥
使用ping模块测试
执行ansible-playbook测试
测试全网备份,测试是否能发邮件,并校验结果
测试nfs的挂载
测试实时同步

相关推荐