我正在设计一种带有单独任务的剧本库
所以在通常的角色回购中,我有类似的东西:
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
我在custom_stuff_workflow中的main.yml包含类似的内容:
---
- 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
我遇到的问题是无法在调用playbook中设置标记:它只能在命令行设置
因为我正在与公司中的许多人一起分发这个ansible repo,所以我不能依赖命令行调用(在#!
命令处理yml中有一个ansible-playbook
标头会很好)
我也可以在每个工作流程中复制相关任务(在上面的树中常见),但我不想重复它们
有人能看到一个解决方案来实现我想要的而不重复不同角色的任务吗?
我认为我的问题的基石是我将任务定义为个人而且在安全方面看起来并不自然...
非常感谢
PS:请注意,工作流中的任务必须按特定顺序完成,抽象的唯一自然步骤是登录和保存/注销
PPS:我已经看到了这个问题How do I call a role from within another role in Ansible?,但它没有解决我的问题,因为它调用了一个完整的角色,而不是一个角色中的任务子集
答案 0 :(得分:44)
是的,Ansible并不真正喜欢将任务作为单独的组件。我认为它希望您使用角色,但我可以看到为什么您不希望将角色用于简单,可重用的任务。
我目前看到两种可能的解决方案:
然后你可以在例如这样做custom_stuff_workflow
dependencies:
- { role: login }
请参阅:https://docs.ansible.com/playbooks_roles.html#role-dependencies
- include: ../../common/tasks/login.yml
在我刚刚做的一个简短的测试手册中,这非常有效。请记住,您也可以在这些包含中使用参数等。
请参阅:http://docs.ansible.com/ansible/latest/playbooks_reuse.html
我希望我能正确理解这个问题,这会有所帮助。
答案 1 :(得分:44)
只是让其他人碰到这个,Ansible的版本 2.2 现在有include_role
。你现在可以这样做了。
---
- name: do something
include_role:
name: common
tasks_from: login
查看文档here。
答案 2 :(得分:0)
将include_role:
与选项tasks_from
一起使用是个好主意。但是,这仍然包括部分角色。例如,它加载角色变量和元依赖关系。如果使用apply
将tags
应用于包含的文件,则将相同的标签应用于meta
依赖性。另外,ansible输出在其输出中将其列为包含的角色名称,这很令人困惑。
可以使用first_found
动态定位角色并包含文件。可以找到搜索DEFAULT_ROLES_PATH
的角色路径,然后从tasks
文件夹中加载文件。在存储角色时,Ansible使用相同的变量,只要角色在Ansible可以找到的路径中,就会加载文件。
此方法与将include_role
与选项tasks_from
一起使用一样动态
示例:
- 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') }}"