首页 > 解决方案 > Ansible 变量默认为其他可能未定义的变量

问题描述

我有 3 个变量 a、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 %}

难道没有一些更易读的方式来做我想做的事吗?最好是简洁的单线,因为我有一堆这些可变组合。

标签: ansiblejinja2

解决方案


这不是对我自己的问题的直接回答,而是“我如何解决它”,实际上是一种更好的方式,因为正如我在问题中提到的那样:

我有一堆这些可变组合。

事实上,有一百一十个这样的组合。所以我想我把它们都放在字典里并迭代它们。

现在我正在创建一个条目,如果它们不存在于 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

推荐阅读