我希望Ansible 2.6.2任务使用变量var1
的值(如果已设置),否则使用包含变量var2
的字符串。但是,将仅设置其中之一。如果我使用简单的{{ var1 | default(var2) }}
,则可以使用,但是当我尝试将字符串追加到var2
时,即使var2
是未定义的,var1
仍未定义,Ansible会出现错误:< / p>
失败! => {“ msg”:“该任务包含带有未定义变量的选项。错误是:'var2'未定义\ n \ n错误似乎出在'test.yml'中:第13行,第7列,但是\ n \ n可能出现的错误行是:\ n \ n msg:\“简单默认值:{{var1 | default(var2)}} \“ \ n-调试:\ n ^ here \ n”}
剧本:
- hosts: all
gather_facts: false
connection: local
vars:
var1: "one"
# var2: "two"
tasks:
- debug:
# This works
msg: "Simple default: {{ var1 | default(var2) }}"
- debug:
# This fails when var2 is undefined, even though var1 is
msg: "Default with concatenation: {{ var1 | default(var2 + '?') }}"
答案 0 :(得分:2)
错误消息很清楚:解析器需要定义一个变量。
您可以使用相同的default
过滤器代替var2
来提供默认值:
msg: "Default with concatenation: {{ var1 | default(var2|default('') + '?') }}"
答案 1 :(得分:0)
好的,感谢another answer by techraf,我找到了一种可行的方法:
{{ var1 if var1 is defined else var2 + '?' }}
如果定义了var1
或var2
,这是可行的,但是如果都未定义,则会抛出错误:
任务包括带有未定义变量的选项。错误是:“ var2”未定义...
我也可以在其中添加第三个变量:
{{ var1 if var1 is defined else (var2 + '?' if var2 is defined else var3 + '!' ) }}
词典版本:
{{ mydict.key1 if mydict.get('key1') else mydict.key2 }}
(如果if mydict.key1
不在key1
中,{mydict
会引发错误)
答案 2 :(得分:0)
两者都做同样的事情(不知道哪个更有效)
变量:
repo: hththt
file_name: file.txt
模板:
url: "{{ url if url is defined else repo + '/files/' + file_name }}"
url: "{{ url | default(repo + '/files/'' + file_name) }}"