Итак, я использую роль для настройки своего сервера 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