Ansible:在条件“何时”检查中使用变量的正确方法

时间:2018-12-28 13:20:58

标签: ansible ansible-inventory

我们使用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模板分隔符(例如{{}}和{%%}”时),而我不喜欢禁止警告。另外,我们也不想有多个单独的库存

有人可以建议以这种方式使用变量的最佳做法是什么。

谢谢!

1 个答案:

答案 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)