目錄
1 playbook介紹
2 YAML語言
2.1語法簡介
2.2數據類型
3 Playbook核心組件
3.1 hosts組件
3.2 remote_user組件
3.3 task列表和action組件
3.4 handlers
3.6 其他組件說明
1 playbook介紹
????????playbook 劇本是由一個或多個"play"組成的列表。
????????play的主要功能在于將預定義的一組主機,裝扮成事先通過ansible中的task定義好的角色。Task實際是調用ansible的一個module,將多個play組織在一個playbook中,即可以讓它們聯合起來,按事先編排的機制執行預定義的動作。
????????playbook文件時采用YAML語言編寫的。
2 YAML語言
2.1語法簡介
- 在單一文件第一行,用連續三個連字號"“"開始,還有選擇性的連續三個點號(.. )用來表示文件的結尾
- 次行開始正常寫Playbook的內容,一般建議寫明該Playbook的功能使用#號注釋代碼
- 縮進必須是統一的,不能空格和tab混用
- 縮進的級別也必須是一致的,同樣的縮進代表同樣的級別,程序判別配置的級別是通過縮進結合換行來實現的
- YAML文件內容是區別大小寫的,key/value的值均需大小寫敏感
- 多個key/value可同行寫也可換行寫,同行使用,分隔
- key后面冒號要加一個空格 比如: key: value
- value可是個字符串,也可是另一個列表YAML文件擴展名通常為 yml或 yaml
2.2數據類型
YAML支持一下常用幾種數據類型:
- 標量:單個的、不可再分的值
- 對象:鍵值對的集合,又稱為映射(mapping)/哈希(hashes)/字典(dictionary)
- 數組:一組按次序排列的值,又稱為序列(sequence)/列表(list)
3 Playbook核心組件
一個playbook 中由多個組件組成,其中所用到的常見組件類型如下:
- Hosts 執行的遠程主機列表
- Tasks 任務集,由多個task的元素組成的列表實現,每個task是一個字典,一個完整的代碼塊功能需最少元素需包括 name和 task,一個name只能包括一個task
- Variables 內置變量或自定義變量在playbook中調用
- Templates 模板,可替換模板文件中的變量并實現一些簡單邏輯的文件
- Handlers 和 notify結合使用,由特定條件觸發的操作,滿足條件方才執行,否則不執行
- tags 標簽 指定某條任務執行,用于選擇運行playbook中的部分代碼。ansible具有幕等性,因此會自動跳過沒有變化的部分,即便如此,有些代碼為測試其確實沒有發生變化的時間依然會非常地長。此時,如果確信其沒有變化,就可以通過tags跳過此些代碼片斷
3.1 hosts組件
????????Hosts:playbook中的每一個play的目的都是為了讓特定主機以某個指定的用戶身份執行任務。hosts用于指定要執行指定任務的主機,須事先定義在主機清單中。
3.2 remote_user組件
????????remote_user: 可用于Host和task中。也可以通過指定其通過sudo的方式在遠程主機上執行任務,其可用于play全局或某任務;此外,甚至可以在sudo時使用sudo_user指定sudo時切換的用戶
3.3 task列表和action組件
????????play的主體部分是task list,task list中有一個或多個task,各個task 按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成第一個task后,再開始第二個tasktask的目的是使用指定的參數執行模塊,而在模塊參數中可以使用變量。模塊執行是冪等的,這意味著多次執行是安全的,因為其結果均一致。
????????每個task都應該有其name,用于playbook的執行結果輸出,建議其內容能清晰地描述任務執行步驟。如果未提供name,則action的結果將用于輸出。
忽略ignore_errors:
????????如果一個task出錯,默認將不會繼續執行后續的其它task。
????????利用 ignore_errors: yes 可以忽略此task的錯誤,繼續向下執行playbook其它task。
task兩種格式:
????????action:module arguments? #示例: action: shell wall hello
????????module:arguments? #建議使用? #示例: shell: wall hello
注意:shell和command模塊后跟命令,而非key=value。
3.4 handlers
handlers和notify結合使用觸發條件
????????Handlers 實際上就是一個觸發器是task列表,這些task與前述的task并沒有本質上的不同,用于當關注的資源發生變化時,才會采取一定的操作
notify此action可用于在每個play的最后被觸發
????????這樣可避免多次有改變發生時每次都執行指定的操作,僅在所有的變化發生完成后一次性地執行指定操作。
????????在notify中列出的操作稱為handler,也即notify中調用handler中定義的操作。
????????在系統中,我們修改了服務器的配置文件,這時候就需要重啟操作服務,就可以使用到handlers。配合 notify使用。
在使用handlers的過程中,有以下幾點需要注意:
- handlers只有在其所在的任務被執行時,都會被運行;
- handlers只會在Play的末尾運行一次;如果想在一個Playbook的中間運行handlers,則需要使用meta模塊來實現,例如:- meta: flush_handlers。
- 如果一個Play在運行到調用handlers的語句之前失敗了,那么這個handlers將不會被執行。我們可以使用mega模塊的–force-handlers選項來強制執行handlers,即使在handlers所在Play中途運行失敗也能執行。
3.5 tags組件
????????在playbook文件中,可以利用tags組件,為特定task指定標簽,當在執行playbook時,可以只執行特定tags的task,而非整個playbook文件。
????????可以一個task對應多個tag,也可以多個task對應一個tag。
????????還有另外3個特殊關鍵字用于標簽, tagged , untagged 和 all ,它們分別是僅運行已標記,只有未標記和所有任務。
3.6 其他組件說明
????????某任務的狀態在運行后為changed時,可通過"notify"通知給相應的handlers任務還可以通過"tags"給task 打標簽,可在ansible-playbook命令上使用 -t 指定進行調用。