Создание несколько раз одной роли, но с разными предметами
У меня есть сборник пьес, который готовит 3 разных бродяги на моей машине, поэтому я должен создать роль, которая создаст этот бродягу. Я не нахожу правильный синтаксис. Это выглядит как roles
это не модуль, поэтому у меня нет всех опций, только учебники.
файл playbook:
- hosts: localhost
connection: local
roles :
- role: vagrant
with_items:
- {index: 1, ip: 192.168.222.1, name: mongo1, user: nicorama }
- {index: 2, ip: 192.168.222.2, name: mongo2, user: nicorama }
- {index: 3, ip: 192.168.222.3, name: mongo3, user: nicorama }
И задачи в бродячей роли
- file: path=/linux/{{item.name}} state=directory owner={{item.user}} group={{item.user}} mode="u=rwx,g=rwx,o=rx"
- file: src=playbook.yml dest=/linux/{{item.name}}
- template: src=Vagrantfile dest=/linux/{{item.name}}/Vagrantfile
Ошибка "item.name" не определена. Это работает, используя with_items
внутри роли, но это даже ранило бы глаза моей бабушки
- file: path=/linux/{{item.name}} state=directory owner={{item.user}} group={{item.user}} mode="u=rwx,g=rwx,o=rx"
with_items:
- {index: 1, ip: 192.168.222.1, name: mongo1, user: nicorama }
- {index: 2, ip: 192.168.222.2, name: mongo2, user: nicorama }
- {index: 3, ip: 192.168.222.3, name: mongo3, user: nicorama }
- copy: src=playbook.yml dest=/linux/{{item.name}}/playbook.yml
with_items:
- {index: 1, ip: 192.168.222.1, name: mongo1, user: nicorama }
- {index: 2, ip: 192.168.222.2, name: mongo2, user: nicorama }
- {index: 3, ip: 192.168.222.3, name: mongo3, user: nicorama }
...
3 ответа
Читая ваш вопрос еще раз, я заметил, что вы на самом деле не упоминали, что это должен быть какой-то цикл. Возможно, применение 3-х раз одной роли с разными параметрами соответствует вашим потребностям:
- hosts: localhost
connection: local
roles :
- role: vagrant
index: 1
ip: 192.168.222.1
name: mongo1
user: nicorama
- role: vagrant
index: 2,
ip: 192.168.222.2
name: mongo2
user: nicorama
- role: vagrant
index: 3
ip: 192.168.222.3
name: mongo3
user: nicorama
Тогда в вашей роли вы можете использовать переменные index
, ip
и т.п.
Я знаю, что это древний вопрос, но теперь вы можете использовать цикл с новым синтаксисом include_role:
- hosts: localhost
connection: local
tasks:
- include_role:
name: vagrant
vars:
index: "{{ vagrant_vars.index }}"
ip: "{{ vagrant_vars.ip }}"
name: "{{ vagrant_vars.name }}"
user: "{{ vagrant_vars.user }}"
loop:
- {index: 1, ip: 192.168.222.1, name: mongo1, user: nicorama }
- {index: 2, ip: 192.168.222.2, name: mongo2, user: nicorama }
- {index: 3, ip: 192.168.222.3, name: mongo3, user: nicorama }
loop_control:
loop_var: vagrant_vars
Определите переменную и используйте ее внутри своей роли.
- hosts: localhost
connection: local
vars:
my_list:
- {index: 1, ip: 192.168.222.1, name: mongo1, user: nicorama }
- {index: 2, ip: 192.168.222.2, name: mongo2, user: nicorama }
- {index: 3, ip: 192.168.222.3, name: mongo3, user: nicorama }
roles :
- vagrant
Используйте переменную внутри вашего playbook, используя with_items
:
- file: path=/linux/{{item.name}} state=directory owner={{item.user}}
group={{item.user}} mode="u=rwx,g=rwx,o=rx"
with_items: my_list
- file: src=playbook.yml dest=/linux/{{item.name}}
with_items: my_list
- template: src=Vagrantfile dest=/linux/{{item.name}}/Vagrantfil
with_items: my_list
Действительно, вы не можете применять циклы непосредственно к ролям. Петли предназначены для задач.
Но роли могут принимать любые параметры, которые вы можете использовать в своей роли. Это не то же самое, что применение роли 3 раза с разными параметрами. Но в вашей роли вы можете справиться со всеми циклами. Если это вариант, давайте немного изменим его модель:
Плейбук:
- hosts: localhost
connection: local
roles :
- role: vagrant
instances:
- {index: 1, ip: 192.168.222.1, name: mongo1, user: nicorama }
- {index: 2, ip: 192.168.222.2, name: mongo2, user: nicorama }
- {index: 3, ip: 192.168.222.3, name: mongo3, user: nicorama }
Задачи вашей роли:
- file: path=/linux/{{item.name}} state=directory owner={{item.user}} group={{item.user}} mode="u=rwx,g=rwx,o=rx"
with_items: instances
- file: src=playbook.yml dest=/linux/{{item.name}}
with_items: instances
- template: src=Vagrantfile dest=/linux/{{item.name}}/Vagrantfile
with_items: instances
Конечно, это крайне неудобно, если вам приходится повторять каждую задачу. В Ansible 2 (снова) возможно циклическое включение включений, и здесь это может пригодиться. Вы можете переместить все свои задачи в отдельный файл:
- file: path=/linux/{{instance.name}} state=directory owner={{instance.user}} group={{instance.user}} mode="u=rwx,g=rwx,o=rx"
- file: src=playbook.yml dest=/linux/{{instance.name}}
- template: src=Vagrantfile dest=/linux/{{instance.name}}/Vagrantfile
Тогда в вашем main.yml у вас будет только эта задача:
- include: other-file.yml
with_items: instances
instance: "{{ item }}"