синтаксис if else в ansible playbook - PullRequest
0 голосов
/ 14 июля 2020

Я новичок в Ansible и пытаюсь понять, что не так с моим синтаксисом.

Моя цель - выбрать только одну из ролей. Я не хочу использовать «когда».

Вот что я написал (я использую Ansible v2.9.5):

- name: Install external DB for Cloudera Manager Server
  hosts: db_server
  roles:
 - {{% if (databases_type == "postgresql") %} role: postgresql {% else %} {% endif %}
   {% if (databases_type == "mysql") %} role: mariadb {% else %} {% endif %} 
   {% if (databases_type == "oracle") %} role: oracledb}

Когда я запустите playbook, я получаю синтаксическую ошибку, но она недостаточно ясна.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 14 июля 2020

Простой словарь может быть более чистым вариантом. Например

shell> cat playbook.yml
- name: Install external DB for Cloudera Manager Server
  hosts: db_server
  vars:
    my_roles:
      postgresql: postgresql
      mysql: mariadb
      oracle: oracledb
  tasks:
    - include_role:
        name: "{{ my_roles[databases_type] }}"

Пример

Давайте создадим роли

shell> cat roles/postgresql/tasks/main.yml
- debug:
    var: role_name

shell> cat roles/mariadb/tasks/main.yml
- debug:
    var: role_name

shell> cat roles/oracledb/tasks/main.yml
- debug:
    var: role_name

Затем давайте создадим инвентарь с тремя серверами, group_vars со значением по умолчанию databases_type и host_vars с переменными для двух хостов test_01 и test_02 . Третий хост test_03 будет использовать переменные из group_vars .

shell> cat hosts
[db_server]
test_01
test_02
test_03

shell> cat group_vars/db_server 
databases_type: mysql

shell> cat host_vars/test_01 
databases_type: postgresql
shell> cat host_vars/test_02
databases_type: oracle

Тогда playbook выдает (сокращенно)

shell> ansible-playbook -i hosts playbook.yml 

PLAY [Install external DB for Cloudera Manager Server] *****************

TASK [include_role : {{ my_roles[databases_type] }}] *******************

TASK [postgresql : debug] **********************************************
ok: [test_01] => 
  role_name: postgresql

TASK [oracledb : debug] ************************************************
ok: [test_02] => 
  role_name: oracledb

TASK [mariadb : debug] *************************************************
ok: [test_03] => 
  role_name: mariadb
0 голосов
/ 14 июля 2020

Я считаю, что это то, что вы ищете. В приведенном ниже примере имя переменной - плод. Если фрукт приравнивается к Apple, то мне он нравится, а мне он не нравится. Дайте мне знать, если вы столкнетесь с какой-либо проблемой или вам нужно больше объяснений по этому поводу.

Если еще синтаксис:

 - name: "[ If Else Example ]"
            command: "echo {{ 'I like it' if  fruit == 'Apple'  else 'I do not like it'}}"
            register: if_reg
          - debug:
                  msg: "{{ if_reg.stdout }}"
0 голосов
/ 14 июля 2020

Кажется, у вас есть двойная фигурная скобка:

- {{% if ...

Попробуйте удалить ее, чтобы сделать одиночную фигурную скобку:

например,

- {% if ...

также можно удалить последнюю строку завершаем фигурную скобку и ставим endif:

{% if (databases_type == "oracle") %} role: oracledb {% endif %} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...