在ansible playbook中包含来自另一个角色的任务
include tasks from another role in ansible playbook
我正在设计一种带有单独任务的剧本库
所以在通常的角色回购中,我有类似的东西:
roles
├── common
│ └── tasks
│ ├── A.yml
│ ├── B.yml
│ ├── C.yml
│ ├── D.yml
│ ├── login.yml
│ ├── logout.yml
│ └── save.yml
├── custom_stuff_workflow
│ └── tasks
│ └── main.yml
└── other_stuff_workflow
└── tasks
└── main.yml
my main.yml in custom_stuff_workflow 然后包含类似的内容:
---
- include: login.yml
- include: A.yml
- include: C.yml
- include: save.yml
- include: logout.yml
另一个工作流程中的这个:
---
- include: login.yml
- include: B.yml
- include: A.yml
- include: D.yml
- include: save.yml
- include: logout.yml
我找不到一种自然的方法:
一种可行的方法是将所有任务都放在一个角色中并标记相关任务,同时包括 custom_stuff_workflow
我遇到的问题是无法在调用剧本中设置标签:它只能在命令行中设置
因为我正在与公司中的许多人一起分发这个 ansible repo,所以我不能依赖命令行调用(在 yml 中有一个 #!
header 由 [= 处理会很好14=] 命令)
我也可以在每个工作流程中复制相关任务(在上面树中的 common 中),但我不想重复它们
有人可以看到一个解决方案来实现我想要的,而不用在不同的角色上重复任务吗?
我想我的问题的基石是我将任务定义为单独的,它在 ansible 中看起来不自然...
非常感谢
PS:请注意,工作流中的任务必须按特定顺序完成,唯一自然抽象的步骤是登录和 save/logout
PPS:我看过这个问题How do I call a role from within another role in Ansible?,但它没有解决我的问题,因为它调用的是完整角色,而不是角色中任务的子集
是的,Ansible 并不喜欢将任务作为单独的组件。我认为它希望您使用角色,但我明白您为什么不想将角色用于简单、可重用的任务。
我目前看到两种可能的解决方案:
1。将这些任务文件变成角色并使用依赖项
然后你可以做这样的事情,例如custom_stuff_workflow
dependencies:
- { role: login }
参见:https://docs.ansible.com/playbooks_roles.html#role-dependencies
2。使用包含任务文件的“硬编码”路径
- include: ../../common/tasks/login.yml
这在我刚刚做的一个简短的测试剧本中非常有效。请记住,您还可以在这些包含中使用参数等。
参见:http://docs.ansible.com/ansible/latest/playbooks_reuse.html
希望我正确理解了这个问题,这对您有所帮助。
为了防止其他人碰到这个问题,Ansible 的 2.2 版本现在有 include_role
。你现在可以做这样的事情了。
---
- name: do something
include_role:
name: common
tasks_from: login
查看文档 here。
使用 include_role:
和选项 tasks_from
是个好主意。但是,这仍然包括部分角色。例如,它加载角色变量和元依赖项。如果 apply
用于将 tags
应用于包含的文件,则相同的标签将应用于 meta
依赖项。此外,ansible 输出在其输出中列出了包含的角色名称,这令人困惑。
可以使用 first_found
动态定位角色并包含文件。可以找到角色路径搜索 DEFAULT_ROLES_PATH
并从 tasks
文件夹加载文件。 Ansible 在搜索角色时使用相同的变量,只要角色在 Ansible 可以找到的路径中,就会加载文件。
此方法与使用带有选项 tasks_from
的 include_role
一样动态
示例:
- name: Include my_tasks.yml from my_ansible_role
include_tasks: "{{lookup('first_found', params)}}"
vars:
params:
files: my_ansible_role/tasks/my_tasks.yml
paths: "{{ lookup('config', 'DEFAULT_ROLES_PATH') }}"
我正在设计一种带有单独任务的剧本库
所以在通常的角色回购中,我有类似的东西:
roles
├── common
│ └── tasks
│ ├── A.yml
│ ├── B.yml
│ ├── C.yml
│ ├── D.yml
│ ├── login.yml
│ ├── logout.yml
│ └── save.yml
├── custom_stuff_workflow
│ └── tasks
│ └── main.yml
└── other_stuff_workflow
└── tasks
└── main.yml
my main.yml in custom_stuff_workflow 然后包含类似的内容:
---
- include: login.yml
- include: A.yml
- include: C.yml
- include: save.yml
- include: logout.yml
另一个工作流程中的这个:
---
- include: login.yml
- include: B.yml
- include: A.yml
- include: D.yml
- include: save.yml
- include: logout.yml
我找不到一种自然的方法: 一种可行的方法是将所有任务都放在一个角色中并标记相关任务,同时包括 custom_stuff_workflow
我遇到的问题是无法在调用剧本中设置标签:它只能在命令行中设置
因为我正在与公司中的许多人一起分发这个 ansible repo,所以我不能依赖命令行调用(在 yml 中有一个 #!
header 由 [= 处理会很好14=] 命令)
我也可以在每个工作流程中复制相关任务(在上面树中的 common 中),但我不想重复它们
有人可以看到一个解决方案来实现我想要的,而不用在不同的角色上重复任务吗?
我想我的问题的基石是我将任务定义为单独的,它在 ansible 中看起来不自然...
非常感谢
PS:请注意,工作流中的任务必须按特定顺序完成,唯一自然抽象的步骤是登录和 save/logout
PPS:我看过这个问题How do I call a role from within another role in Ansible?,但它没有解决我的问题,因为它调用的是完整角色,而不是角色中任务的子集
是的,Ansible 并不喜欢将任务作为单独的组件。我认为它希望您使用角色,但我明白您为什么不想将角色用于简单、可重用的任务。
我目前看到两种可能的解决方案:
1。将这些任务文件变成角色并使用依赖项
然后你可以做这样的事情,例如custom_stuff_workflow
dependencies:
- { role: login }
参见:https://docs.ansible.com/playbooks_roles.html#role-dependencies
2。使用包含任务文件的“硬编码”路径
- include: ../../common/tasks/login.yml
这在我刚刚做的一个简短的测试剧本中非常有效。请记住,您还可以在这些包含中使用参数等。
参见:http://docs.ansible.com/ansible/latest/playbooks_reuse.html
希望我正确理解了这个问题,这对您有所帮助。
为了防止其他人碰到这个问题,Ansible 的 2.2 版本现在有 include_role
。你现在可以做这样的事情了。
---
- name: do something
include_role:
name: common
tasks_from: login
查看文档 here。
使用 include_role:
和选项 tasks_from
是个好主意。但是,这仍然包括部分角色。例如,它加载角色变量和元依赖项。如果 apply
用于将 tags
应用于包含的文件,则相同的标签将应用于 meta
依赖项。此外,ansible 输出在其输出中列出了包含的角色名称,这令人困惑。
可以使用 first_found
动态定位角色并包含文件。可以找到角色路径搜索 DEFAULT_ROLES_PATH
并从 tasks
文件夹加载文件。 Ansible 在搜索角色时使用相同的变量,只要角色在 Ansible 可以找到的路径中,就会加载文件。
此方法与使用带有选项 tasks_from
include_role
一样动态
示例:
- name: Include my_tasks.yml from my_ansible_role
include_tasks: "{{lookup('first_found', params)}}"
vars:
params:
files: my_ansible_role/tasks/my_tasks.yml
paths: "{{ lookup('config', 'DEFAULT_ROLES_PATH') }}"