Назад | Перейти на главную страницу

Как перечислить 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 и получить их имя пользователя и переменные userpass.

Затем из этой информации составьте переменную 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 так, как я хочу?

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

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

- 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