如何在 Ansible 中將主機變數列舉到角色設定中

如何在 Ansible 中將主機變數列舉到角色設定中

所以我使用一個角色來設定我的 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

相關內容