web-dev-qa-db-fra.com

Ansible, set_fact utilisant la déclaration if then else

J'essaie de définir une variable dans Ansible avec set_fact au moment de l'exécution en fonction d'une autre variable. Si utilise la première valeur, peu importe la valeur réelle. Voici mon exemple de code:

- name: Global_vars - get date info
    set_fact:  
      jm_env: "{{lookup('env', 'Environment')}}"
      l_env: "{% if '{{jm_env}}==Develop' %}d{% Elif '{{jm_env}}==Staging'%}s{% else %}p{% endif %}"

l_env est d peu importe ce que jm_env est défini.

5
thepod71

Tout d'abord, les dictionnaires en YAML ne sont pas ordonnés (et la syntaxe utilisée par Ansible ici est un dictionnaire YAML), vous n'avez donc aucune garantie que Ansible définirait d'abord jm_env avant de passer à l_env - vous devez scinder l'affectation en deux tâches.

Deuxièmement, vos expressions de test sont incorrectes - '{{jm_env}}==Develop' est une chaîne car elle est citée; et tester if 'string' sera toujours évalué à true (c’est la raison directe pour laquelle vous obtenez toujours d dans le résultat).

Utilisation:

- name: Set the jm_env
    set_fact:  
      jm_env: "{{lookup('env', 'Environment')}}"

- name: Set the l_env
    set_fact:  
      l_env: "{% if jm_env=='Develop' %}d{% Elif jm_env=='Staging'%}s{% else %}p{% endif %}"
6
techraf

L'un des moyens simples de définir l'exemple de condition basé sur des faits comme suit:

  - name: Set facts for delete operation results
    set_fact:
        tr_result: "{{ '{\"status\": \"SUCCESS\"}' if (op_result['output'] == 'Deleted') else '{\"status\" : \"FAILED\"}' }}"

Remarque: Supposons que op_result est un dict & déjà défini.

Le code a été testé et fonctionne bien.

1
S.K. Venkat