Pregunta Declaración de caso para establecer var en Ansible / Jinja2


Estoy usando Ansible con plantillas Jinja2, y este es un escenario en el que no puedo encontrar una solución en la documentación de Ansible o buscando ejemplos de Jinja2 en Google. Esta es la lógica que quiero lograr en Ansible:

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

Probablemente podría hacer esto combinando varias técnicas, la asignación de variables desde aquí: Establecer variable en jinja, la comparación condicional aquí: http://jinja.pocoo.org/docs/dev/templates/#if-expressiony el filtro predeterminado aquí: https://docs.ansible.com/playbooks_filters.html#defaulting-undefined-variables ,

... pero siento que eso es excesivo. ¿Hay una manera más simple de hacer esto?


12
2018-06-04 06:59


origen


Respuestas:


Si solo desea generar un valor en su plantilla dependiendo del valor de existing_ansible_var simplemente podría usar un dict y alimentarlo con existing_ansible_var.

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

Puede definir una nueva variable de la misma manera:

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

En caso existing_ansible_var puede que no necesariamente se defina, debe captar esto con un default() que no existe en tu dict:

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

Usted también puede definirlo en el libro de jugadas y luego usar new_ansible_var en la plantilla:

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

20
2018-06-04 12:46



Algo así funcionaría, pero es feo. Y como @podarok mencionó en su respuesta, es probable que no sea necesario según exactamente lo que estás intentando hacer:

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


3
2018-06-04 11:22



no necesita establecer var, porque supongo que está intentando establecer var para alguna condición más adelante. Simplemente haga una condición allí como

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

y obtener un beneficio


0
2018-06-04 09:38