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

如何用DuckDB从Ansible生成的JSON中提取动态属性

从Ansible收集的主机JSON数据中提取网卡信息并整理为表格

我用Ansible收集了主机内部信息,得到一个大型JSON结果列表,希望将每台主机上所有网卡的网络详情整理为清晰的表格。

示例JSON

[
  {
    "_ansible_facts_gathered": true,
    "ansible_all_ipv4_addresses": [
      "10.20.5.204"
    ],
    "ansible_all_ipv6_addresses": [
      "2a00:6020:41e1:fea0:a00:27ff:fee0:63ba",
      "2a00:6020:41e1:fe85:5:f9db:2e3f:1e85",
      "2a00:6020:41e1:fe85:a00:27ff:fee0:63ba",
      "fe80::a00:27ff:fee0:63ba"
    ],
    "ansible_apparmor": {
      "status": "enabled"
    },
    "ansible_architecture": "x86_64",
    "ansible_bios_date": "12/01/2006",
    "ansible_bios_vendor": "innotek GmbH",
    "ansible_fqdn": "ansible-vb-pelikan.fm174.intern",
    "ansible_hostname": "ansible-vb-pelikan",
    "ansible_hostnqn": "",
    "ansible_interfaces": [
      "enp0s3",
      "lo"
    ],
    "ansible_enp0s3": {
      "active": true,
      "device": "enp0s3",
      "ipv4": {
        "address": "10.20.5.204",
        "broadcast": "10.20.5.255",
        "netmask": "255.255.255.0",
        "network": "10.20.5.0",
        "prefix": "24"
      },
      "ipv6": [
        {
          "address": "2a00:6020:41e1:fea0:a00:27ff:fee0:63ba",
          "prefix": "64",
          "scope": "global"
        }
      ]
    },
    "ansible_lo": {
      "active": true,
      "device": "lo",
      "ipv4": {
        "address": "127.0.0.1",
        "broadcast": "",
        "netmask": "255.0.0.0",
        "network": "127.0.0.0",
        "prefix": "8"
      },
      "ipv6": [
        {
          "address": "::1",
          "prefix": "128",
          "scope": "host"
        }
      ]
    }
  },
  {
    "_ansible_facts_gathered": true,
    "ansible_all_ipv4_addresses": [
      "10.20.5.204"
    ],
    "ansible_all_ipv6_addresses": [
      "2a00:6020:41e1:fea0:a00:27ff:fee0:63ba",
      "2a00:6020:41e1:fe85:5:f9db:2e3f:1e85",
      "2a00:6020:41e1:fe85:a00:27ff:fee0:63ba",
      "fe80::a00:27ff:fee0:63ba"
    ],
    "ansible_apparmor": {
      "status": "enabled"
    },
    "ansible_architecture": "x86_64",
    "ansible_bios_date": "12/01/2006",
    "ansible_bios_vendor": "innotek GmbH",
    "ansible_fqdn": "ansible-vb-pelikan.fm174.intern",
    "ansible_hostname": "ansible-vb-pelikan2",
    "ansible_hostnqn": "",
    "ansible_interfaces": [
      "enp0s4",
      "lo1"
    ],
    "ansible_enp0s4": {
      "active": true,
      "device": "enp0s4",
      "ipv4": {
        "address": "10.20.5.204",
        "broadcast": "10.20.5.255",
        "netmask": "255.255.255.0",
        "network": "10.20.5.0",
        "prefix": "24"
      },
      "ipv6": [
        {
          "address": "2a00:6020:41e1:fea0:a00:27ff:fee0:63ba",
          "prefix": "64",
          "scope": "global"
        }
      ]
    },
    "ansible_lo1": {
      "active": true,
      "device": "lo1",
      "ipv4": {
        "address": "127.0.0.1",
        "broadcast": "",
        "netmask": "255.0.0.0",
        "network": "127.0.0.0",
        "prefix": "8"
      },
      "ipv6": [
        {
          "address": "::1",
          "prefix": "128",
          "scope": "host"
        }
      ]
    }
  }
]

提取规则

每个主机的网卡名称列在ansible_interfaces属性中:

"ansible_interfaces": [
  "enp0s3",
  "lo"
]

需要动态提取对应的ansible_<interface_name>属性值,例如:

ansible_enp0s3
ansible_lo

期望结果结构

┌──────────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬──────────┬──────┬────────┬────────┐
│      列名        │                                                            列类型                                                            │ 允许为空 │ 主键 │ 默认值 │ 额外属性 │
│     varchar      │                                                              varchar                                                              │ varchar  │ varchar │ varchar │ varchar │
├──────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────────┼──────┼────────┼────────┤
│ 主机名           │ VARCHAR                                                                                                                           │ 是       │      │        │        │
│ 网卡名称         │ VARCHAR                                                                                                                           │ 是       │      │        │        │
│ 网卡字段名       │ VARCHAR                                                                                                                           │ 是       │      │        │        │
│ 网卡详情         │ STRUCT(active BOOLEAN, device VARCHAR, ipv4 STRUCT(address VARCHAR, broadcast VARCHAR, netmask VARCHAR, network VARCHAR, prefix…  │ 是       │      │        │        │
└──────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────┴──────┴────────┴────────┘

内容示例

┌──────────────────┬──────────────┬────────────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│      主机名      │   网卡名称    │   网卡字段名    │                                                              网卡详情                                                            │
│     varchar      │   varchar    │     varchar    │ struct(active boolean, device varchar, ipv4 struct(address varchar, broadcast varchar, netmask varchar, network varchar, prefix v…  │
├──────────────────┼──────────────┼────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ansible-vb-pelikan │ lo         │ ansible_lo     │ {'active': true, 'device': lo, 'ipv4': {'address': 127.0.0.1, 'broadcast': '', 'netmask': 255.0.0.0, 'network': 127.0.0.0, 'prefix'…  │
│ cloud            │ lo          │ ansible_lo     │ {'active': true, 'device': lo, 'ipv4': {'address': 127.0.0.1, 'broadcast': '', 'netmask': 255.0.0.0, 'network': 127.0.0.0, 'prefix'…  │
│ file-server      │ lo          │ ansible_lo     │ {'active': true, 'device': lo, 'ipv4': {'address': 127.0.0.1, 'broadcast': '', 'netmask': 255.0.0.0, 'network': 127.0.0.0, 'prefix'…  │
└──────────────────┴──────────────┴────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:39:51