我想在ansible剧本中使用if包含条件。我有以下内容,它不执行检查。
- include: do-something.yml if {{version}} >= 1.14 else do-something-else.yml
版本设置为1.13.5,因此应运行do-something-else.yml。
以下作品有效,但我不希望运行和跳过多个播放,因为这会使输出和日志非常繁忙。
- include: do-something.yml
when: version >= "1.14"
- include: do-something-else.yml
when: version < "1.14"
这是一个示例mick.yml,它显示了我想要的include语句。
---
- include: do-something.yml if {{version}} >= 1.14 else do-something-else.yml
如果我运行mick.yml,我希望它检查版本并运行do-something-else.yml,因为版本设置为1.13.5。它没有这样做,但是失败如下。
ansible-playbook mick.yml
ERROR! Invalid variable name in vars specified for PlaybookInclude: '>' is not a valid variable name
答案 0 :(得分:1)
是的,您可以使用两个不同的when
子句在两个任务中执行此操作,就像您所解释的那样,或者可以使用jinja2 if / else来执行。但是要这样做,您必须将标记{{
和}}
放在整个if / else子句周围,并封装在YAML语法要求的"
中。
所以它应该看起来像这样:
"{{ 'do-something.yml' if version >= 1.14 else 'do-something-else.yml' }}"
可以使用适当的jinja2过滤器version_compare
(related StackOverflow answer)来改进版本比较:
"{{ 'do-something.yml' if version is version_compare('1.14', '>=') else 'do-something-else.yml' }}"
尽管如此,似乎在include:
中调用内联if / else具有实际条件的问题。我们可能会打开一个Ansible问题。
因此,我建议的是在if / else中保持此内联,但是将结果存储在变量中,然后使用该变量调用include
。
---
- name: Test the jinja2 if/else to feed include
hosts: localhost
gather_facts: no
vars:
version: 1.12.7
task_todo: "{{ 'do-something' if version is version_compare('1.14', '>=') else 'do-something-else' }}.yml"
tasks:
- name: Print Task ToDo
debug:
var: task_todo
- name: Include Something or SomethingElse
include: "{{ task_todo }}"
这与您尝试的内容非常接近! ;-)