如何从多网卡AWS EC2动态清单主机提取管理与LAN私有IP
问题描述
我正从静态清单迁移至AWS EC2动态清单,需求不变:需从指定主机组net_platform_dev_linux的主机中,分别识别标注为'Management-Interface'和'Lan-Interface'的网卡对应的私有IP,并生成逗号分隔的IP字符串。以下为相关信息及静态清单实现示例,寻求动态清单下的实现方法:
动态清单组结构
"net_platform_dev_linux": { "hosts": [ "dev-linux-1", "dev-linux-2", "dev-linux-3", "dev-linux-4" ] }
单台主机hostvars精简示例
{ "ami_launch_index":0, "ansible_host":"10.1.1.1", "network_interfaces":[ { "description":"Lan-Interface", "private_ip_address":"10.1.1.1" }, { "description":"Management-Interface", "private_ip_address":"10.2.0.1" } ] }
静态清单实现示例
Hosts.yml:
--- all: hosts: dev-linux-1: ansible_host: 10.2.0.1 dev-linux-2: ansible_host: 10.2.0.2 dev-linux-3: ansible_host: 10.2.0.3 dev-linux-4: ansible_host: 10.2.0.4 children: net_platform_dev_linux: hosts: dev-linux-1: dev-linux-2: dev-linux-3: dev-linux-4:
Ansible任务:
- debug: msg: >- {{ hostvars | dict2items | selectattr('key', 'in', groups.net_platform_dev_linux) | map(attribute="value.ansible_host") | join(',') }}
期望输出
TASK [debug] ************************************************************** ok: [localhost] => msg: Management Interfaces: 10.2.0.1,10.2.0.2,10.2.0.3,10.2.0.4 Lan Interfaces : 10.0.1.1,10.0.1.2,10.0.1.3,10.0.1.4
动态清单下的实现方法
通过Ansible过滤器链式处理,直接从hostvars中筛选目标主机组的主机并提取对应网卡IP:
实现任务
- name: 提取并输出两种网卡的IP列表 debug: msg: | Management Interfaces: {{ mgmt_ips | join(',') }} Lan Interfaces : {{ lan_ips | join(',') }} vars: mgmt_ips: "{{ groups.net_platform_dev_linux | map('extract', hostvars, 'network_interfaces') | map('selectattr', 'description', 'equalto', 'Management-Interface') | map('map', attribute='private_ip_address') | flatten }}" lan_ips: "{{ groups.net_platform_dev_linux | map('extract', hostvars, 'network_interfaces') | map('selectattr', 'description', 'equalto', 'Lan-Interface') | map('map', attribute='private_ip_address') | flatten }}"
逻辑说明
groups.net_platform_dev_linux:获取目标主机组的所有主机名列表map('extract', hostvars, 'network_interfaces'):从每个主机的hostvars中提取网卡信息字段map('selectattr', 'description', 'equalto', 'XXX-Interface'):筛选出描述匹配的网卡条目map('map', attribute='private_ip_address'):从筛选后的网卡中提取私有IPflatten:将嵌套列表转为一维IP列表join(','):将IP列表转为逗号分隔的字符串
内容的提问来源于stack exchange,提问作者user51760
相关产品推荐
相关产品推荐

