首页 文章

在Ansible / Jinja2中设置var的case语句

提问于
浏览
13

我正在使用Ansible和Jinja2模板,这是一个我无法在Ansible的文档中找到解决方案或浏览Jinja2示例的场景 . 这是我想在Ansible中实现的逻辑:

if {{ existing_ansible_var }} == "string1"
  new_ansible_var = "a"
else if {{ existing_ansible_var }} == "string2"
  new_ansible_var = "b"
<...>
else
  new_ansible_var = ""

我可以通过组合几种技术来实现这一点,这里的变量赋值:Set variable in jinja,这里的条件比较:http://jinja.pocoo.org/docs/dev/templates/#if-expression,以及这里的默认过滤器:https://docs.ansible.com/playbooks_filters.html#defaulting-undefined-variables

......但我觉得这太过分了 . 有更简单的方法吗?

3 回答

  • 4

    如果您只想根据 existing_ansible_var 的值在模板中输出值,您只需使用dict并将其与 existing_ansible_var 一起输入 .

    {{ {"string1": "a", "string2": "b"}[existing_ansible_var] | default("") }}
    

    您可以使用相同的方式定义新变量:

    {% set new_ansible_var = {"string1": "a", "string2": "b"}[existing_ansible_var] | default("") -%}
    

    如果 existing_ansible_var 可能不一定被定义,你需要用你的dict中不存在的 default() 来捕获它:

    {"string1": "a", "string2": "b"}[existing_ansible_var | default("this key does not exist in the dict")] | default("")
    

    你也可以在剧本中定义它,然后在模板中使用 new_ansible_var

    vars: 
       myDict:
         string1: a
         string2: b
       new_ansible_var: '{{myDict[existing_ansible_var | default("this key does not exist in the dict")] | default("") }}'
    
  • 22

    像这样的东西会起作用,但它很难看 . 正如@podarok在他的回答中提到的那样,根据你正在尝试做的事情,这可能是不必要的:

    - name: set default
      set_fact: new_ansible_var= ""
    
    - name: set to 'a'
      set_fact: new_ansible_var= "a"
      when: "{{ existing_ansible_var }} == string1"
    
    - name: set to 'b'
      set_fact: new_ansible_var= "b"
      when: "{{ existing_ansible_var }} == string2"
    

    等等

  • 0

    你不需要设置var,因为我猜你以后尝试为某些条件设置var . 只要在那里做条件就好

    - name: Later task
      shell: "command is here"
      when: {{ existing_ansible_var }} == "string1"
    

    并获得利润

相关问题