首页 > 解决方案 > 我可以在 ansible 中包含一个 if else 条件吗?

问题描述

我想在我的 ansible 剧本中使用 if else 条件。我有以下内容,不执行检查。

 - 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: 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

标签: ansible

解决方案


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

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

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

可以通过使用适当的 jinja2 过滤器version_compare相关的 StackOverflow 答案)来改进版本比较:

"{{ 'do-something.yml' if  version is version_compare('1.14', '>=') else 'do-something-else.yml' }}"

然而,在include:. 我们可能会打开一个 Ansible 问题。

所以,我建议保持这个内联 if/else,但将结果存储在一个变量中,然后include用那个 var 调用。

---
- 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 }}"

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


推荐阅读