包括来自ansible playbook中另一个角色的任务

Lou*_*uis 65 ansible 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
Run Code Online (Sandbox Code Playgroud)

我在custom_stuff_workflow中的main.yml包含如下内容:

---

- include: login.yml
- include: A.yml
- include: C.yml
- include: save.yml
- include: logout.yml
Run Code Online (Sandbox Code Playgroud)

而这个在另一个工作流程中:

---

- include: login.yml
- include: B.yml
- include: A.yml
- include: D.yml
- include: save.yml
- include: logout.yml
Run Code Online (Sandbox Code Playgroud)

我找不到以自然的方式做到这一点的方法:一种方法是将所有任务放在一个角色中并标记相关任务,同时包括custom_stuff_workflow

我遇到的问题是无法在调用playbook中设置标签:它只能在命令行设置,因为我正在与公司中的许多人分发这个ansible repo,我不能依赖命令行调用(#!在yml中有一个标题可以通过ansible-playbook命令处理,这样会很好

我也可以在每个工作流程中复制相关任务(在上面的树中常见),但我不想重复它们

有人能看到一个解决方案来实现我想要的而不重复不同角色的任务吗?

我想我的问题的基石是我将任务定义为个体,并且在ansible中看起来不自然......

非常感谢

PS:请注意,工作流中的任务必须按特定顺序完成,抽象的唯一自然步骤是登录和保存/注销

PPS:我看过这个问题如何在Ansible的另一个角色中调用角色?但它并没有解决我的问题,因为它调用一个完整的角色而不是一个角色中的任务子集

小智 52

只是因为其他人碰到了这个,Ansible的2.2版本现在有了include_role.你现在可以做这样的事了.

---
- name: do something
  include_role:
    name: common
    tasks_from: login
Run Code Online (Sandbox Code Playgroud)

这里查看文档.

  • 处理程序现已包含在 Ansible 2.8 中 (2认同)

teh*_*ehK 45

是的,Ansible并不真正喜欢将任务作为单独的组件.我认为它希望您使用角色,但我可以理解为什么您不希望将角色用于简单,可重用的任务.

我目前看到两种可能的解决方案

1.将这些任务文件转换为角色并使用依赖项

然后你可以在例如custom_stuff_workflow中做这样的事情

dependencies:
  - { role: login }
Run Code Online (Sandbox Code Playgroud)

请参阅:https://docs.ansible.com/playbooks_roles.html#role-dependencies

2.使用包含"硬编码"路径的任务文件

- include: ../../common/tasks/login.yml
Run Code Online (Sandbox Code Playgroud)

在我刚刚做的一个简短的测试手册中,这非常有效.请记住,您也可以在这些包含中使用参数等.

请参阅:http://docs.ansible.com/ansible/latest/playbooks_reuse.html

我希望我能正确理解这个问题,这会有所帮助.

  • 感谢您的回答,我已经尝试过这两种解决方案,但显然它并不完美我可能会选择第二种解决方案,但硬编码的路径实际上并不吸引人 (5认同)
  • 如果我理解正确,依赖关系不灵活:它们在*角色之前运行*.使用"include",您可以在角色内的任何步骤运行包含的代码. (5认同)
  • 在阅读了你们尝试的内容之后,我即将对任务文件进行符号链接而不是硬编码路径.我错过了它有任何明显的缺点吗? (2认同)