Рейтинг:0

ansible main.yml если еще условия

флаг us

Итак, я использую независимую роль, в которой есть файл main.yml в папке defaults/role. Содержимое этого файла таково:

---
API_секреты:
  'API_PROFILE': "{{ API_profile }}"
  'SERVER_ADDRESS': "{{ server_address }}"
  'MGMT_SERVER_ADDRESS': "{{ management_server_address }}"

Теперь я хочу включить в блок api_secrets, после MGMT_SERVER_АДРЕС что-то вроде этого:

{% если '"порт" в mgmt_ports' %}
'MGMT_SERVER_PORT': "{{ management_server_port1 }}"
'MGMT_SERVER_USER': "{{ пользователь1 }}"
{% еще %}
'MGMT_SERVER_PORT': "{{ management_server_port2 }}"
'MGMT_SERVER_USER': "{{ пользователь2 }}"
{% конец%}

Со всем этим на сервере создается файл с указанным выше содержимым и, конечно же, заменой переменных их фактическими значениями.

Как бы я ни пытался, это всегда приводит к различным ошибкам. Я пробовал с "{% if ... endif %}", а также с ''

Ошибка будет такой:

ОШИБКА! Синтаксическая ошибка при загрузке YAML.
  найден персонаж, который не может запустить ни один токен

Ошибка, по-видимому, находится в «/opt/ansible/roles/api/defaults/main.yml»: строка 55, столбец 2, но может
быть в другом месте файла в зависимости от конкретной проблемы синтаксиса.

Оскорбительная строка выглядит так:

{% если '"порт" в mgmt_ports' %}
 ^ здесь

Я также пробовал так:

   "{% if (порт в mgmt_ports) %}
   'MGMT_SERVER_PORT': "{{ management_server_port1 }}"
   {% еще %}
   'MGMT_SERVER_PORT': "{{ management_server_port2 }}"
   {% endif%}"

В этом случае ошибка:

ОШИБКА! Синтаксическая ошибка при загрузке YAML.
  не удалось найти ожидаемый ':'

Ошибка, по-видимому, находится в «/opt/ansible/roles/api/defaults/main.yml»: строка 56, столбец 24, но может
быть в другом месте файла в зависимости от конкретной проблемы синтаксиса.

Оскорбительная строка выглядит так:

  "{% if (порт в mgmt_ports) %}
  'MGMT_SERVER_PORT': "{{ management_server_port1 }}"
                       ^ здесь
Мы можем ошибаться, но это похоже на проблему с
недостающие кавычки. Всегда заключайте скобки выражения шаблона в кавычки, когда они
начать значение. Например:

    with_items:
      - {{фу}}

Должно быть написано как:

    with_items:
      - "{{фу}}"

Как правильно это сделать?

Я знаю, что было бы проще использовать шаблон jinja2, но книги создаются таким образом, и я должен придерживаться этого метода.

Рейтинг:1
флаг th

Шаблонирование переменных происходит намного позже этапа синтаксического анализа YAML, поэтому вы не можете использовать его для шаблонирования YAML таким образом.

Самый простой подход — переместить условие в отдельные выражения Jinja:

API_секреты:
  API_PROFILE: "{{ API_profile }}"
  SERVER_ADDRESS: "{{ server_address }}"
  MGMT_SERVER_ADDRESS: "{{ management_server_address }}"
  MGMT_SERVER_PORT: "{{ management_server_port1, если "порт" в mgmt_ports, иначе management_server_port2 }}"
  MGMT_SERVER_USER: "{{ user1, если "порт" в mgmt_ports, иначе user2 }}"

Вы также можете использовать операторы Jinja, хотя это делает значение немного длиннее для того же результата.

API_секреты:
  API_PROFILE: "{{ API_profile }}"
  SERVER_ADDRESS: "{{ server_address }}"
  MGMT_SERVER_ADDRESS: "{{ management_server_address }}"
  MGMT_SERVER_PORT: "{% if 'port' in mgmt_ports %}{{ management_server_port1 }}{% else %}{{ management_server_port2 }}{% endif %}"
  MGMT_SERVER_USER: "{% if 'port' in mgmt_ports %}{{ user1 }}{% else %}{{ user2 }}{% endif %}"
Рейтинг:0
флаг lr

Ansible не предназначен для обработки операторов If-Else.

Как вы упомянули в конце своего вопроса, с шаблонами jinja2 было бы проще, но это было бы не просто проще, но и сделало бы это правильным способом.

Поэтому вместо того, чтобы пытаться испортить ваш файл yaml операторами if-else, создайте один файл jinja2 с необходимыми параметрами шаблона (похоже, вы все равно получили структуру шаблона jinja2!) и создайте файл конфигурации, используя это.

Затем вы можете выполнить команду шаблона, чтобы включить шаблон в нужное место с правильными параметрами.

«Плейбуки создаются таким образом, и я должен придерживаться этого метода», — кричит тот, кто придумал эту политику, либо небезопасен, либо просто ребенок.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.