ansible:包括角色中的角色?

Mic*_*ael 62 ansible ansible-playbook

是否可以在角色中重用角色?我不是指通过在角色的meta/main.yml文件中定义依赖项,而是直接将角色包含在另一个角色的tasks/main.yml中?

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

playbooks/

  rolebooks/
    some_role/

  roles/
    webtier/
      tasks/
        main.yml
Run Code Online (Sandbox Code Playgroud)

在playbooks/roles/webtier/tasks/main.yml中:

- shell: echo 'hello'
- { role: rolebooks/some_role }
- shell: echo 'still busy'
Run Code Online (Sandbox Code Playgroud)

谢谢

mas*_*asu 79

旧问题,但记录:使用Ansible 2.2+,你很高兴include_role.正是出于这个目的......请参阅此处的文档.

请查看import_role...请参阅此处的文档

  • 这应该被标记为正确的答案 (3认同)

leu*_*cos 11

AFAIK,你做不到.这就是依赖关系的用途.

如果你想避免依赖(因为,例如,你希望'角色X'在两个任务之间运行),如果你认为任务是相关的,你可以在playbook本身中这样做:

角色/ webtier /任务/ main.yml:

- shell: echo 'hello'
- include: webtier.yml
- shell: echo 'role done'
Run Code Online (Sandbox Code Playgroud)

总而言之,这取决于你想要做的事情.但是在你的例子中,"仍然忙"似乎意味着它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
Run Code Online (Sandbox Code Playgroud)


小智 5

你不能,但你可以做一些类似的事情.

对于布局:

roles/
    ...
    common/tasks/main.yml
    nginx/tasks/main.yml
    ...
Run Code Online (Sandbox Code Playgroud)

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

- name: Call the 'common' role to do some general setup
  include: ../../common/tasks/main.yml
Run Code Online (Sandbox Code Playgroud)

请注意,因为您没有使用典型的导入结构,所以除非您之前以标准方式包含角色,否则您可能会遇到一些"怪异",例如角色默认变量无法访问.

  • 如前所述,这无法导入角色默认值、处理程序等,这严重限制了它的实用性。 (2认同)
  • 此解决方案*不*显示如何包含角色.它展示了如何包含角色的主要剧本,这是非常不同的. (2认同)