ansible:在角色中包含角色?


73

是否可以在角色中重用角色?我不通过的作用元/ main.yml文件中定义的依赖,但通过意味着包括在直接另一个角色的任务/ main.yml的作用?

例如,我在角色簿中定义了几个基本角色,在角色中定义了一些更高级的角色。我希望高级角色除了一些特定任务之外,还包括一些基本角色。

playbooks/

  rolebooks/
    some_role/

  roles/
    webtier/
      tasks/
        main.yml

在剧本/角色/网站/任务/main.yml中:

- shell: echo 'hello'
- { role: rolebooks/some_role }
- shell: echo 'still busy'

谢谢


1
什么rolebooks
撒尿

Answers:


85

记录的老问题:使用Ansible 2.2+,就可以了include_role。正是出于这个目的...请参阅此处的文档。

也可以检出import_role...在此处查看文档


11

AFAIK,您不能。这就是依赖性的目的。

如果您想避免依赖关系(例如,因为您希望“角色X”在两个任务之间运行),如果您认为这些任务相关,则可以在剧本本身中进行此操作:

角色/网站/任务/main.yml:

- shell: echo 'hello'
- include: webtier.yml
- shell: echo 'role done'

总而言之,这取决于您要确切执行的操作。但是在您的示例中,“仍然很忙”似乎意味着rolebooks/some_role仍然在运行,这是不可能的(此处没有并发性)。

显然,您也可以在主剧本中排序角色(这可能已经完成了):

- name: Polite foo stuff
  hosts: foo_hosts
  roles:
    - say_hello
    - rolebooks/some_role
    - say_bye

- name: Unpolite foo stuff
  hosts: !foo_hosts
  roles:
    - rolebooks/some_role

6

您不能,但是可以做类似的事情。

对于以下布局:

roles/
    ...
    common/tasks/main.yml
    nginx/tasks/main.yml
    ...

在中nginx/tasks/main.yml,您可以调用常见任务:

- name: Call the 'common' role to do some general setup
  include: ../../common/tasks/main.yml

请注意,由于您没有使用典型的导入结构,因此可能会遇到一些“怪异”现象,例如角色默认变量无法访问,除非您以前以标准方式包含了角色。


1
如前所述,这无法导入角色默认值,处理程序等,从而严重限制了其用途。
2015年

是的,包含此注释是有原因的。他们是休息时间。meta/main.yml即使我们中有些人认为角色更好地满足了这个目的,但剧本还是本本是结构的单元。

2
此解决方案显示如何包含角色。它显示了如何包含角色的主要剧本,这是非常不同的。
marcv81'1

1
请参阅您上方的评论和我留下的笔记。对于某些人来说,这仍然是可行的。

1
谢谢!同样的技巧也适用于使用其他角色的文件/模板 template: src=../../common/templates/src.template dest=dest.file
keen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.