You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从多网卡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 }}"

逻辑说明

  1. groups.net_platform_dev_linux:获取目标主机组的所有主机名列表
  2. map('extract', hostvars, 'network_interfaces'):从每个主机的hostvars中提取网卡信息字段
  3. map('selectattr', 'description', 'equalto', 'XXX-Interface'):筛选出描述匹配的网卡条目
  4. map('map', attribute='private_ip_address'):从筛选后的网卡中提取私有IP
  5. flatten:将嵌套列表转为一维IP列表
  6. join(','):将IP列表转为逗号分隔的字符串

内容的提问来源于stack exchange,提问作者user51760

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:10:29