ansible:包括角色中的角色?

时间:2014-10-24 15:42:23

标签: ansible ansible-playbook

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

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

playbooks/

  rolebooks/
    some_role/

  roles/
    webtier/
      tasks/
        main.yml

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

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

由于

4 个答案:

答案 0 :(得分:73)

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

同时查看import_role ...请参阅文档here

答案 1 :(得分:11)

AFAIK,你做不到。这就是依赖的目的。

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

角色/ webtier /任务/ 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

答案 2 :(得分:5)

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

布局:

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

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

答案 3 :(得分:2)

我感谢您说不使用元依赖,但我提出的最佳解决方案是创建一个包含meta / dependency.yml的角色

这允许以正确的顺序包含任意数量的角色。

确保设置allow_duplicates:yes

---
allow_duplicates: yes
dependencies:
  - { role: app-install-rpms,           tags: ['rpms'] }
  - { role: app-java-config,            tags: ['config'] }
  - { role: app-directories,            tags: ['dirs'] }
  - { role: app-config-site_management, tags: ['site_management'] }
  - { role: app-config-initd,           tags: ['initd'] }
  - { role: tomcat-boapp,               tags: ['config'] }

这使我们实质上可以从角色中调用角色。