
Итак, я использую роль для настройки моего сервера 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 и получить их переменные имени пользователя и пароля.
Затем из этой информации составьте переменную 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 так, как мне нужно?
решение1
В:«Получить все хосты django и получить их переменные имени пользователя и пароля».
A: Можно создать переменную в первой игре и использовать ее позже. Например
- 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