Ansible: использование with_dict на примере модуля rabbitmq_user

Автор: | 11/07/2018

Требуется создать пользователей и пароли для RabbitMQ, используя плагин rabbitmq_user.

При этом хочется не создавать несколько переменных и несколько задач, а всё выполнить в одном цикле, но у каждой переменной должно быть несколько полей и значений.

Используем with_dict и словарь в переменных.

В файле roles/roles/rabbitmq/vars/main.yml добавляем:

rabbitmq_users:
  user1:
   password: "pass1"
   vhost: "/"
   configure_priv: .*
   read_priv: .*
   write_priv: .*
   tags: "administrator"
 
  user2:
   password: "pass2"
   vhost: "/project2"
   configure_priv: .*
   read_priv: .*
   write_priv: .*

  user3:
   password: "pass3"
   vhost: "/project3"
   configure_priv: .*
   read_priv: .*
   write_priv: .*

  user4:
   password: "pass4"
   vhost: "/project4"
   configure_priv: .*
   read_priv: .*
   write_priv: .*

Далее в плейбуке добавляем задачу:

...
- name: Add RabbitMQ users
  rabbitmq_user:
    user: "{{ item.key }}"
    password: "{{ item.value.password }}"
    permissions:
      - vhost: "{{ item.value.vhost }}"
        configure_priv: .*
        read_priv: .*
        write_priv: .*
    tags: "{{ item.value.tags }}"
    state: present
  with_dict: "{{ rabbitmq_users }}"
...

В item.key – получаем имя пользователя, а через item.value.valuename – элементы массива/словаря.

Запускаем:

[simterm]

...

TASK [rabbitmq : Add RabbitMQ users] ****
ok: [dev.mobilebackend.domain.world] => (item={'key': 'user1', 'value': {'password': 'pass1', 'vhost': '/', 'tags': 'administrator'}})
changed: [dev.mobilebackend.domain.world] => (item={'key': 'user2', 'value': {'password': 'pass2', 'vhost': '/project2', 'tags': 'management'}})
changed: [dev.mobilebackend.domain.world] => (item={'key': 'user3', 'value': {'password': 'pass3', 'vhost': '/project3', 'tags': 'management'}})
changed: [dev.mobilebackend.domain.world] => (item={'key': 'user4', 'value': {'password': 'pass4', 'vhost': '/project4', 'tags': 'management'}})
...

[/simterm]

Проверяем:

[simterm]

root@bm-backed-app-dev:/home/admin# curl -i -u user2:pass2 http://localhost:15672/api/whoami
HTTP/1.1 200 OK
vary: Accept-Encoding, origin
Server: MochiWeb/1.1 WebMachine/1.10.0 (never breaks eye contact)
Date: Fri, 06 Jul 2018 11:27:44 GMT
Content-Type: application/json
Content-Length: 35
Cache-Control: no-cache

{"name":"user2","tags":"management"}

[/simterm]

Использование тегов пользователей есть в Permissions.

Готово.