之前詳細介紹了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的掛載
測試實時同步
|