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的掛載
測試實時同步


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM