Ansible_包含和導入playbook文件


一、管理大型的playbook

1️⃣:如果playbook很長或很復雜,我們可以將其分成較小的文件以便於管理

2️⃣:可采用模塊化方式將多個playbook組合為一個主要playbook,或者將文件中的任務列表插入play

 

二、包含或導入文件

1️⃣:Ansible可以使用兩種操作將內容帶入playbook。可以包含內容,也可以導入內容

  • 包含內容是一個動態操作。在playbook運行期間,Ansible會在內容到達時處理所包含的內容
  • 導入內容是一個靜態操作。在運行開始之前,Ansible在最初解析playbook時預處理導入的內容

 

三、導入plyabook

1️⃣:import_playbook指令允許將包含play列表的外部文件導入playbook。換句話說,可以把一個或多個額外playbook文件導入到主playbook文件

2️⃣:由於導入的內容是一個完整的playbook,因此import_playbook功能只能在playbook的頂層使用,不能在play內使用。如果導入多個playbook,則將按順序導入並運行它們

3️⃣:導入兩個額外playbook的主playbook的簡單示例如下所

  • 實例模板:
    [root@localhost project]# cat playbook.yml 
    ---
    - hosts: all
      tasks: 
    - name: install httpd
      import_playbook: http.yml
    
    - name: start httpd
      import_playbook: start_http.yml

 

  • 演示實例
     //在playbook目錄下創創建兩個需要導入的playbook
    [root@localhost project]# cat playbook/install.yml 
    ---
    - hosts: all
      tasks:
        - name: install httpd
          yum:
            name: httpd
            state: present
    [root@localhost project]# cat playbook/start.yml 
    ---
    - hosts: all
      tasks:
        - name: start httpd
          service:
            name: httpd
            state: started
    
     //查看需要執行的playbook文件
    [root@localhost project]# cat play.yml 
    ---
    - hosts: all
      tasks:
    - name: install httpd
      import_playbook: playbook/install.yml
    
    - name: start httpd
      import_playbook: playbook/start.yml
    
     //查看層級關系
    [root@localhost project]# tree .
    .
    ├── inventory
    ├── playbook
    │   ├── install.yml
    │   └── start.yml
    └── play.yml
    
    1 directory, 4 files
    
     //執行playbook
    [root@localhost project]# ansible-playbook play.yml 
    PLAY [all] ****************************************************************************************************************************************************************
    
    TASK [Gathering Facts] ****************************************************************************************************************************************************
    ok: [192.168.121.81]
    
    PLAY [all] ****************************************************************************************************************************************************************
    
    TASK [Gathering Facts] ****************************************************************************************************************************************************
    ok: [192.168.121.81]
    
    TASK [install httpd] ******************************************************************************************************************************************************
    changed: [192.168.121.81]
    
    PLAY [all] ****************************************************************************************************************************************************************
    
    TASK [Gathering Facts] ****************************************************************************************************************************************************
    ok: [192.168.121.81]
    
    TASK [start httpd] ********************************************************************************************************************************************************
    changed: [192.168.121.81]
    
    PLAY RECAP ****************************************************************************************************************************************************************
    192.168.121.81             : ok=5    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

 

四、包含和導入任務

1、導入任務文件

1️⃣:可以使用import_tasks功能將任務文件靜態導入playbook內的play中。

2️⃣:導入任務文件時,在解析該playbook時將直接插入該文件中的任務。

