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.
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 %}"
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.