Case statement for setting var in Ansible/Jinja2

笑着哭i 提交于 2019-11-30 06:48:45

If you just want to output a value in your template depending on the value of existing_ansible_var you simply could use a dict and feed it with existing_ansible_var.

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

You can define a new variable the same way:

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

In case existing_ansible_var might not necessarily be defined, you need to catch this with a default() which does not exist in your dict:

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

You as well can define it in the playbook and later then use new_ansible_var in the template:

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

Something like this would work, but it's ugly. And as @podarok mentioned in his answer, it's likely unnecessary depending on exactly what you're attempting to do:

- 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"

etc.

you don't need to set var, because I'm guessing that you trying to set var for some condition later. Just make condition there like

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

and get a profit

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!