我在 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。
实际上,自 2013
role_names
年底以来,我们在 Ansible 中有变量。通过 Ansible 1.9.2 确认。所以你可以简单地写一个这样的条件:可以通过以下方式完成(引用 ansible.com 上的文档):
好的,根据您的更新:我会将其转换为组定义,因为角色与组相关并且更合乎逻辑。您应该创建由组 mx、邮件和主机 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"
那你就做
对不起英语,我希望我说清楚了。