虽然可以在一个非常大的文件中编写一个playbook(并且你可能会开始以这种方式学习playbook),但最终你会想要重用文件并开始组织事情。 在Ansible中,有三种方法可以做到这一点:包括(include),导入(import)和角色(roles)。
包含(include)和导入(import)(在Ansible 2.4版中添加)允许用户将大型playbook分解为较小的文件,这些文件可以在多个父级playbook中使用,甚至可以在同一个Playbook中多次使用。
角色不仅可以将任务打包在一起,还可以包含变量,处理程序,甚至模块和其他插件。 与包含和导入不同,角色也可以通过Ansible Galaxy上传和共享。
Ansible有两种可重用内容的操作模式:动态和静态。
在Ansible 2.0中,引入了dynamic包含的概念。 由于以这种方式使所有包含动态的一些限制,在Ansible 2.1中引入了强制包括static的能力。 因为include任务变得过载以包含静态和动态语法,并且因为include的默认行为可能会根据Task上设置的其他选项而改变,所以Ansible 2.4引入了include
与import
的概念。
如果您使用任何import*
任务(import_playbook
,import_tasks
等),它将是static。
如果您使用任何include*
任务(include_tasks
,include_role
等),它将是动态。
裸include
任务(用于任务文件和Playbook级别包含)仍然可用,但现在它被认为是已弃用。
这两种操作模式非常简单:
当谈到Ansible任务选项,如tags
和条件语句(when:
):
Note
角色是一种特殊情况。 在Ansible 2.3之前,角色总是通过特殊情况静态包含在 roles:
内给定play的选项,并且总是在任何其他play任务之前执行(除非使用pre_tasks
)。 角色仍然可以这种方式使用,但是,Ansible 2.3引入了include_role
选项,允许角色与其他任务一起执行。
使用include*
与import*
有一些优点,以及用户在选择使用每个时应考虑的一些权衡:
使用include*
语句的主要优点是循环。 当循环与include一起使用时,包含的任务或角色将对循环中的每个项执行一次。
与import*
语句相比,使用include*
确实存在一些限制:
--list-tags
输出中。--list-tasks
输出中。notify
来触发来自动态包含内的处理程序名称(请参阅下面的注释)。--start-at-task
开始执行动态包含内的任务。与动态包含相比,使用import*
也会有一些限制:
Note
关于使用notify
进行动态任务:仍然可以触发动态包含本身,这将导致包含内的所有任务被运行。
参考