我是否可以包含ansible中包含的if if else条件?

时间:2019-09-11 12:29:59

标签: ansible

我想在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

1 个答案:

答案 0 :(得分:1)

是的,您可以使用两个不同的when子句在两个任务中执行此操作,就像您所解释的那样,或者可以使用jinja2 if / else来执行。但是要这样做,您必须将标记{{}}放在整个if / else子句周围,并封装在YAML语法要求的"中。

所以它应该看起来像这样:

"{{ 'do-something.yml' if version >= 1.14 else 'do-something-else.yml' }}"

可以使用适当的jinja2过滤器version_comparerelated 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 }}"

这与您尝试的内容非常接近! ;-)