Skip to content

04.0 可重用 playbooks

有三种方式让你达到重复使用文件的目的: includes, imports, 和 roles。

includes 和 imports 可以导入多个 playbooks,并且可以在一个 playbook 中导入多次。

roles 可以打包 tasks 、handlers 等等东西,甚至模块或其他插件都可以打包。并且还可以通过 Ansible Galaxy 上传与分享。

具体的使用方法参考这两篇文章:

1. Dynamic vs. Static

对于可重用内容有两种操作模式:动态、静态。

  • Ansible 2.0 引入了 动态 导入的概念,使用的是 include 动作;
  • Ansible 2.1 添加了将引入变为 静态 的能力,使用的是 include 动作,此时将根据导入内容决定是静态还是动态导入;
  • Ansible 2.4 引入了 includeimport 的概念。

如果使用任何与 include* 相关的 task (例如include_tasks, include_role),那么就是动态的;类似的使用 import* 相关的 task 导入就是静态的。

2. 动态和静态之间的不同

操作模式:

  • 动态导入在运行时遇到该 task 时进行处理;
  • 在 Playbook 解析期间会预处理所有静态导入。

作用于 task options 的情况:

  • 动态导入: task options 只在它被计算时才应用到动态任务,并且不会被复制到子任务;
  • 静态导入:父 task options 将被复制到导入中包含的所有子任务。


对于 roles 有点特殊。在 Ansible 2.3 之前,roles 总是通过指定 roles: 选项被静态导入,并且总是在其他 tasks 之前执行(除非使用了 pre_tasks)。 Ansible 2.3 引入了 include_role 选项允许 role 与其他 task 一起执行。

3. includeimport 的缺陷

使用 include* 时相比 import* 的限制:

  • 只存在与动态导入内部的 tags 不会在使用 --list-tags 选项输出时被展示;
  • 只存在与动态导入内部的 tasks 不会在使用 --list-tasks 选项输出时被展示;
  • 不能使用 notify 来触发动态导入内部的 handler ;
  • 不能使用 --start-at-task 在动态导入内部的 task 开始执行。

使用 import* 时相比 include* 的限制:

  • 不能使用循环 Loops
  • 将变量用作目标文件或角色名称时,无法使用 inventory(主机/组变量等)中的变量;
  • 使用 import* 的 handlers 不能通过它们的名字触发,因为导入时将使用导入的任务列表覆盖 handler 的命名任务。

Note

对于动态 tasks 的 notify ,是可以触发 动态导入 本身的,这样会导致执行该导入所有的 tasks。