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"]}'