1. 程式人生 > >ansible(三) playbook實現及YAML

ansible(三) playbook實現及YAML

playbook是由一個或多個“play” 組成的列表 play的主要功能在於將事先歸併為一組的主機裝扮成事先通過ansible中的task定義好的角色。從根本上來講,所謂task無非是呼叫ansible的一個module。將多個play組織在一個playbook中,即可以讓它們聯同起來按事先編排的機制同唱一臺大戲。 Playbook採用YAML語言編寫  

playbook邏輯關係:

YAML語言簡介

 YAML是一個可讀性高的用來表達資料序列的格式。 YAML參考了其他多種語言,包括: XML、C語言、 Python、 Perl以及電子郵件格式RFC2822等。 Clark Evans在2001年在首次發表了這種語言,另外Ingy döt Net與Oren Ben-Kiki也是這語言的共同設計者。  YAML Ain't Markup Language,即YAML不是XML。不過,在開發的這種語言時, YAML的意思其實是: "Yet Another Markup Language"(仍是一種標記語言)。  特性: YAML的可讀性好 YAML和指令碼語言的互動性好 YAML使用實現語言的資料型別 YAML有一個一致的資訊模型 YAML易於實現 YAML可以基於流來處理 YAML表達能力強,擴充套件性好 更多的內容及規範參見http://www.yaml.org

YAML語法簡介

  •  在單一檔案中,可用連續三個連字號(——)區分多個檔案。另外,還有選擇性的連續三個點號( ... )用來表示檔案結尾
  •  次行開始正常寫Playbook的內容,一般建議寫明該Playbook的功能
  •  使用#號註釋程式碼
  •  縮排必須是統一的,不能空格和tab混用
  •  縮排的級別也必須是一致的,同樣的縮排代表同樣的級別,程式判別配置的級別是通過縮排結合換行來實現的
  •  YAML檔案內容是區別大小寫的, k/v的值均需大小寫敏感
  •  k/v的值可同行寫也可換行寫。同行使用:分隔
  •  v可是個字串,也可是另一個列表
  •  一個完整的程式碼塊功能需最少元素需包括 name: task
  •  一個name只能包括一個task
  •  YAML副檔名通常為yml或yaml

List:列表,其所有元素均使用“-” 打頭

示例: # A list of tasty fruits - Apple - Orange - Strawberry - Mango

Dictionary:字典,通常由多個key與value構成

示例: --- # An employee record name: Example Developer job: Developer skill: Elite 也可以將key:value放置於{}中進行表示,用,分隔多個key:value 示例: --- # An employee record {name: Example Developer, job: Developer, skill: Elite}  

Playbook核心元素

  • Hosts 執行的遠端主機列表
  • Tasks 任務集
  • Varniables 內建變數或自定義變數在playbook中呼叫
  • Templates 模板,可替換模板檔案中的變數並實現一些簡單邏輯的檔案
  • Handlers 和notity結合使用,由特定條件觸發的操作,滿足條件方才執行,否則不執行
  • tags 標籤 指定某條任務執行,用於選擇執行playbook中的部分程式碼。 ansible具有冪等性,因此會自動跳過沒有變化的部分,即便如此,有些程式碼為測試其確實沒有發生變化的時間依然會非常地長。此時,如果確信其沒有變化,就可以通過tags跳過此些程式碼片斷

playbook基礎元件 Hosts:

playbook中的每一個play的目的都是為了讓某個或某些主機以某個指定的使用者身份執行任務。 hosts用於指定要執行指定任務的主機,須事先定義在主機清單中 可以是如下形式:

  • one.example.com
  • one.example.com:two.example.com
  • 192.168.1.50
  • 192.168.1.*
  • Websrvs:dbsrvs 兩個組的並集
  • Websrvs:&dbsrvs 兩個組的交集
  • webservers:!phoenix 在websrvs組,但不在dbsrvs組

示例: - hosts: websrvs: dbsrvs  

remote_user:

可用於Host和task中。也可以通過指定其通過sudo的方式在遠 程主機上執行任務,其可用於play全域性或某任務;此外,甚至可以在sudo時使 用sudo_user指定sudo時切換的使用者 - hosts: websrvs remote_user: root tasks: - name: test connection ping: remote_user: magedu sudo: yes 預設sudo為root sudo_user:wang sudo為wang  

task列表和action

  • play的主體部分是task list。 task list中的各任務按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成第一個任務後,再開始第二個任務
  • task的目的是使用指定的引數執行模組,而在模組引數中可以使用變數。模組執行是冪等的,這意味著多次執行是安全的,因為其結果均一致
  • 每個task都應該有其name,用於playbook的執行結果輸出,建議其內容儘可能清晰地描述任務執行步驟。如果未提供name,則action的結果將用於輸出

tasks:任務列表 格式: (1) action: module arguments             (2) module: arguments 建議使用 注意: shell和command模組後面跟命令,而非key=value 某任務的狀態在執行後為changed時,可通過“notify” 通知給相應的handlers 任務可以通過"tags“打標籤,而後可在ansible-playbook命令上使用-t指定進行呼叫 示例: tasks: - name: disable selinux command: /sbin/setenforce 0

如果命令或指令碼的退出碼不為零,可以使用如下方式替代 tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand || /bin/true 或者使用ignore_errors來忽略錯誤資訊: tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand ignore_errors: True  

執行playbook

執行playbook的方式 ansible-playbook <filename.yml> ... [options] 常見選項 --check 只檢測可能會發生的改變,但不真正執行操作 --list-hosts 列出執行任務的主機 --limit 主機列表 只針對主機列表中的主機執行 -v 顯示過程 -vv -vvv 更詳細  

簡單示例:

使用-C選項可用來測試,真正執行時不加-C 

 

--list-host可以顯示對那些主機起作用  #ansible-playbook  test.yml --list-hosts

 若只想對其中某臺主機執行playbook,可以使用--limit #ansible-playbook --limit 192.168.36.6 test2.yml

handlers和notify結合使用觸發條件 Handlers

是task列表,這些task與前述的task並沒有本質上的不同,用於當關注的資源發生變化時,才會採取一定的操作。

Notify

此action可用於在每個play的最後被觸發,這樣可避免多次有改變發生時每次都執行指定的操作,僅在所有的變化發生完成後一次性地執行指定操作。在notify中列出的操作稱為handler,也即notify中呼叫handler中定義的操作。  

示例:當配置檔案發生變化時,才重啟httpd服務,否則不重啟

- hosts: websrvs
remote_user: root
tasks:
- name: Install httpd
yum: name=httpd state=present
- name: Install configure file
copy: src=files/httpd.conf dest=/etc/httpd/conf/
notify: restart httpd
- name: ensure apache is running
service: name=httpd state=started enabled=yes
handlers:
- name: restart httpd
service: name=httpd status=restarted

【handlers和notify之間的關係為多對多,可以有多個notify觸發同一個handlers,也可以有多個notify觸發多個handlers】

標籤tags:

對playbook中的某一動作設定標籤,設定標籤後可單獨執行該標籤的動作。

加選-t conf執行playbook

【可對多個動作新增相同標籤】