So listen Sie Hostvars in einer Rolleneinstellung in Ansible auf

So listen Sie Hostvars in einer Rolleneinstellung in Ansible auf

Ich verwende also eine Rolle, um meinen PostgreSQL-Server zu konfigurieren. Diese Rolle bietet eine Möglichkeit, Serverbenutzer und Datenbanken anzugeben, und zwar wie folgt:

postgresql_users:
  - name: baz

Meine hosts.yaml:

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

Und mein playbook.yaml:

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

Mit diesen Informationen möchte ich alle Django-Hosts sowie deren Benutzernamen- und Benutzerpassvariablen abrufen.

Erstellen Sie dann aus diesen Informationen die Variable postgresql_users, als ob sie von Hand geschrieben worden wäre (relevant (erwünschtes Ergebnis) Abschnitt von hosts.yaml unten):

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

ich habe gefundendiese Fragebeschäftige mich mit meinem Problem, aber leider bin ich bei Ansible zu neu, um wirklich zu verstehen, was dort vorgeschlagen wird.

Wie kann ich also eine geeignete Iteration erstellen, die meine Variable „postgresql_users“ nach meinen Wünschen zusammensetzt?

Antwort1

Q:„Holen Sie sich alle Django-Hosts und deren Benutzernamen- und Benutzerpasswortvariablen.“

A: Es ist möglich, die Variable im ersten Spiel zu erstellen und sie später zu verwenden. Zum Beispiel

- 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

gibt

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

Es ist auch möglich, templateeine Inventardatei zu verwenden und zu erstellen. Zum Beispiel mit der Vorlage

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

die Aufgabe

- template:
    src: hosts.j2
    dest: hosts2

erstellt Inventar

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

verwandte Informationen