目錄
一、循環迭代任務:
1、簡單循環:
2、循環字典列表:
3、Ansible 2.5 之前的循環關鍵字:
4、在循環中使用 register 變量:
二、條件任務:
1、使用條件句的常見場景:
2、條件任務語法:
(1)when 語句:
(2)常見條件運算:
3、測試多個條件:
三、組合使用循環與條件任務:
一、循環迭代任務:
? ? ? ? 使用循環使得管理員不必編寫使用同一模塊的多個任務。Ansible 支持使用 loop 關鍵字在一組項目上迭代任務 。
1、簡單循環:
????????一個簡單的循環在一個項目( items )列表上迭代一個任務。task 中添加 loop 關鍵字,并將 items 列表進行迭代,其中循環變量 item 保存每次迭代期間使用的值。
? ? ? ? 此外,loop 列表也可以使用變量表示。例如,下圖中的 mail_services 變量包含了需運行服務的列表。
注:有關變量的內容在 Ansible(6)——管理變量中有詳細說明,轉跳鏈接如下:https://blog.csdn.net/m0_68756914/article/details/147026308
2、循環字典列表:
????????循環列表不一定是簡單值列表。
? ? ? ? 以下圖中內容為例,當列表的每個項是字典時,任務的結果是 jane 用戶存在且為組 wheel 的成員,joe 用戶也存在且為組 root 的成員。
注:上圖中的每個字典均有兩個鍵:?name 與 groups ,這兩個鍵的值可以分別通過 item['name'] 與 item['groups'] 變量進行檢索。
3、Ansible 2.5 之前的循環關鍵字:
????????在 Ansible 2.5 之前,playbook 使用前綴為 with_ 的不同 loop 關鍵字,這可能在將來的某個時間節點被取消。
注:Ansible 2.5 以前的任何表示方法,均可以用 loop 替代。
?循環關鍵字 | ? ? 描述 |
---|---|
with_items | ?其行為與簡單列表的 loop 關鍵字相同,但其提供的列表將被扁平化為單極列表 (注:item 循環變量會保存每次迭代過程中使用的列表項) |
with_file | ?需要控制節點文件名列表 (注:item 循環變量會在每次迭代過程中保存文件列表內相應文件的內容) |
with_sequence | ?需要參數以根據數字序列生成值列表 (注:item 循環變量在每次迭代過程中都會保留生成序列中某個生成項的值) |
4、在循環中使用 register 變量:
????????register 關鍵字可用于輸出循環任務的結果。
二、條件任務:
????????Ansible 可以利用條件語句在符合特定條件時執行任務,管理員可利用條件語句來區分不同的受管主機,并根據它們所符合的條件來分配功能角色 。此外,Playbook 變量、注冊的變量和 Ansible 事實也都可通過條件語句來進行測試,可以使用字符串比較、數學運算符和布爾運算等各種運算符。
1、使用條件語句的常見場景:
(1)在變量中定義硬限制(如 min_memory )并將它與受管主機上的可用內存進行比較;
(2)Ansible 捕獲命令的輸出,以確定某一任務在執行進一步操作前是否已經完成。例如,若某一程序運行失敗,則需要跳過批處理;
(3)利用 Ansible 事實來確定受管主機的網絡配置,并且決定要發送的模板文件(例如,網絡綁定或中繼等);
(4)評估 CPU 的數量,來確定如何調節某一 Web 服務器;
(5)將注冊的變量與定義的變量進行比較,以檢查服務的變化。例如,可以以此來驗證文件的 MD5 。
2、條件任務語法:
(1)when 語句:
? ? ? ? when 語句可用于有條件的運行任務,將以要測試的條件作為值,若條件滿足則運行任務,若條件不滿足則跳過該任務。
注:1)最簡單的條件判斷是布爾變量 true / false 、True / False 、yes / no 、1 / 0 ;
? ? ? ?2)when 表達式不屬于模塊,因此必須放在模塊外部;
? ? ? ?3)從 Ansible Core 2.12 起,when 條件語句會始終將字符串視為 true 布爾值。
(2)常見條件運算:
?????運算 | ?????示例 |
---|---|
? 等于(值為字符串) | ? ansible_facts['machine'] == "x86_64" |
? 等于(值為數字) | ? max_memory == 512 |
? 小于 | ? max_memory < 512 |
? 大于 | ? max_memory > 512 |
? 小于等于 | ? max_memory <= 512 |
? 大于等于 | ? max_memory >= 512 |
? 不等于 | ? max_memory != 512 |
? 變量存在 | ? min_memory is defined |
? 變量不存在 | ? min_memory is not defined |
? 布爾值為 true( 1 、True 、yes 、true ) | ? memory_available |
? 布爾值為 false( 0 、False 、no 、false ) | ? not memory_available |
? 第一個變量值存在,且作為第二個變量列表中的值 | ? ansible_facts['distribution'] in supported_distros |
3、測試多個條件:
????????一個 when 語句可用于評估多個值,用戶可以通過使用 and 和 or 關鍵字組合條件,或使用括號分組條件。
(1)任意條件為真時滿足條件語句,使用 or 關鍵字(上圖紅色方框處);
(2)若兩個條件都必須為真才滿足條件語句,則使用 and 關鍵字(上圖黃色方框處)。
注:除上圖示例中的表示方法外,使用 and 關鍵字組合多個條件語句的另一表示方法如下圖:
(3)使用括號可以對條件進行分組,以表達更復雜的條件語句(上圖藍色方框處);
三、組合使用循環與條件任務:
? ? ? ? 循環與條件任務可以組合使用,組合使用 when 和 loop 時,when 語句將對每一個項目都進行處理。
????????上圖中的 ansible.builtin.dnf 模塊在滿足根目錄( / )上掛載的文件系統超過 300000 時,安裝 mariadb-server 軟件包。其中 ansible_facts['mounts'] 事實是一組字典,各代表一個已掛載文件系統的相關事實。上述命令執行時將循環迭代列表中的每一個字典,直到找到兩個條件都為真的已掛載文件系統的字典時,才滿足條件語句。
注:有關事實的內容在 Ansible(7)——管理機密與事實中有詳細說明,轉跳鏈接如下:https://blog.csdn.net/m0_68756914/article/details/147076080