我正在更新必须保持向后兼容性的角色。它支持程序的两个版本(v1 和 v2),并使用表示相同内容的不同变量,但名称前面带有版本(即
v1_my_val: True
和 v2_my_val: True
)。
我正在创建两个单独的 vars 文件(一个用于 v1,一个用于 v2),它们根据所使用的版本进行加载。公共变量被放入每个文件中(即 _my_val)。所以这就是让我困惑的部分。我想要一个任务,如果定义了第一个定义的变量,则按顺序加载它(即 v1_my_val、v2_my_val、_my_val)。
使用单个变量来做这件事很容易(
my_val: {{ v1_my_val | default _my_val }}
),但不确定如何支持第二种可能性。
也许你可以使用三元过滤器得到你想要的东西?比如:
- hosts: localhost
gather_facts: false
tasks:
- debug:
msg: "first available value: {{ var1 is defined | ternary(var1, var2) | default('val3') }}"
如果没有定义变量,运行会产生:
$ ansible-playbook playbook.yaml
...
ok: [localhost] => {
"msg": "first available value: val3"
}
如果定义了
var1
,我们就得到var1
的值(即使也定义了var2
):
$ ansible-playbook playbook.yaml -e var1=val1 -e var2=val2
...
ok: [localhost] => {
"msg": "first available value: val1"
}
如果定义了
var2
(但没有定义var1
),我们就得到var2
的值:
$ ansible-playbook playbook.yaml -e var2=val2
...
ok: [localhost] => {
"msg": "first available value: val2"
}