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