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 引入了
include
和import
的概念。
如果使用任何与 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. include
和 import
的缺陷⚓
使用 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。