Как перечислить hostvars в настройке роли в Ansible

Как перечислить hostvars в настройке роли в Ansible

Итак, я использую роль для настройки моего сервера postgresql. Эта роль позволяет указать пользователей сервера и базы данных, например:

postgresql_users:
  - name: baz

Мой hosts.yaml:

all:
  hosts:
  children:
    django:
      hosts:
        django_1:
          username: django1
          userpass: django1_pass
        django_2:
          username: django2
          userpass: django2_pass
    db:
      hosts:
        db1:

Любой мой playbook.yaml:

- hosts: db
  become: true
  roles:
    - role: anxs.postgresql

Я хочу с помощью этой информации получить все хосты Django и получить их переменные имени пользователя и пароля.

Затем из этой информации составьте переменную postgresql_users так, как если бы она была написана вручную (соответствующая (желаемый результат) раздел hosts.yaml ниже):

db:
  hosts:
    db1:
      postgresql_users:
        - name: django1
          password: django1_pass
          encrypted: true
        - name: django2
          password: django2_pass
          encrypted: true

я нашелэтот вопросЯ работаю над своей проблемой, но, к сожалению, я слишком новичок в Ansible, чтобы по-настоящему понять, что там предлагается.

Так как же мне сделать соответствующую итерацию, которая сформировала бы мою переменную postgresql_users так, как мне нужно?

решение1

В:«Получить все хосты django и получить их переменные имени пользователя и пароля».

A: Можно создать переменную в первой игре и использовать ее позже. Например

- hosts: all
  tasks:
    - set_fact:
        psql_users: "{{ groups['django']|
                        map('extract', hostvars)|
                        list|
                        json_query('[].{name: username,
                                        password: userpass,
                                        encrypted: `true`}') }}"
      delegate_to: localhost
      run_once: true

- hosts: db
  tasks:
    - debug:
        var: psql_users

дает

ok: [db1] => {
    "psql_users": [
        {
            "encrypted": true, 
            "name": "django1", 
            "password": "django1_pass"
        }, 
        {
            "encrypted": true, 
            "name": "django2", 
            "password": "django2_pass"
        }
    ]
}

Также возможно использовать templateи создать файл инвентаризации. Например, с помощью шаблона

$ cat hosts.j2
db:
  hosts:
    db1:
      postgresql_users:
{{ psql_users|to_nice_yaml|indent(8,true) }}

задание

- template:
    src: hosts.j2
    dest: hosts2

создает инвентарь

$ cat hosts2
db:
  hosts:
    db1:
      postgresql_users:
        -   encrypted: true
            name: django1
            password: django1_pass
        -   encrypted: true
            name: django2
            password: django2_pass

Связанный контент