如何提供包含另一个变量的Ansible默认值?

如何提供包含另一个变量的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出现在文件的其他位置,具体取决于语法问

我希望Ansible 2.6.2任务使用变量
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) }}"