it-swarm.com.ru

Оператор case для установки var в Ansible/Jinja2

Я использую 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 = ""

Я мог бы, вероятно, сделать это, комбинируя несколько приемов, отсюда присвоение переменной: Установить переменную в jinja , условное сравнение здесь: http://jinja.pocoo.org/docs/dev/templates/#if -выражение и фильтр по умолчанию здесь: https://docs.ansible.com/playbooks_filters.html#defaulting-undefined-variables ,

... но я чувствую, что это излишне. Есть ли более простой способ сделать это?

12
s g

Если вы просто хотите вывести значение в шаблоне в зависимости от значения 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 может быть необязательно определен, вам нужно поймать это с default(), который не существует в вашем dict:

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

Вы также можете определить его в playbook, а затем использовать 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
udondan

Нечто подобное будет работать, но это ужасно. И как @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"

и т.п.

3
Bruce P

вам не нужно устанавливать var, потому что я предполагаю, что вы пытаетесь установить var для какого-то условия позже.

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

и получить прибыль

0
podarok