一、管理大型的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

Ansible_包含和导入playbook文件的更多相关文章

  1. SharePoint 2013报错之“指定的文件不是有效的电子表格或者没有包含要导入的数据”

    当你尝试用SharePoint 2013中的“导入电子表格”功能时,可能会遇到报错“指定的文件不是有效的电子表格或者没有包含要导入的数据” 解决方法:只需要将你的SharePoint网址添加到浏览器的 ...

  2. java调用sqlldr导入csv文件数据到临时表

    package cn.com.file;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File; ...

  3. 导入excel2007文件问题

    基于oledb方式导入excel2007文件时,使用如下链接字符串: string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Sour ...

  4. 导入.pch文件

    Xcode5中创建一个工程的时候,系统会自动创建一个以以工程名为名字的pch(Precompile Prefix Header)文件,开发的过程中可以将广泛使用的头文件以及宏包含在该文件下,编译器就会 ...

  5. 解决ubuntu server mysql load data infile 导入本地文件ERROR 1148 (42000)错误。

    问题:在ubuntu server 上使用apt-get 安装完 mysql 使用 load data infile 出现错误,错误代码如下: ERROR (): The used command i ...

  6. android NDK编译(导入).a文件和编译多个so文件(转)

    源:android NDK编译(导入).a文件和编译多个so文件 一.编译一个静态库 libstatic_android.a LOCAL_PATH := $(call my-dir) include ...

  7. Perl导入代码文件

    从函数复用开始:eval和do执行perl文件 当我们定义了一个功能比较通用的子程序,比如获取数值的绝对值.想要到处使用这个子程序,就得不断复制.粘贴这段绝对值函数的定义文本.显然,这是不太理想的方式 ...

  8. 从navicat中导入sql文件过大:Got a packet bigger than 'max_allowed_packet' bytes

    失败背景:刚才通过navicat向本地mysql数据库中导入sql文件.第一个sql文件(多个表)大小为967M,导入成功: 第二个sql(单个表)大小为50.1M,导入失败. 1.在navicat中 ...

  9. 【其他】【navicat】【1】navicat导入txt文件中文乱码问题解决

    正文: TXT文件默认编码为ANSI,另存为编码为UTF-8的文本文件即可 备注: 1,一般需要导入的数据都是一张excel表,需要将excel表另存为“文本文件(制表符分隔)(*.txt)”保存类型 ...

随机推荐

  1. 2021 小白版,360 行行行转 IT

    hey guys ,我是 cxuan,这一篇文章我就要和你聊聊编程如何学习,这一篇文章涉及的内容简直太多了,我将从入门开始,一步一步到如何提高,然后到一些学习的相关问题,还有一些计算机相关的术语等,干 ...

  2. ISP算法:深入聊聊lens shading

    一.简介 关于什么是成像中的lens shading这里直接引用一句英文的definition:"The term shading describes the light fall-off ...

  3. 【2w字干货】ArrayList与LinkedList的区别以及JDK11中的底层实现

    1 概述 本文主要讲述了ArrayList与LinkedList的相同以及不同之处,以及两者的底层实现(环境OpenJDK 11.0.10). 2 两者区别 在详细介绍两者的底层实现之前,先来简单看一 ...

  4. python进阶(16)深入了解GIL锁(最详细)

    前言 python的使用者都知道Cpython解释器有一个弊端,真正执行时同一时间只会有一个线程执行,这是由于设计者当初设计的一个缺陷,里面有个叫GIL锁的,但他到底是什么?我们只知道因为他导致pyt ...

  5. 【MySQL】实现线上千万数据表添加字段操作以及缓存刷新

    需求背景: 由于业务需求,需要在线上用户表添加渠道字段,用于区分不同渠道注册的用户,目前该表有20+个字段,8个索引 线上用户数据大概1500W左右,需要不停机增加数据库字段,同时需要刷新Redis缓 ...

  6. hdu1914 稳定婚姻问题

               稳定婚姻问题就是给你n个男的,n个女的,然后给你每个男生中女生的排名,和女生心目中男生的排名,然后让你匹配成n对,使婚姻稳定,假如a和b匹配,c和d匹配,如果a认为d比b好,同时 ...

  7. Linux提权—脏牛漏洞(CVE-2016-5195)

    目录 脏牛漏洞 exp1复现: exp2复现: 脏牛漏洞 脏牛漏洞,又叫Dirty COW,存在Linux内核中已经有长达9年的时间,在2007年发布的Linux内核版本中就已经存在此漏洞.Linux ...

  8. node-redis基本操作

    //npm install redis var redis = require("redis"), client = redis.createClient(); client.se ...

  9. ecloud云主机限速相关配置说明

    目前与云主机限速相关的内容共有三处: neutron qos-xxx命令,通过neutron qos的形式为云主机port绑定相应的网络限速策略(对应弹性公网IP) 通过flavor对云主机进行默认限 ...

  10. java的继承和组合

    继承和组合是java中非常常用的两种创建新类型的方法,两者都能提高代码的复用率. 继承主要是想让子类继承父类的基本特性:组合技术通常用于想在新类中使用现有类的功能,而非它的接口.两者的分别是" ...