web-dev-qa-db-fra.com

Instruction de cas pour la définition de var dans Ansible/Jinja2

J'utilise Ansible avec les modèles Jinja2, et il s'agit d'un scénario pour lequel je ne trouve pas de solution dans la documentation d'Ansible ni sur Google pour trouver des exemples Jinja2. Voici la logique que je veux réaliser dans Ansible:

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

Je pourrais probablement le faire en combinant plusieurs techniques, l'assignation de variable à partir d'ici: Définir variable dans jinja , la comparaison conditionnelle ici: http://jinja.pocoo.org/docs/dev/templates/#if -expression , et le filtre par défaut ici: https://docs.ansible.com/playbooks_filters.html#defaulting-undefined-variables ,

... mais j'ai l'impression que c'est exagéré. Y a-t-il un moyen plus simple de faire cela?

12
s g

Si vous souhaitez simplement afficher une valeur dans votre modèle en fonction de la valeur de existing_ansible_var, vous pouvez simplement utiliser un dict et l’alimenter avec existing_ansible_var.

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

Vous pouvez définir une nouvelle variable de la même manière:

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

Dans le cas où existing_ansible_var ne serait pas nécessairement défini, vous devez y remédier avec une default() qui n’existe pas dans votre dict:

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

Vous pouvez également le définir dans le livre de lecture et utiliser plus tard new_ansible_var dans le modèle:

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

Quelque chose comme ça marcherait, mais c'est moche. Et comme @podarok l'a mentionné dans sa réponse, il est probablement inutile de dépendre de ce que vous essayez de faire:

- 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
Bruce P

vous n'avez pas besoin de définir var, parce que j'imagine que vous essayez de définir var pour une condition ultérieurement .

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

et faire un profit

0
podarok