Создание несколько раз одной роли, но с разными предметами

У меня есть сборник пьес, который готовит 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 }}"
Другие вопросы по тегам