playbook-劇本 介紹
playbooks是 一個不同於使用Ansible命令行執行方式的模式,其功能更強大靈活。簡單來說,playbook是一個非常簡單的配置管理和多主機部署系統,不同於任何已經存在的模式,可作爲一個適合部署複雜應用程序的基礎。Playbook可以定製配置,可以按照指定的操作步驟有序執行,支持同步和異步方式。值得注意的是playbook是通過YAML格式來進行描述定義的。
寫個playbook實現測試web節點狀態
[root@ansible ~]# vim ping.yml
--- #固定格式
- name: 檢查主機的連通性 #name的作用添加一個註釋和說明
hosts: web #主機的集合
tasks: #命令的集合
- name: 命令1
ping:
# - name: 命令2
# ping:
[root@ansible ~]# ansible-playbook ping.yml --syntax-check
playbook: ping.yml #表示語法正確
[root@ansible ~]# ansible-playbook ping.yml
PLAY [檢查主機的連通性]
TASK [Gathering Facts]
ok: [web2]
ok: [web1]
TASK [命令1]
ok: [web2]
ok: [web1]
user模塊的使用
利用ansible-doc 模塊名可以查看幫助,找到模塊的例子直接可以使用
[root@ansible ~]#ansible-doc user #查看user模塊的幫助信息
[root@ansible ~]# vim user.yml
---
- name: 創建用戶
hosts: web
tasks:
- name: 創建用戶
user:
name: z3
uid: 1040
group: users
- name: 修改密碼
shell: echo 123 | passwd --stdin z3
[root@ansible ~]# ansible-playbook user.yml
練習1:
- 所有web主機安裝apache
- 修改配置文件的監聽端口爲8080
- 設置默認主頁爲hello world
- 啓動服務
- 設置開機自啓
[root@ansible ~]# vim httpd.yml
---
- name: 部署httpd
hosts: web
tasks:
- name: 安裝httpd
yum:
name: httpd
state: installed
- name: 修改端口爲8080
lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen '
insertafter: '^#Listen '
line: 'Listen 8080'
- name: 修改默認首頁#也可以使用copy模塊
shell: echo 'hello world' > /var/www/html/index.html
- name: 重啓httpd服務
service:
name: httpd
state: restarted
enabled: yes
: ! ansible-doc 模塊名 可以不退出vim查看幫助手冊
: ! ansible-doc 模塊名 可以不退出vim查看幫助手冊
[root@ansible ~]# ansible-playbook httpd.yml --syntax-check
playbook: user.yml
[root@ansible ~]# ansible-playbook httpd.yml
PLAY [部署httpd] ***********************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************
ok: [web1]
ok: [web2]
TASK [安裝httpd] ***********************************************************************************************************************
changed: [web2]
changed: [web1]
TASK [修改端口爲8080] *********************************************************************************************************************
changed: [web2]
changed: [web1]
TASK [修改默認首頁#也可以使用copy模塊] ************************************************************************************************************
changed: [web1]
changed: [web2]
TASK [重啓httpd服務] *********************************************************************************************************************
changed: [web1]
changed: [web2]
PLAY RECAP ***************************************************************************************************************************
web1 : ok=5 changed=4 unreachable=0 failed=0
web2 : ok=5 changed=4 unreachable=0 failed=0
playbook語法進階
vars介紹:
- 在palybook中使用vars 表示使用變量
- 定義變量的格式爲key: value,變量是vars的子層所以要放在第二行寫
- 調用變量的格式爲 “{{value}}”
實例1:
[root@ansible ~]# vim user.yml
---
- name: 添加用戶
hosts: web
vars: #vars表示使用變量
username: l4 #格式爲key:values
tasks:
- name: 添加用戶 "{{username}}" #調用變量用戶"{{變量名}}"
user:
name: "{{username}}"
group: users
- name: 修改密碼
shell: echo 123 | passwd --stdin "{{username}}"
外部向playbook傳參方法:
- palybook裏只需要調用變量,參數由外部傳入,代碼詳情見下圖
- 方法一 利用json語法,-e 表示調用參數
[root@ansible ~]# ansible-playbook user.yml -e’{“username”:“dachui”}’ - 方法二 利用yaml語法
[root@ansible ~]# ansible-playbook user.yml -e @test.yml
[root@ansible ~]#cat test.yml
---
username: jerry
[root@ansible ~]# vim user.yml
---
- name: 添加用戶
hosts: web
tasks:
- name: 添加用戶 "{{username}}" #調用變量用戶"{{變量名}}"
user:
name: "{{username}}"
group: users
- name: 修改密碼
shell: echo 123 | passwd --stdin "{{username}}"
ignore_errors的使用:
- play中只要執行命令的返回值不爲0,就會報錯,tasks停止,可以添加下面
- ignore_errors: True #忽略錯誤,強制返回成功
實例1:
****
Tags介紹:
- 在一個playbook中,我們一般會定義很多個task,如果我們只想執行其中的某一個task或多個task時就可以使用tags標籤功能了
[root@ansible ~]# cat user.yml
---
- name: 修改web集羣
hosts: web
tasks:
- name: 修改配置文件
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.cnf
- name: 修改默認首頁
tags: conf_index #定義標籤
copy: src=index.html dest=/var/www/html/index.html
- name: 重啓服務
service: name=httpd state=restarted enabled=true
[root@ansible ~]# ansible-playbook user.yml -t conf_index //-t 表示 tags標籤
Handlers介紹
- handlers也是一些task的列表,和一般的task並沒有什麼區別。
- 是由通知者進行的notify,如果沒有被notify,則Handlers不會執行,假如被notify了,則-Handlers被執行
- 不管有多少個通知者進行了notify,等到play中的所有task執行完成之後,handlers也只會被執行一次
when和register的使用
- when的值是一個條件表達式,如果條件判斷成立,這個task就執行,如果判斷不成立,則task不執行
- 在task後添加when子句即可使用條件測試
- register用來定義一個變量,來保存變量的值
- 可利用debug將變量裏的值全部顯示出來方便理解
[root@ansible ~]# uptime | awk -F, '{print $3}' | awk -F: '{print $2}'
0.00
[root@ansible ~]# vim user.yml
---
- name: 監控系統負載
hosts: web1
tasks:
- name: 獲取系統負載
shell: "uptime | awk -F, '{print $3}' | awk -F: '{print $2}'"
register: result #將結果保存到result中
- name: 停止httpd服務
service: name=httpd state=stopped
when: result.stdout | float > 0.7 #result.stdout意思是取出標準輸出 float是將結果轉爲整數和0.7比較
- debuge: var=result
驗證:
[root@web1 ~]# awk ‘BEGIN{while(1){}}’ & #寫個死循環觸發系統負載
[root@web1 ~]# watch uptime //持續監控
[root@web1 ~]# uptime
15:03:08 up 6:28, 1 user, load average: 0.71, 0.23, 0.12
with_items
- with_items是palybook標準循環
- 用於迭代一個列表或字典,通過{{item}}獲取每次迭代的值
- 例如創建多個用戶並且要求各個用戶的密碼不同
實例
- name: 添加多個用戶
hosts: web1
tasks:
- name: 添加用戶 "{{item.username}}"
user:
name: "{{item.username}}"
group: "{{item.group}}"
password: "{{item.password | password_hash('sha512')}}"
with_items:
-
username: bob
group: games
password: '123456'
-
username: kenji
group: bin
password: qwer123
-
username: ailisi
group: adm
password: 123qqq...A