3️⃣:Playbook中的import_tasks的位置控制插入任務的位置以及運行多個導入的順序

  • 簡單實例模板:
    [root@localhost project]# cat playbook.yml 
    ---
    - hosts: all
      tasks:
        - name: install httpd
          import_tasks: http.yml
    
        - name: start httpd
          import_tasks: start_http.yml

 

  • 演示實例一:
     //查看playbook目錄下寫的需要導入的任務文件
    [root@localhost project]# cat playbook/install.yml 
    - name: install httpd
      yum:
        name: httpd
        state: present
    [root@localhost project]# cat playbook/start.yml 
    - name: start httpd
      service:
        name: httpd
        state: started
    
     //查看playbook主要執文件
    [root@localhost project]# cat play.yml 
    ---
    - hosts: all
      tasks:
        - name: install httpd
          import_tasks: playbook/install.yml
    
        - name: start httpd
          import_tasks: playbook/start.yml
    
    
     //查看層級關系
    [root@localhost project]# tree .
    .
    ├── inventory
    ├── playbook
    │   ├── install.yml
    │   └── start.yml
    └── play.yml
    
    1 directory, 4 files
    
     //執行playbook
    [root@localhost project]# ansible-playbook play.yml 
    PLAY [all] ****************************************************************************************************************************************************************
    
    TASK [Gathering Facts] ****************************************************************************************************************************************************
    ok: [192.168.121.81]
    
    TASK [install httpd] ******************************************************************************************************************************************************
    changed: [192.168.121.81]
    
    TASK [start httpd] ********************************************************************************************************************************************************
    changed: [192.168.121.81]
    
    PLAY RECAP ****************************************************************************************************************************************************************
    192.168.121.81             : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
  • 注意import_tasks和import_playbook處於不同的級別;import_playbook是與tasks平級;import_tasks則是tasks的子任務

 

  • 演示實例二:使用import_playbookimport_tasks混合使用
     //查看playbook目錄下的需要導入的playbook文件和任務文件
    [root@localhost project]# cat playbook/install.yml 
    - name: install httpd
      yum:
          name: httpd
          state: present
    [root@localhost project]# cat playbook/start.yml 
    ---
    - hosts: all
      tasks:
        - name: start httpd
          service:
             name: httpd
             state: started
    
    
     //查看主要執行文件
    [root@localhost project]# cat play.yml 
    ---
    - hosts: all
      tasks:
        - name: install httpd
          import_tasks: playbook/install.yml
    
    - name: start httpd
      import_playbook: playbook/start.yml
    
      //查看層級關系
    [root@localhost project]# tree .
    .
    ├── inventory
    ├── playbook
    │   ├── install.yml
    │   └── start.yml
    └── play.yml
    
    1 directory, 4 files
    
     //執行play
    [root@localhost project]# ansible-playbook play.yml 
    PLAY [all] ****************************************************************************************************************************************************************
    
    TASK [Gathering Facts] ****************************************************************************************************************************************************
    ok: [192.168.121.81]
    
    TASK [install httpd] ******************************************************************************************************************************************************
    changed: [192.168.121.81]
    
    PLAY [all] ****************************************************************************************************************************************************************
    
    TASK [Gathering Facts] ****************************************************************************************************************************************************
    ok: [192.168.121.81]
    
    TASK [start httpd] ********************************************************************************************************************************************************
    changed: [192.168.121.81]
    
    PLAY RECAP ****************************************************************************************************************************************************************
    192.168.121.81             : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
  • 注意:使用混合模式的時候,import_playbook不能是第一個執行,必須從第二個開始執行

 

4️⃣:導入任務文件時,在解析該playbook時將直接插入該文件中的任務。由於import_tasks在解析playbook時靜態導入任務,因此對其工作方式有一些影響

  • 使用import_tasks功能時,導入時設置的when等條件語句將應用於導入的每個任務
  • 無法將循環用於import_tasks功能
  • 如果使用變量來指定要導入的文件的名稱,則將無法使用主機或組清單變量

 

2、包含任務文件

1️⃣:可以使用include_tasks功能將任務文件動態導入playbook內的play

  • 簡單實例模板:
    [root@localhost project]# cat playbook.yml 
    ---
    - hosts: all
      tasks:
        - name: install httpd
          include_tasks: install_httpd.yml

 

2️⃣:在play運行並且這部分play到達前,include_tasks功能不會處理playbook中的內容

3️⃣:Playbook內容的處理順序會影響包含任務功能的工作方式

  • 使用include_tasks功能時,包含時設置的when等條件語句將確定任務是否包含在play中
  • 如果運行ansible-playbook --list-tasks以列出playbook中的任務,則不會顯示已包含任務文件中的任務
  • 相比之下,import_tasks功能不會列出導入任務文件的任務,而列出已導入任務文件中的各個任務
  • 不能使用ansible-playbook --start-at-task從已包含任務文件中的任務開始執行playbook
  • 不能使用notify語句觸發已包含任務文件中的處理程序名稱。可以在包含整個任務文件的主playbook中觸發處理程序,在這種情況下,已包含文件中的所有任務都將運行

 

