如何修改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输出中,具体修改方案如下:
修改要点
- 更新CSV表头:新增需要从Config Context提取的字段,比如
OS、OS Version、Server Type等。 - 读取Config Context数据:NetBox虚拟机对象的
config_context属性是字典,直接从中提取stuff列表(注意stuff是数组结构,需处理单条目或空值场景)。 - 安全提取字段:使用字典的
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_
相关产品推荐
相关产品推荐

