ansible - 我可以在 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
解决方案
是的,您可以使用两个不同的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 }}"
这与您尝试的非常接近!;-)
推荐阅读
- ruby-on-rails - Rails + RSpec - 集成测试(推荐)
- .net-core - 由于缺少一个 dll,dotnet cli 抛出错误
- java - OpenGL渲染到纹理产生空纹理
- php - 在 PHP 中合并两个具有相同 ID 的多维数组
- android - 如何将 Firebase 数据库中的数据列出到列表视图?安卓
- python-3.x - AStar Search - 如何更改路线和费用?
- python - Keras:平均不同的损失函数
- google-cloud-platform - 内容配额限制 - 如何区分“每个项目”和“每个用户每个项目”?
- c# - 泛型奇怪的转换错误
- javascript - ReactJS:API调用中的数组仅显示最后一个元素?