如何在 Ansible 中将主机变量枚举到角色设置中

如何在 Ansible 中将主机变量枚举到角色设置中

因此,我使用角色来配置我的 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 变量,就像手写一样(相关(期望结果) 下面的 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 主机并获取其用户名和用户密码变量。”

答:可以在第一次播放时创建变量,稍后再使用。例如

- 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

相关内容