Documentation

创建可重用的手册

虽然可以在一个非常大的文件中编写一个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引入了includeimport的概念。

如果您使用任何import*任务(import_playbookimport_tasks等),它将是static 如果您使用任何include*任务(include_tasksinclude_role等),它将是动态

include任务(用于任务文件和Playbook级别包含)仍然可用,但现在它被认为是已弃用

静态和动态之间的差异

这两种操作模式非常简单:

  • Ansible在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进行动态任务:仍然可以触发动态包含本身,这将导致包含内的所有任务被运行。

参考

使用Playbooks
查看基本的Playbook语言功能
变量
所有关于剧本中的变量
条件语句
playbook中的条件语句
循环语句
playbook中的循环语句
最佳实践
关于在实际生产中管理playbook的各种提示
Ansible Galaxy
如何在galaxy分享角色,角色管理的角色
GitHub Ansible示例
从GitHub项目源完成playbook文件
邮件列表
有问题吗? 帮帮我? 想法? 止于Google网上论坛列表中