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

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

我在 Ansible 部署中遇到了以下情况:

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

common-mta角色复制一个文件(如果你能猜到的话,它是/etc/postfix/main.cf),但我想根据主机是否具有角色package-postfix而不是像我现在这样仅通过主机名进行限制,例如:

when: not group_names == "mail"

我想要的是类似这样的东西:

when: not role_names == "package-postfix"

我认为这会更清楚,并允许我任意将角色添加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"

我想用以下代码替换它:

- 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不是一个有效的变量,到目前为止,在文档中我找不到包含列表的变量角色主机所在的主机,而不是其组。这些可能看起来是同一件事,但就我而言,它们不是,因为我提到的三个组都共享角色package-postfix。希望这有意义,并且我正确使用了 Ansible。

答案1

实际上我们role_names在 Ansible 中有变量自 2013 年底以来。已使用 Ansible 1.9.2 确认。因此,您可以简单地编写如下条件:

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

答案2

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

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

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

好的,根据您的更新:我会将其转换为组定义,因为角色与组相关,而且更合乎逻辑。您应该创建由组 mx、mail 和主机 luna 组成的组,然后使用建议的内容。或者您可以定义特定的 host_vars/group_vars,它们会显示 true 或 false。

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

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

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

那么你就做

when use_postifx != "False"

抱歉,我的英语不好,希望我说清楚了。

相关内容