
Entonces estoy usando un rol para configurar mi servidor postgresql. Ese tole tiene una forma de especificar los usuarios y las bases de datos del servidor, así:
postgresql_users:
- name: baz
Mis hosts.yaml:
all:
hosts:
children:
django:
hosts:
django_1:
username: django1
userpass: django1_pass
django_2:
username: django2
userpass: django2_pass
db:
hosts:
db1:
Cualquiera de mi playbook.yaml:
- hosts: db
become: true
roles:
- role: anxs.postgresql
Lo que quiero hacer con esta información es obtener todos los hosts de Django y obtener sus variables de nombre de usuario y contraseña.
Luego, a partir de esta información componga la variable postgresql_users como si estuviera escrita a mano (relevante (resultado deseado) sección de hosts.yaml a continuación):
db:
hosts:
db1:
postgresql_users:
- name: django1
password: django1_pass
encrypted: true
- name: django2
password: django2_pass
encrypted: true
he encontradoesta preguntalidiando con mi problema, pero desafortunadamente soy demasiado nuevo en Ansible para entender realmente lo que se sugiere allí.
Entonces, ¿cómo puedo hacer una iteración adecuada que componga mi variable postgresql_users como quiero?
Respuesta1
P:"Obtenga todos los hosts de Django y obtenga sus variables de nombre de usuario y contraseña de usuario".
R: Es posible crear la variable en la primera jugada y usarla después. Por ejemplo
- 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
da
ok: [db1] => {
"psql_users": [
{
"encrypted": true,
"name": "django1",
"password": "django1_pass"
},
{
"encrypted": true,
"name": "django2",
"password": "django2_pass"
}
]
}
También es posible utilizar template
y crear un archivo de inventario. Por ejemplo con la plantilla
$ cat hosts.j2
db:
hosts:
db1:
postgresql_users:
{{ psql_users|to_nice_yaml|indent(8,true) }}
la tarea
- template:
src: hosts.j2
dest: hosts2
crea inventario
$ cat hosts2
db:
hosts:
db1:
postgresql_users:
- encrypted: true
name: django1
password: django1_pass
- encrypted: true
name: django2
password: django2_pass