
そこで、私はロールを使用して 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変数を作成します(関連(望ましい結果) セクション:
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