我们使用AWX / Tower在不断发展的基础架构中运行剧本,并使用智能清单在AWX服务器本身上维护通用清单。
这是我们遇到的问题:
在200多个服务器中,我们只希望一小部分排除特定任务。我们目前的工作方式是在文件中定义变量,例如
http_conf_ignore:
vmhost01: false
vmhost02: false
然后在yml文件中,我们进行了如下条件检查,
tasks:
- include_tasks: http_config.yml
when: http_conf_ignore.{{ inventory_hostname }} is not defined
此方法有效,但是我们收到一条警告消息,内容为“当语句不应该使用jinja2模板分隔符(例如{{}}和{%%}”时),而我不喜欢禁止警告。另外,我们也不想有多个单独的库存
有人可以建议以这种方式使用变量的最佳做法是什么。
谢谢!
答案 0 :(得分:0)
when
伪指令的参数是Jinja条件表达式。由于它已经被解释为Jinja表达式,因此不需要{{...}}
标记。这就是为什么您可以在标记之外引用诸如http_conf_ignore
之类的变量的原因。 inventory_hostname
变量没有什么不同。您想要的是这样的:
when: http_conf_ignore[inventory_hostname] is not defined
(如果要编写类似http_conf_ignore.inventory_hostname
之类的东西,您将要求输入文字键inventory_hostname
的值。使用variable[key]
类似于Python字典访问的语法是如何使用key
变量的值取消引用字典。)
顺便说一句,解决此问题的另一种方法是在清单中的特定主机上设置http_conf_ignore
变量。例如,在您的库存中:
vmhost01 http_conf_ignore=true
这将使您的when
条件为:
when: not http_conf_ignore|default(false)