如何提供包含另一个变量的Ansible默认值?
我希望Ansible 2.6.2任务使用变量如何提供包含另一个变量的Ansible默认值?,ansible,Ansible,我希望Ansible 2.6.2任务使用变量var1的值(如果已设置),否则使用包含变量var2的字符串。但是,将只设置其中一个。如果我使用一个简单的{{var1 | default(var2)}它可以工作,但是当我尝试将字符串附加到var2时,Ansible会在var2未定义时出错,即使var1是: 失败!=>{“msg”:“该任务包含一个带有未定义变量的选项。错误是:'var2'未定义\n\n错误似乎出现在'test.yml':第13行第7列,但可能\n出现在文件的其他位置,具体取决于语法问
var1
的值(如果已设置),否则使用包含变量var2
的字符串。但是,将只设置其中一个。如果我使用一个简单的{{var1 | default(var2)}
它可以工作,但是当我尝试将字符串附加到var2
时,Ansible会在var2
未定义时出错,即使var1
是:
失败!=>{“msg”:“该任务包含一个带有未定义变量的选项。错误是:'var2'未定义\n\n错误似乎出现在'test.yml':第13行第7列,但可能\n出现在文件的其他位置,具体取决于语法问题。\n\n出现问题的行是:\n\n msg:\“简单默认值:{var1 | default(var2)}”\“\n-调试:\n^此处\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 + '?') }}"
错误消息很清楚:解析器需要定义一个变量 您可以使用相同的
default
过滤器来提供默认值,而不是var2
:
msg: "Default with concatenation: {{ var1 | default(var2|default('') + '?') }}"
好的,我找到了一种有效的方法,这要感谢: 如果定义了
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
中,则会引发错误)两者都在执行相同的操作(不知道哪个更有效)
变量:
repo: hththt
file_name: file.txt
模板:
url: "{{ url if url is defined else repo + '/files/' + file_name }}"
url: "{{ url | default(repo + '/files/'' + file_name) }}"
谢谢,这是可行的,但是如果var1和var2都未定义,有没有办法仍然得到一个错误呢?(如果两者都定义了,如果它也会给出一个错误,那就更好了。)检查
assert
module。当然,我可以添加一个显式的assert,但我希望在模板语言中有某种方法可以做到这一点,比如var1 | default(var2)
可以,只是我想给var2添加额外的内容
url: "{{ url if url is defined else repo + '/files/' + file_name }}"
url: "{{ url | default(repo + '/files/'' + file_name) }}"