【问题标题】:How to provide Ansible default value that includes another variable?如何提供包含另一个变量的 Ansible 默认值?
【发布时间】:2018-08-16 07:56:24
【问题描述】:

我希望 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: \"Simple default: {{ var1 |默认(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 + '?') }}"

【问题讨论】:

    标签: ansible


    【解决方案1】:

    错误信息很清楚:解析器需要定义一个变量。

    您可以使用相同的default 过滤器来提供默认值,而不是var2

    msg: "Default with concatenation: {{ var1 | default(var2|default('') + '?') }}"
    

    【讨论】:

    • 谢谢,这行得通,但是如果 var1 和 var2 都未定义,有没有办法仍然得到错误? (如果两者都定义了,如果它也给出错误,那就更好了。)
    • 检查assert模块。
    • 当然,我可以添加一个显式断言,但我希望在模板语言中有一些方法可以做到这一点,就像 var1 | default(var2) 那样,除了我想向 @ 添加额外的东西987654326@
    【解决方案2】:

    好的,我找到了一种可行的方法,感谢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 }}
    

    (如果key1 不在mydict 中,if mydict.key1 会引发错误)

    【讨论】:

      【解决方案3】:

      两者都做同样的事情(不知道哪个更有效)

      变量:

      repo: hththt
      file_name: file.txt
      

      模板:

      url: "{{ url if url is defined else repo + '/files/' + file_name }}"
      
      url: "{{ url | default(repo + '/files/'' + file_name) }}"   
      

      【讨论】:

        猜你喜欢
        • 2022-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多