3、任務文明的用例

  1. 如果新服務器需要全面配置,則管理員可以創建不同的任務集合,分別用於創建用戶、安裝軟件包、配置服務、配置特權、設置對共享文件系統的訪問權限、強化服務器、安裝安全更新,以及安裝監控代理等。每一任務集合可通過單獨的自包含任務文件進行管理
  2. 如果服務器由開發人員、系統管理員和數據庫管理員統一管理,則每個組織可以編寫自己的任務文件,再由系統經理進行審核和集成
  3. 如果服務器要求特定的配置,它可以整合為按照某一條件來執行的一組任務。換句話說,僅在滿足特定標准時才包含任務
  4. 如果一組服務器需要運行某一項/組任務,則它/它們可以僅在屬於特定主機組的服務器上運行

 

4、管理任務文件

為方便管理,可以創建專門用於任務文件的目錄,並將所有任務文件保存在該目錄中。然后playbook就可以從該目錄包含或導入任務文件。這樣就可以構建復雜的playbook,同時簡化其結構和組件的管理

 

五、為外部play和任務定義變量

1️⃣:使用Ansible的導入和包含功能將外部文件中的play或任務合並到playbook中極大地增強了在Ansible環境中重用任務和playbook的能力

  • 演示實例:
     //查看所需要的導入的外部任務文件
    [root@localhost project]# cat playbook/install.yaml 
    - name: install {{ package }}
      yum:
        name: "{{ package }}"
        state: present
    [root@localhost project]# cat playbook/service.yaml 
    - name: start {{ package }} service
      service:
        name: "{{ package }}"
        state: started
    
     //查看變量文件
    [root@localhost project]# cat files/vars.yaml 
    package: httpd
    
     //查看主要執行文件
    [root@localhost project]# cat playbook/main.yaml 
    ---
    - hosts: all
      vars_files:
        ../files/vars.yaml
      tasks:
        - import_tasks: install.yaml
        - import_tasks: service.yaml
    
     //執行playbook
    [root@localhost project]# ansible-playbook  playbook/main.yaml
    
    PLAY [all] ****************************************************************************************************************************************************************
    
    TASK [Gathering Facts] ****************************************************************************************************************************************************
    ok: [192.168.121.81]
    
    TASK [install httpd] ******************************************************************************************************************************************************
    changed: [192.168.121.81]
    
    TASK [start httpd service] ************************************************************************************************************************************************
    changed: [192.168.121.81]
    
    PLAY RECAP ****************************************************************************************************************************************************************
    192.168.121.81             : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

 

2️⃣:使用相同的技術使play文件更具有可重用性。將play文件合並到playbook中時,傳遞變量以用於執行該play

  • 演示實例:
      //查看需要導入的外部playbook文件
    [root@localhost project]# cat playbook/mariadb.yaml 
    ---
    - hosts: all
      vars_files:
        ../files/vars.yaml
      tasks:
        - name: install {{ package }}
          yum:
            name: "{{ package }}"
            state: present
    
    
     //查看變量文件
    [root@localhost project]# cat files/vars.yaml 
    package: mariadb-server
    
     //查看主要執行的文件
    [root@localhost project]# cat playbook/main.yaml 
    - name: isntall package
      import_playbook: mariadb.yaml
    
    
     //執行play
    [root@localhost project]# ansible-playbook playbook/main.yaml 
    
    PLAY [all] ****************************************************************************************************************************************************************
    
    TASK [Gathering Facts] ****************************************************************************************************************************************************
    ok: [192.168.121.81]
    
    TASK [install mariadb-server] *********************************************************************************************************************************************
    changed: [192.168.121.81]
    
    PLAY RECAP ****************************************************************************************************************************************************************
    192.168.121.81             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM