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

如何修改Python脚本提取NetBox虚拟机Config Context的os_version字段?

从NetBox虚拟机Config Context提取字段到CSV的修改方案

我们使用NetBox存储虚拟机信息,虚拟机对象的Config Context中存储了如下结构的YAML数据(也可获取JSON格式):

stuff:
- hostname: myserver
  os: Linux
  os_version: RHEL 8.1
  network:
  - ip_address: 192.168.2.3
    network: ABC
    gateway: 192.168.2.1
  server_type: XYZ
  other_data: Foobar

现有Python脚本仅提取NetBox标准字段到CSV:

config = configparser.ConfigParser()
netbox_token = config.get('NetBox', 'token')
netbox_api_base_url = config.get('NetBox', 'api_base_url')
netbox_devices_endpoint = config.get('NetBox', 'devices_endpoint')
nb = pynetbox.api(netbox_api_base_url, token=netbox_token)
nb.http_session.verify = True

vms = nb.virtualization.virtual_machines.all()
csv_file_vms = 'netbox_vms.csv'

with open(csv_file_vms, mode='w', newline='') as csv_file:
    csv_writer = csv.writer(csv_file)
    csv_writer.writerow(['Name', 'Status', 'Site', 'VCPUs', 'Memory (MB)', 'Disk (GB)', 'IP Address'])
    for vm in vms:
        csv_writer.writerow([vm.name, vm.status, vm.site, vm.vcpus, vm.memory, vm.disk, vm.primary_ip]) 

需要修改脚本,将Config Context中的字段(如os_version)添加到CSV输出中,具体修改方案如下:


修改要点

  1. 更新CSV表头:新增需要从Config Context提取的字段,比如OS、OS Version、Server Type等。
  2. 读取Config Context数据:NetBox虚拟机对象的config_context属性是字典,直接从中提取stuff列表(注意stuff是数组结构,需处理单条目或空值场景)。
  3. 安全提取字段:使用字典的get()方法避免因字段缺失抛出KeyError,同时设置默认空值。

修改后的完整脚本

import configparser
import csv
import pynetbox

config = configparser.ConfigParser()
config.read('你的配置文件路径.ini')  # 补充原脚本遗漏的配置文件读取步骤
netbox_token = config.get('NetBox', 'token')
netbox_api_base_url = config.get('NetBox', 'api_base_url')
netbox_devices_endpoint = config.get('NetBox', 'devices_endpoint')
nb = pynetbox.api(netbox_api_base_url, token=netbox_token)
nb.http_session.verify = True

vms = nb.virtualization.virtual_machines.all()
csv_file_vms = 'netbox_vms.csv'

with open(csv_file_vms, mode='w', newline='') as csv_file:
    csv_writer = csv.writer(csv_file)
    # 更新表头,加入Config Context相关字段
    csv_writer.writerow([
        'Name', 'Status', 'Site', 'VCPUs', 'Memory (MB)', 'Disk (GB)', 'IP Address',
        'OS', 'OS Version', 'Server Type'
    ])
    for vm in vms:
        # 获取Config Context中的stuff列表,默认空列表
        stuff_list = vm.config_context.get('stuff', [])
        # 取第一个条目(假设每个VM对应一个stuff条目),默认空字典
        vm_stuff = stuff_list[0] if stuff_list else {}
        
        # 安全提取字段,缺失则返回空字符串
        os = vm_stuff.get('os', '')
        os_version = vm_stuff.get('os_version', '')
        server_type = vm_stuff.get('server_type', '')
        
        # 写入包含Config Context字段的行
        csv_writer.writerow([
            vm.name, vm.status, vm.site, vm.vcpus, vm.memory, vm.disk, vm.primary_ip,
            os, os_version, server_type
        ])

补充说明

  • 若stuff列表包含多个条目,可根据业务需求调整逻辑(如遍历所有条目单独写入行、合并字段等)。
  • 原脚本遗漏了config.read()读取配置文件的步骤,已补充,否则会触发配置读取错误。
  • 所有字段提取使用get()方法,确保即使部分VM的Config Context缺失字段,脚本仍能正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:25:20