Ansible:将变量值合并到新变量中

Ansible: Merge variable values into new variable

假设我有这样的库存:

database:
  hosts:
    database1:
      ansible_host: 192.168.0.125
    database2:
      ansible_host: 192.168.0.126
    database3:
      ansible_host: 192.168.0.127

现在我必须替换一个文件中的字符串,该字符串还包含所有主机和未来主机的 IP 地址。所以简而言之,我需要一个看起来像这样的变量:

192.168.0.125,192.168.0.126,192.168.0.127

现在,我可以这样做:

库存:

database:
  hosts:
    database1:
      ansible_host: 192.168.0.124
    database2:
      ansible_host: 192.168.0.126
    database3:
      ansible_host: 192.168.0.127
  vars:
      dbs: "{{ hostvars['database1']['ansible_host'] + ',' + hostvars['database2']['ansible_host'] + ',' + hostvars['database3']['ansible_host'] }}"

剧本:

- name: Show host's ip
    debug:
      msg: "{{ dbs }}"

但这显然不好,因为如果此列表中出现新实例,我将不得不将 manualla + ',' + hostvars['databaseX']['ansible_host'] 添加到清单中,我希望避免这种情况。

你们能推荐一种方法来使用循环或项目列表来获取包含所有 IP 地址的变量中的字符串吗?

谢谢!

一个选项是在循环中构建 dbs 值:

- hosts: localhost
  gather_facts: false
  tasks:
    - set_fact:
        dbs: "{{ dbs + [hostvars[item].ansible_host] }}"
      loop: "{{ groups.database }}"
      vars:
        dbs: []

    - debug:
        var: dbs

根据您的示例库存,这将产生:

TASK [debug] ********************************************************************************************
ok: [localhost] => {
    "dbs": [
        "192.168.0.125",
        "192.168.0.126",
        "192.168.0.127"
    ]
}

在清单中动态创建变量。例如

database:
  hosts:
    database1:
      ansible_host: 192.168.0.124
    database2:
      ansible_host: 192.168.0.126
    database3:
      ansible_host: 192.168.0.127
  vars:
    dbs: "{{ groups.database|
             map('extract', hostvars, 'ansible_host')|
             join(',') }}"