
그래서 저는 역할을 사용하여 PostgreSQL 서버를 구성하고 있습니다. 해당 tole에는 다음과 같이 서버 사용자 및 데이터베이스를 지정하는 방법이 있습니다.
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 호스트를 얻고 그들의 사용자 이름과 userpass 변수를 얻는 것입니다.
그런 다음 이 정보에서 postgresql_users 변수를 마치 손으로 작성한 것처럼 구성합니다(관련(원하는 결과) 아래의 호스트.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 호스트를 가져오고 사용자 이름 및 userpass 변수를 가져옵니다."
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