Ansible의 역할 설정에 호스트 변수를 열거하는 방법

Ansible의 역할 설정에 호스트 변수를 열거하는 방법

그래서 저는 역할을 사용하여 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

관련 정보