
Então, estou usando uma função para configurar meu servidor postgresql. Esse tole tem uma maneira de especificar usuários e bancos de dados do servidor, assim:
postgresql_users:
- name: baz
Meus hosts.yaml:
all:
hosts:
children:
django:
hosts:
django_1:
username: django1
userpass: django1_pass
django_2:
username: django2
userpass: django2_pass
db:
hosts:
db1:
Qualquer meu playbook.yaml:
- hosts: db
become: true
roles:
- role: anxs.postgresql
O que eu quero fazer com essas informações é obter todos os hosts Django e obter suas variáveis de nome de usuário e senha de usuário.
Então, a partir dessas informações componha a variável postgresql_users como se fosse escrita à mão (relevante (resultado desejado) de hosts.yaml abaixo):
db:
hosts:
db1:
postgresql_users:
- name: django1
password: django1_pass
encrypted: true
- name: django2
password: django2_pass
encrypted: true
eu encontreiessa questãolidando com meu problema, mas infelizmente sou muito novo no Ansible para realmente entender o que está sendo sugerido lá.
Então, como posso fazer uma iteração apropriada que componha minha variável postgresql_users como eu quero?
Responder1
P:"Obtenha todos os hosts Django e obtenha suas variáveis de nome de usuário e senha de usuário."
R: É possível criar a variável na primeira jogada e utilizá-la posteriormente. Por exemplo
- 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
dá
ok: [db1] => {
"psql_users": [
{
"encrypted": true,
"name": "django1",
"password": "django1_pass"
},
{
"encrypted": true,
"name": "django2",
"password": "django2_pass"
}
]
}
Também é possível usar template
e criar um arquivo de inventário. Por exemplo com o modelo
$ cat hosts.j2
db:
hosts:
db1:
postgresql_users:
{{ psql_users|to_nice_yaml|indent(8,true) }}
a tarefa
- template:
src: hosts.j2
dest: hosts2
cria inventário
$ cat hosts2
db:
hosts:
db1:
postgresql_users:
- encrypted: true
name: django1
password: django1_pass
- encrypted: true
name: django2
password: django2_pass