web-dev-qa-db-de.com

Ansible, set_fact mit if-else-Anweisung

Ich versuche, eine Variable in Ansible mit set_fact zur Laufzeit basierend auf einer anderen Variablen zu setzen. Wenn der erste Wert verwendet wird, unabhängig vom tatsächlichen Wert. Hier ist mein Codebeispiel:

- 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 ist d, unabhängig davon, was jm_env eingestellt ist.

5
thepod71

Erstens sind Wörterbücher in YAML nicht geordnet (und die von Ansible hier verwendete Syntax ist ein YAML-Wörterbuch). Sie können also nicht garantieren, dass Ansible zuerst jm_env setzt, bevor Sie mit l_env fortfahren.

Zweitens sind Ihre Testausdrücke falsch - '{{jm_env}}==Develop' ist eine Zeichenfolge, da sie in Anführungszeichen steht. und testen if 'string' wird immer zu true ausgewertet (dies ist der direkte Grund, aus dem Sie immer d in der Ausgabe erhalten).

Benutzen:

- 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

Eine der einfachen Methoden, um auf Tatsachen basierende Bedingungen wie folgt festzulegen:

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

Anmerkung: Angenommen, op_result ist ein Dikt & bereits definiert.

Code wurde getestet und funktioniert gut.

1
S.K. Venkat