Ansible之playbook的使用总结

之前详细介绍了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:
     command echo  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
[root@ansible-server ~] # vim /etc/ansible/test.yaml
- hosts: 172.16.60.213
   tasks:
     - name: Install Rsync
       yum: name= rsync  state=installed
 
playbook检查方法
[root@ansible-server ~] # ansible-playbook --syntax-check /etc/ansible/test.yaml
 
playbook:  /etc/ansible/test .yaml
[root@ansible-server ~] # 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) 目录规划
[root@m01 ~] # mkdir /etc/ansible/ansible_playbook/{file,conf,scripts} -p
[root@m01 ~] # tree /etc/ansible/ansible_playbook/
/etc/ansible/ansible_playbook/
├── conf
└──  file
└── scripts
 
3)  rsync 配置文件
准备对应的配置文件存放至 /etc/ansible/ansible_playbook/conf/
[root@m01 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
[root@m01 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软件包
[root@m01 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实时同步的配置文件
[root@m01 ansible_playbook] # cat /etc/ansible/ansible_playbook/conf/confxml.xml.nfs
 
7) 基础环境部署
基础环境:所有机器统一的配置
需要关闭firewalld以及selinux、epel仓库、 ssh 端口、优化基础配置
需要安装 rsync 和nfs-utils
准备www用户
需要准备 /etc/rsync .pass密码文件
需要准备全网备份脚本
 
基础的playbook剧本
[root@m01 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
配置邮箱->邮箱的发件人->校验的脚本
 
[root@m01 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 (当修改了配置,触发重载操作)
创建目录,授权
启动
 
[root@m01 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
解压,改名,配置
启动
 
[root@m01 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共享的目录
 
[root@m01 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
[root@m01 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的挂载
测试实时同步

猜你喜欢

转载自www.cnblogs.com/jians/p/11940744.html