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

我有一个Ansible部署的情况如下:

  • hostX具有common-mta的angular色和一些其他angular色
  • hostY具有common-mtaangular色以及package-postfixangular色

common-mtaangular色复制一个文件(如果你可以猜到的话,它是/etc/postfix/main.cf ),但是我想根据主机是否具有package-postfixangular色来限制它,而不仅仅是限制像我现在的主机名,例如:

 when: not group_names == "mail" 

我想要的是这样的:

 when: not role_names == "package-postfix" 

我认为这将更清洁,并允许我随意添加package-postfixangular色到其他主机,而不必修改common-mtaangular色。

这可能吗?

编辑:Navern的build议不适用于这个特定的用例; angular色列表是独立于组列表,而我可以通过组来做到这一点,这是更肮脏。 考虑一下,这是我的实际任务:

 - 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" 

我想用下面的代码replace它:

 - 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" 

然而, role_names不是一个有效的variables,到目前为止在文档中我找不到一个包含主机所在angular色列表的variables,而不是它的组。 这些可能看起来是一样的,但在我的情况下,他们不是,因为我提到的三个组都共享package-postfixangular色。 希望这是有道理的,我正确使用Ansible。

实际上, 自2013年底以来,我们在Ansible中有role_namesvariables。 用Ansible 1.9.2证实。 所以你可以简单地写一个像这样的条件:

 when: "'package-postfix' not in role_names" 

可以通过以下方式完成(从ansible.com上的文档引用):

此外,group_names是当前主机所在的所有组的列表(数组)。这可以在使用Jinja2语法的模板中使用,以根据主机的组成员身份(或angular色)制作模板源文件:

 {% if 'package-postfix' not in group_names %} # some part of a configuration file that only applies to not package-postfix {% endif %} 

好吧,根据你的更新:我会将其转换为组定义,因为angular色与组相关,而且更合乎逻辑。 你应该创build一个由mx组,邮件和主luna组成的组,然后使用build议的东西。 或者你可以定义具体的host_vars / group_vars,它会说真或假。

例如:使用group_vars:mx将包含:use_postfix:“False”

邮件的group_vars将包含use_postfix:“False”

和luna的host_var将包含host_vars use_postfix:“False”

那么你只是做

 when use_postifx != "False" 

对不起英文,我希望我自己清楚。