Ansible Playbook詳解
Playbook 是一個(gè)由一個(gè)或多個(gè) play 組成的文件;play 是針對(duì)特定主機(jī)或主機(jī)組執(zhí)行的一組有序的任務(wù);每個(gè) playbook 必須包含兩部分:
hosts: 運(yùn)行 playbook 的一組主機(jī)
tasks: 需要在主機(jī)上運(yùn)行的任務(wù)
除了這兩個(gè)必須選項(xiàng),還有一些可選項(xiàng)選項(xiàng),也可能需要包含在 play 中,如:
name: play 的名稱,在運(yùn)行該 play 時(shí),會(huì)在運(yùn)行過(guò)程中顯示。
become: 與配置文件中的 become 作用一樣,用于提權(quán),當(dāng)配置文件中禁用提權(quán)時(shí),你想要某個(gè) play 使用提權(quán)的話,你可以在 play 中添加 become。
playbook 以 yaml 格式編寫的,通常以 yml 擴(kuò)展名保存。yaml 格式使用空格縮進(jìn),對(duì)于空格的數(shù)量沒(méi)有特別要求,但需要注意:
同一級(jí)別內(nèi)的元素必須使用相同的縮進(jìn); 對(duì)于子項(xiàng)目,縮進(jìn)必須比父項(xiàng)目多
編寫 playbook
it@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ cat test.yml
---
- name: Install Apache
hosts: servera
tasks:
- name: Install apache httpd
apt:
name: apache2
state: present
- name: Copy using inline content
copy:
content: Welcome to
dest: /var/www/html/index.html
- name: Start apache service
service:
name: apache2
state: started
enabled: yes
Playbook 以 --- 開(kāi)頭,用于標(biāo)記文件開(kāi)始;
第二行的 name 為該 play 的名稱;
第三行的 hosts 表示將要運(yùn)行該 play 的主機(jī);
第四行的 tasks 表示該 play 將要執(zhí)行的具體任務(wù);
通過(guò)縮進(jìn),我們可以看出 tasks 一共分為三個(gè)部分,也就是三個(gè)模塊,每個(gè)模塊由一個(gè) name 開(kāi)表示該模塊的 name,雖然 name 是可選選項(xiàng),但建議寫上,用來(lái)作為對(duì)該模塊執(zhí)行任務(wù)的解釋說(shuō)明,并且 name 的內(nèi)容會(huì)在 playbook 執(zhí)行此模塊時(shí),顯示在執(zhí)行過(guò)程中;
name 下面的是模塊的名稱,在該 play 的 tasks 中一共有三個(gè)模塊:
apt: 用于安裝軟件
copy: 用于復(fù)制文件或內(nèi)容
service: 用于操作 service,如啟動(dòng)服務(wù),重啟服務(wù)等
我們可以通過(guò) ansible-doc 來(lái)獲取更多關(guān)于模塊的信息:
我們可以通過(guò) ansible-doc -l 來(lái)列出所有模塊
t@workstation:~/ansible$ ansible-doc -l
a10_server Manage A10 Networks AX/SoftAX/Thu...
a10_server_axapi3 Manage A10 Networks AX/SoftAX/Thu...
a10_service_group Manage A10 Networks AX/SoftAX/Thu...
a10_virtual_server Manage A10 Networks AX/SoftAX/Thu...
aci_aaa_user Manage AAA users (aaa:User)
... ... ... ...
... ... ... ...
列出的內(nèi)容太多,我們可以通過(guò) grep 進(jìn)行篩選:如,我想查找關(guān)于 apt 相關(guān)的模塊
it@workstation:~$ ansible-doc -l | grep apt
apt Manages apt-packages
apt_key Add or remove an apt key
apt_repo Manage APT repositories via apt-r...
apt_repository Add and remove APT repositories
apt_rpm apt_rpm package manager
fortios_switch_controller_security_policy_captive_portal Names of VLANs that use captive p...
na_ontap_qos_adaptive_policy_group NetApp ONTAP Adaptive Quality of ...
na_ontap_ucadapter NetApp ONTAP UC adapter configura...
nios_naptr_record Configure Infoblox NIOS NAPTR rec...
skydive_capture Module which manages flow capture...
vmware_guest_network Manage network adapters of specif...
通過(guò) ansible-doc Module_Name 獲取模塊相關(guān)的幫助說(shuō)明
it@workstation:~$ ansible-doc apt
> APT (/usr/lib/python3/dist-packages/ansible/modules/packaging/os/apt.py)
Manages `apt' packages (such as for Debian/Ubuntu).
* This module is maintained by The Ansible Core Team
OPTIONS (= is mandatory):
- allow_unauthenticated
Ignore if packages cannot be authenticated. This is useful for
bootstrapping environments that manage their own apt-key setup.
`allow_unauthenticated' is only supported with state:
`install'/`present'
[Default: no]
type: bool
version_added: 2.1
... ... ... ...
... ... ... ...
執(zhí)行 playbook
it@workstation:~/ansible$ ansible-playbook test.yml
BECOME password:
PLAY [Install Apache] ******************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [servera]
TASK [Install apache httpd] ************************************************************************
changed: [servera]
TASK [Copy using inline content] *******************************************************************
changed: [servera]
TASK [Start apache service] ************************************************************************
ok: [servera]
PLAY RECAP *****************************************************************************************
servera : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
由于我們配置了 become,所以在運(yùn)行的時(shí)候會(huì)提示輸入 become 密碼;
在這里,我們可以看到前面說(shuō)的,在執(zhí)行過(guò)程中會(huì)顯示 play 的名稱,告訴你現(xiàn)在執(zhí)行的是那個(gè) play;
每個(gè) play 中會(huì)有一個(gè)默認(rèn)的任務(wù),就是獲取 facts 信息,在 facts 信息中會(huì)保存你計(jì)算機(jī)的系統(tǒng)信息;
然后是三個(gè)在 play 中定義的 task,在執(zhí)行 tasks 時(shí),會(huì)顯示當(dāng)前所執(zhí)行的 task 的名稱,以及執(zhí)行的狀態(tài),如果是 ok,則表示系統(tǒng)狀態(tài)沒(méi)有任何更改,如果是 changed,則表示系統(tǒng)狀態(tài)發(fā)生了改變;
在最后,還有一個(gè)關(guān)于該 playbook 執(zhí)行結(jié)果的匯總,有多少個(gè) changed,有多少個(gè) failed,有多個(gè) skipped 等等;