
所以我使用一個角色來設定我的 postgresql 伺服器。該任務有一種指定伺服器使用者和資料庫的方法,如下所示:
postgresql_users:
- name: baz
我的主機.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