• 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   
  • 相关阅读:
    在MaxCompute中配置Policy策略遇到结果不一致的问题
    通过DataWorks数据集成归档日志服务数据至MaxCompute进行离线分析
    阿里小二的日常工作要被TA们“接管”了!
    2018年DDoS攻击全态势:战胜第一波攻击成“抗D” 关键
    基于OSS+DataLakeAnalytics+QuickBI的Serverless的查询分析和可视化BI
    威胁快报|首爆,新披露Jenkins RCE漏洞成ImposterMiner挖矿木马新“跳板”
    Lesson 7 Nehe
    Lesson 7 Nehe
    Lesson 7 Nehe
    Lesson 6 Nehe
  • 原文地址:https://www.cnblogs.com/itwangqiang/p/13656866.html
Copyright © 2020-2023  润新知