wake-up-neo.com

Case Statement zum Setzen von var in Ansible/Jinja2

Ich verwende Ansible mit Jinja2-Vorlagen, und dies ist ein Szenario, für das ich in Ansibles Dokumentation keine Lösung finden kann oder nach Jinja2-Beispielen suchen kann. Hier ist die Logik, die ich in Ansible erreichen möchte:

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

Ich könnte dies wahrscheinlich durch Kombinieren mehrerer Techniken tun, die Variablenzuweisung von hier: Variable in jinja setzen , den bedingten Vergleich hier: http://jinja.pocoo.org/docs/dev/templates/#if -Ausdruck und der Standardfilter hier: https://docs.ansible.com/playbooks_filters.html#defaulting-undefined-variables ,

... aber ich fühle mich wie übertrieben. Gibt es einen einfacheren Weg, dies zu tun?

12
s g

Wenn Sie nur einen Wert in Ihrer Vorlage abhängig vom Wert von existing_ansible_var ausgeben möchten, können Sie einfach ein Diktat verwenden und es mit existing_ansible_var füttern.

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

Sie können eine neue Variable auf dieselbe Weise definieren:

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

Falls existing_ansible_var nicht unbedingt definiert ist, müssen Sie dies mit einer default() abfangen, die in Ihrem Diktat nicht vorhanden ist:

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

Sie können es auch im Playbook definieren und später in der Vorlage new_ansible_var verwenden:

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

So etwas würde funktionieren, aber es ist hässlich. Und wie @podarok in seiner Antwort erwähnt hat, ist es wahrscheinlich unnötig, je nachdem, was Sie genau tun wollen:

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

usw.

3
Bruce P

sie müssen var nicht einstellen, da ich vermute, dass Sie später versuchen, var für eine bestimmte Bedingung festzulegen

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

und einen Gewinn erzielen

0
podarok