ansible - Ansible 变量默认为其他可能未定义的变量
问题描述
我有 3 个变量 a、b 和 c。任何一个
- 一个
- b和c
是/已定义(甚至可能是所有 3 个变量)。
我想使用 a,或者,如果 a 未定义,则回退到 b 和 c 的串联。像这样的东西:
{{ a | default(b + '-' + c) }}
如果定义了 a ,则不必定义 b 和 c ,但不幸的是,使用上述解决方案,ansible 会抱怨 b 未定义。
以下工作,但很丑陋:
{% if a is defined %}{{ a }}{% else %}{{ b + '-' + c }}{% endif %}
难道没有一些更易读的方式来做我想做的事吗?最好是简洁的单线,因为我有一堆这些可变组合。
解决方案
这不是对我自己的问题的直接回答,而是“我如何解决它”,实际上是一种更好的方式,因为正如我在问题中提到的那样:
我有一堆这些可变组合。
事实上,有一百一十个这样的组合。所以我想我把它们都放在字典里并迭代它们。
现在我正在创建一个条目,如果它们不存在于 b 和 c 中。这样,无论是直接配置还是通过 b 和 c 配置,我总是得到一个字典 a。所以我可以只在我的模板中使用 a 而无需任何 if、else 或默认值。因此,生成的模板比狭义问题的任何简洁的单行解决方案都更干净。
只有 a 和 c 是字典,而 b 对于每个主机都是常数。
- name: Create vars
block:
- name: Construct a entries from b and c
set_fact:
a: "{{ a | default({}) | combine({item.key : b + ':' + item.value|string}) }}"
when: a is not defined or item.key not in a
loop: "{{ c | default({}) | dict2items }}"
when: b is defined
推荐阅读
- sql - Google BigQuery [标准 SQL] - 仅合并选定列上的行,数组 agg 其余部分
- mysql - 对表中没有记录的列显示零
- r - 在现有的 excel 文件中插入在 R 中创建的可编辑图形
- perforce - Perforce Helix4Git 无法在没有权限的客户端中映射图形存储库
- angular - 如何在信息亭模式下运行 Angular 应用程序?
- javascript - 网格中的 w2ui 文本选择
- vue.js - VueX 等待突变执行
- java - 我想加入 2 个表并获取 table1 的数据并映射到表 1 实体
- jenkins - Jenkins 管道中的开关返回 null,普通 Groovy 中的相同开关返回预期输出
- javascript - react-testing-library - 屏幕与渲染查询