Ansible:在条件 'when' 检查中使用变量的正确方法

Ansible: Correct way of using variables in conditional 'when' checks

我们在不断发展的基础设施中使用 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

这有效,但是我们收到一条警告消息说 "When statement should not use jinja2 templating delimiters such as {{ }} and {% %}",我不喜欢抑制警告。此外,我们不希望有多个单独的库存

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

谢谢!

when 指令的参数是 Jinja 条件表达式。因为它 already 解释为 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)