Como enumerar hostvars em uma configuração de função no Ansible

Como enumerar hostvars em uma configuração de função no Ansible

Então, estou usando uma função para configurar meu servidor postgresql. Esse tole tem uma maneira de especificar usuários e bancos de dados do servidor, assim:

postgresql_users:
  - name: baz

Meus hosts.yaml:

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

Qualquer meu playbook.yaml:

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

O que eu quero fazer com essas informações é obter todos os hosts Django e obter suas variáveis ​​​​de nome de usuário e senha de usuário.

Então, a partir dessas informações componha a variável postgresql_users como se fosse escrita à mão (relevante (resultado desejado) de hosts.yaml abaixo):

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

eu encontreiessa questãolidando com meu problema, mas infelizmente sou muito novo no Ansible para realmente entender o que está sendo sugerido lá.

Então, como posso fazer uma iteração apropriada que componha minha variável postgresql_users como eu quero?

Responder1

P:"Obtenha todos os hosts Django e obtenha suas variáveis ​​de nome de usuário e senha de usuário."

R: É possível criar a variável na primeira jogada e utilizá-la posteriormente. Por exemplo

- 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"
        }
    ]
}

Também é possível usar templatee criar um arquivo de inventário. Por exemplo com o modelo

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

a tarefa

- template:
    src: hosts.j2
    dest: hosts2

cria inventário

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

informação relacionada