Ansible - несколько ролей

Я пытаюсь запустить несколько ролей, используя with_items команда, однако я получаю ошибку:

"ОШИБКА! 'Элемент' не определен"

role.yml:

---
- hosts: '{{ host }}'
  become: yes

  roles:
    - role: "{{item}}"
      with_items: "{{ roles }}"

Вот моя команда:

ansible-playbook -i ./inventory/Dev ./playbooks/role.yml --extra-vars='{"host": "db", "roles": ["mysql", "apache"]}'

2 ответа

Решение

Так нельзя. with_ циклы не действительны для ролей.

Во всяком случае, вам нужно предоставить список ролей roles: директива, поэтому синтаксис будет таким же, как для списка групп хостов hosts: '{{ host }}' , Проблема в том, что Ansible не разрешает переменную для ролей, поэтому roles: '{{ roles }}' не работает.


Однако вы можете использовать модуль include_role, в котором вы можете получить доступ к переменным.

Нет, модуль include_role не берет {{ item }} от with_items в качестве значения для name или.

Таким образом, единственный обходной путь, о котором я могу подумать (при условии, что вы не хотите предварительно обрабатывать JSON), - это статически включить роли:

tasks:
  - include_role:
      name: "mysql"
    when: "'mysql' in roles"
  - include_role:
      name: "apache"
    when: "'apache' in roles"

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

Вы не можете использовать цикл with_ с директивой ролей. Простым решением было бы использовать обычный список yaml, как показано ниже:

---
- hosts: '{{ host }}'
  become: yes

  roles:
    - myrole1
    - myrole2

Другой пример, в котором вы можете объявить роли, а также передать соответствующие переменные роли, будет выглядеть следующим образом:

---
- hosts: '{{ host }}'
  become: yes

  roles:
    - role: 
      name: myrole1
      vars:
        host: "db1"
        myroles: 
         - mysql1
         - apache1

    - role: 
      name: myrole2
      vars:
        host: "db2"
        myroles: 
         - mysql2
         - apache2

Также избегайте использования доступных ключевых слов в качестве имен переменных. Наконец, ваша команда для запуска вашей playbook будет следующей:

ansible-playbook -i ./inventory/Dev ./playbooks/role.yml 

{{item}} переменная, которую вы не определили Вам нужно определить его, что вы можете сделать, используя параметр extra-vars, который вы уже используете для "host" и "role".

например

ansible-playbook -i ./inventory/Dev ./playbooks/role.yml --extra-vars='{"item": "something", "host": "db", "roles": ["mysql", "apache"]}'
Другие вопросы по тегам