Ansible, set_fact с использованием оператора if then else

Я пытаюсь установить переменную в Ansible с помощью set_fact во время выполнения на основе другой переменной. Если использует первое значение независимо от фактического значения. Вот мой пример кода:

- 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 равно d независимо от того, что установлено jm_env.


person thepod71    schedule 21.03.2017    source источник


Ответы (2)


Во-первых, словари в YAML не упорядочены (и синтаксис, используемый Ansible здесь, является словарем YAML), поэтому у вас нет гарантии, что Ansible сначала установит jm_env, прежде чем перейти к l_env - вам нужно разделить назначение на две задачи.

Во-вторых, ваши тестовые выражения неверны - '{{jm_env}}==Develop' - это строка, потому что она заключена в кавычки; а тестирование if 'string' всегда будет оцениваться как true (это прямая причина, по которой вы всегда получаете d на выходе).

Использовать:

- 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 %}"
person techraf    schedule 21.03.2017
comment
это сработало. я не понимал, что заказ может быть проблемой - person thepod71; 22.03.2017

Один из простых способов установить пример условия на основе фактов:

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

Примечание. Предположим, что op_result уже определен.

Код протестирован и работает хорошо.

person S.K. Venkat    schedule 04.05.2018