提取主机变量列表

Extract hostvar list

我正在尝试从组中的主机获取辅助 IP 地址并将其设置为事实。

我的主机变量包含

{
  "network_interfaces": [
    {
      "private_ip_address": "10.224.1.48",
      "private_ip_addresses": [
        {
          "primary": true,
          "private_dns_name": "ip-10-224-1-48.us-east-2.compute.internal",
          "private_ip_address": "10.224.1.48"
        },
        {
          "primary": false,
          "private_dns_name": "ip-10-224-1-66.us-east-2.compute.internal",
          "private_ip_address": "10.224.1.66"
        },
        {
          "primary": false,
          "private_dns_name": "ip-10-224-1-135.us-east-2.compute.internal",
          "private_ip_address": "10.224.1.135"
        }
      ],
      "source_dest_check": true,
      "status": "in-use",
      "subnet_id": "subnet-0cfc6e2da31b9cf50",
      "vpc_id": "vpc-123456"
    }
  ],
}

类似

set_fact:
  private_ips: "{{ groups['database'] | map('extract', hostvars, ['network_interfaces[0]','private_ip_addresses[1]','private_ip_address']) | join(',')  }}"

这是行不通的。

set_fact: 
  private_ips: "{{ groups['database'] | map('extract', hostvars, ['network_interfaces']) | map(attribute='private_ip_addresses') }}"  

最后是 "private_ips": "[AnsibleUndefined, AnsibleUndefined]"

我正在寻找结果只是来自组

中每个主机的 private_ip_addresses 中的一个 IP

在每个主机上创建 IP 列表

    - set_fact:
        my_ip: "{{ network_interfaces|json_query(_query) }}"
      vars:
        _query: '[].private_ip_addresses[].private_ip_address'

给出示例中的数据

  my_ip:
  - 10.224.1.48
  - 10.224.1.66
  - 10.224.1.135

然后,select组中所有主机列表中的第二项数据库

    - set_fact:
        private_ips: "{{ groups.database|
                         map('extract', hostvars, 'my_ip')|
                         map(attribute=1)|list }}"
      run_once: true