因此,我使用角色来配置我的 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 主机并获取其用户名和用户密码变量。”
答:可以在第一次播放时创建变量,稍后再使用。例如
- 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