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

时间:2018-08-16 07:56:24

标签: ansible

我希望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 + '?') }}"

3 个答案:

答案 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 + '?' }}

如果定义了var1var2,这是可行的,但是如果都未定义,则会抛出错误:

  

任务包括带有未定义变量的选项。错误是:“ 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) }}"