python - 如何使用 pyvmomi 以编程方式更改 E1000e 网络接口?
问题描述
我正在使用脚本将虚拟机恢复到 vCenter 7.0U1 for DR。该脚本根据之前的内容更改网卡以指向新的端口组密钥。该脚本适用于 VMXNET3 和 E1000 网卡,但在使用 E1000e 网卡时,脚本运行成功,vmware 报告:“指定的参数不正确”
我已将 pyvmomi 更新为 7.0.2 并将 pyvim 更新为 3.0.2 以排除版本问题。
我在 CentOS 7.9 上使用 python3.6
下面是分配网卡的代码:
for device in custvm.config.hardware.device:
if isinstance(device, vim.vm.device.VirtualEthernetCard):
print("old")
print(device)
devcount = devcount + 1
syslog.syslog(syslog.LOG_INFO, guest['vmname']+": VirtualEthernetCard found with MAC: "+str(device.macAddress))
try:
dstnetname = snapshotNetworkData[devcount]['dstnetname']
except:
syslog.syslog(syslog.LOG_ERR, guest['vmname']+": Failed to load snapshotNetworkData--Defaulting to first targetNetwork")
if len(snapshotNetworkData) == 0:
dstnetname = runbook['Runbook'][0]['Networks'][0]['targetVmxNet']
syslog.syslog(syslog.LOG_INFO, guest['vmname']+": Determined Destination to be: "+dstnetname)
dstnetwork = get_obj(vcContentDR, [vim.dvs.DistributedVirtualPortgroup], dstnetname)
syslog.syslog(syslog.LOG_INFO, guest['vmname']+": pulled object "+str(dstnetwork.key))
nicspec = vim.vm.device.VirtualDeviceSpec()
nicspec.operation = vim.vm.device.VirtualDeviceSpec.Operation.edit
if snapshotNetworkData[devcount]['deviceType'] == "com.vmware.vim25.VirtualE1000e":
nicspec.device = vim.vm.device.VirtualE1000e()
nicspec.device.key = device.key
nicspec.device.controllerKey = device.controllerKey
nicspec.device.unitNumber = device.unitNumber
nicspec.device.addressType = 'assigned'
nicspec.device.deviceInfo = device.deviceInfo
else:
nicspec.device = device
nicspec.device.wakeOnLanEnabled = False
try:
nicspec.device.macAddress = snapshotNetworkData[devcount]['macAddress']
except:
nicspec.device.macAddress = str(device.macAddress)
dvs_port_connection.append(vim.dvs.PortConnection())
dvs_port_connection[devcount].portgroupKey = dstnetwork.key
dvs_port_connection[devcount].switchUuid = dstnetwork.config.distributedVirtualSwitch.uuid
nicspec.device.backing = vim.vm.device.VirtualEthernetCard.DistributedVirtualPortBackingInfo()
nicspec.device.backing.port = dvs_port_connection[devcount]
nicspec.device.connectable = vim.vm.device.VirtualDevice.ConnectInfo()
nicspec.device.connectable.allowGuestControl = True
nicspec.device.connectable.startConnected = True
nicspec.device.deviceInfo.summary = dstnetname
device_change.append(nicspec)
print("new")
print(dstnetname)
print(nicspec)
syslog.syslog(syslog.LOG_INFO, str(nicspec))
config_spec = vim.vm.ConfigSpec(deviceChange=device_change)
task = custvm.ReconfigVM_Task(config_spec)
以下是“nicspec”变量的输出,显示了提交给 vCenter 的内容:
(vim.vm.device.VirtualDeviceSpec) {
dynamicType = <unset>,
dynamicProperty = (vmodl.DynamicProperty) [],
operation = 'edit',
fileOperation = <unset>,
device = (vim.vm.device.VirtualE1000e) {
dynamicType = <unset>,
dynamicProperty = (vmodl.DynamicProperty) [],
key = 4000,
deviceInfo = (vim.Description) {
dynamicType = <unset>,
dynamicProperty = (vmodl.DynamicProperty) [],
label = 'Network adapter 1',
summary = '221d cust021-10GNNetwork'
},
backing = (vim.vm.device.VirtualEthernetCard.DistributedVirtualPortBackingInfo) {
dynamicType = <unset>,
dynamicProperty = (vmodl.DynamicProperty) [],
port = (vim.dvs.PortConnection) {
dynamicType = <unset>,
dynamicProperty = (vmodl.DynamicProperty) [],
switchUuid = '50 1a fc 33 0b aa 6d 19-38 24 a1 8c 9f 4f 11 1f',
portgroupKey = 'dvportgroup-10330',
portKey = <unset>,
connectionCookie = <unset>
}
},
connectable = (vim.vm.device.VirtualDevice.ConnectInfo) {
dynamicType = <unset>,
dynamicProperty = (vmodl.DynamicProperty) [],
migrateConnect = <unset>,
startConnected = true,
allowGuestControl = true,
connected = false,
status = <unset>
},
slotInfo = <unset>,
controllerKey = 100,
unitNumber = 7,
addressType = 'assigned',
macAddress = '**:**:**:**:**:**',
wakeOnLanEnabled = false,
resourceAllocation = <unset>,
externalId = <unset>,
uptCompatibilityEnabled = <unset>
},
profile = (vim.vm.ProfileSpec) [],
backing = <unset>
}
请让我知道是否需要任何其他信息进行故障排除。
解决方案
推荐阅读
- powershell - 如何在 Powershell 管道中引用前一个“管道”的输出?
- junit - 运行黄瓜代码时出现io.cucumber.junit.UndefinedStepException
- openssl - 如何阅读 openssl 警报消息?
- python - Python 拟合具有两个指数强制连续性的数据
- postgresql - 使用 PostgreSQL 修改列(初学者)
- .net-core - 仅为 Swagger 端点添加 CORS 策略
- c++ - 为什么在我的应用程序中“添加”需要这么长时间?
- javascript - 根据 JS 数组中的值将元素附加到 DOM
- reactjs - 带有 Rollup 和 ES 模块的 Cherry-pick 模块?
- html - 是否可以隐藏/删除多个 div 相交区域内的边框?