Пример оператора для установки 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-expression и фильтр по умолчанию: https://docs.ansible.com/playbooks_filters.html#defaulting-undefined-variables,
... но я чувствую, что это перебор. Есть ли более простой способ сделать это?
Ответы
Ответ 1
Если вы просто хотите вывести значение в своем шаблоне в зависимости от значения 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("")
Вы также можете определить его в учебнике, а затем использовать 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("") }}'
Ответ 2
Что-то вроде этого будет работать, но это уродливо. И как сказал @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
вам не нужно устанавливать var, потому что я предполагаю, что вы позже попытаетесь установить var для некоторого условия.
Просто сделайте условие там, например
- name: Later task
shell: "command is here"
when: {{ existing_ansible_var }} == "string1"
и получить прибыль