Cómo enumerar hostvars en una configuración de rol en Ansible

Cómo enumerar hostvars en una configuración de rol en Ansible

Entonces estoy usando un rol para configurar mi servidor postgresql. Ese tole tiene una forma de especificar los usuarios y las bases de datos del servidor, así:

postgresql_users:
  - name: baz

Mis hosts.yaml:

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

Cualquiera de mi playbook.yaml:

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

Lo que quiero hacer con esta información es obtener todos los hosts de Django y obtener sus variables de nombre de usuario y contraseña.

Luego, a partir de esta información componga la variable postgresql_users como si estuviera escrita a mano (relevante (resultado deseado) sección de hosts.yaml a continuación):

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

he encontradoesta preguntalidiando con mi problema, pero desafortunadamente soy demasiado nuevo en Ansible para entender realmente lo que se sugiere allí.

Entonces, ¿cómo puedo hacer una iteración adecuada que componga mi variable postgresql_users como quiero?

Respuesta1

P:"Obtenga todos los hosts de Django y obtenga sus variables de nombre de usuario y contraseña de usuario".

R: Es posible crear la variable en la primera jugada y usarla después. Por ejemplo

- 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

da

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

También es posible utilizar templatey crear un archivo de inventario. Por ejemplo con la plantilla

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

la tarea

- template:
    src: hosts.j2
    dest: hosts2

crea inventario

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

información relacionada