基于其他角色的 Ansible 条件语句?

Jos*_*ace 6 linux conditional ansible

我在 Ansible 部署中有以下场景:

  • hostX 具有角色common-mta和其他一些角色
  • hostY 有角色common-mta也有角色package-postfix

common-mta角色拷贝一个文件(如果你能猜到,它的/etc/postfix/main.cf),但我想基于主机是否有限制这个角色package-postfix,而不是仅仅通过主机限制像我现在有,例如:

when: not group_names == "mail"
Run Code Online (Sandbox Code Playgroud)

我想要的是这样的:

when: not role_names == "package-postfix"
Run Code Online (Sandbox Code Playgroud)

我认为这会更清晰,并且允许我随意将package-postfix角色添加到其他主机,而无需修改common-mta角色。

这可能吗?

编辑:Navern 的建议不适用于此特定用例;角色列表独立于组列表,虽然我可以通过组执行此操作,但它更脏。考虑一下,这是我的实际任务线:

- name: install postfix generic config if we aren't an mx, mail, or luna host
  template: src=main.cf.j2 dest=/etc/postfix/main.cf
  when: "'luna' not in group_names and 'mx' not in group_names and 'mail' not in group_names"
Run Code Online (Sandbox Code Playgroud)

我想将其替换为:

- name: install postfix generic config if we don't have the postfix role
  template: src=main.cf.j2 dest=/etc/postfix/main.cf
  when: "'package-postfix' not in role_names"
Run Code Online (Sandbox Code Playgroud)

但是,role_names不是一个有效的变量,到目前为止在文档中我找不到一个包含主机所在角色列表的变量,而不是它的组。这些可能看起来是一回事,但在我的情况下它们不是,因为我提到的三个组都package-postfix扮演着相同的角色。希望这是有道理的,我正在正确使用 Ansible。

yae*_*shi 10

实际上role_names自 2013年末以来,我们在 Ansible 中就有了变量。与 Ansible 1.9.2 确认。所以你可以简单地写一个这样的条件:

when: "'package-postfix' not in role_names"
Run Code Online (Sandbox Code Playgroud)