Skip to content

Instantly share code, notes, and snippets.

@kyle-go
Last active March 16, 2022 20:50
Show Gist options
  • Save kyle-go/d6d743853d2082e8f7694bce6b9376f5 to your computer and use it in GitHub Desktop.
Save kyle-go/d6d743853d2082e8f7694bce6b9376f5 to your computer and use it in GitHub Desktop.
vmware poweron, poweroff, create_snapshot, delete_snapshot, revert_snapshot
# coding=utf-8
import sys
import atexit
from pyVmomi import vim, vmodl
from pyVim.connect import SmartConnectNoSSL, Disconnect
from pyVim.task import WaitForTask
def poweron(content, name):
for child in content.rootFolder.childEntity:
if hasattr(child, 'vmFolder'):
datacenter = child
vmFolder = datacenter.vmFolder
vmList = vmFolder.childEntity
for vm in vmList:
if vm.summary.config.name == name:
print("Found VirtualMachine:" + name)
if vm.runtime.powerState == vim.VirtualMachinePowerState.poweredOn:
print("The VirtualMachine is poweredOn now.")
return True
# now we get to work... calling the vSphere API generates a task...
task = vm.PowerOn()
WaitForTask(task)
if task.info.state == vim.TaskInfo.State.error:
print("poweron the vm failed.")
return False
print("poweron ok!")
return True
def poweroff(content, name):
for child in content.rootFolder.childEntity:
if hasattr(child, 'vmFolder'):
datacenter = child
vmFolder = datacenter.vmFolder
vmList = vmFolder.childEntity
for vm in vmList:
if vm.summary.config.name == name:
print("Found VirtualMachine:" + name)
if (vm.runtime.powerState == vim.VirtualMachinePowerState.poweredOff) or (
vm.runtime.powerState == vim.VirtualMachinePowerState.suspended):
print("The VirtualMachine is poweredoff or suspended now.")
return True
# now we get to work... calling the vSphere API generates a task...
task = vm.PowerOff()
WaitForTask(task)
if task.info.state == vim.TaskInfo.State.error:
print("poweroff the vm failed.")
return False
print("poweroff ok!")
return True
def create_snapshot(content, name, snapshot_name):
for child in content.rootFolder.childEntity:
if hasattr(child, 'vmFolder'):
datacenter = child
vmFolder = datacenter.vmFolder
vmList = vmFolder.childEntity
for vm in vmList:
if vm.summary.config.name == name:
task = vm.CreateSnapshot_Task(name=snapshot_name,
description="backup",
memory=True,
quiesce=False)
WaitForTask(task)
if task.info.state == vim.TaskInfo.State.error:
print("create_snapshot failed.")
return False
print("create_snapshot ok!")
return True
def list_snapshots_recursively(snapshots):
snapshot_data = []
snap_text = ""
for snapshot in snapshots:
# snap_text = "Name: %s; Description: %s; CreateTime: %s; State: %s" % (
# snapshot.name, snapshot.description,
# snapshot.createTime, snapshot.state)
snapshot_data.append(snapshot)
snapshot_data = snapshot_data + list_snapshots_recursively(snapshot.childSnapshotList)
return snapshot_data
def revert_snapshot(content, name, snapshot_name):
for child in content.rootFolder.childEntity:
if hasattr(child, 'vmFolder'):
datacenter = child
vmFolder = datacenter.vmFolder
vmList = vmFolder.childEntity
for vm in vmList:
if vm.summary.config.name == name:
snapshots = list_snapshots_recursively(vm.snapshot.rootSnapshotList)
for snapshot in snapshots:
if snapshot_name == snapshot.name:
snap_obj = snapshot.snapshot
print("Reverting snapshot ", snapshot.name)
WaitForTask(snap_obj.RevertToSnapshot_Task())
def delete_snapshot(content, name, snapshot_name):
for child in content.rootFolder.childEntity:
if hasattr(child, 'vmFolder'):
datacenter = child
vmFolder = datacenter.vmFolder
vmList = vmFolder.childEntity
for vm in vmList:
if vm.summary.config.name == name:
snapshots = list_snapshots_recursively(vm.snapshot.rootSnapshotList)
for snapshot in snapshots:
if snapshot_name == snapshot.name:
snap_obj = snapshot.snapshot
print("Removing snapshot ", snapshot.name)
WaitForTask(snap_obj.RemoveSnapshot_Task(True))
# 开机 poweron winxp-x86
# 关键 poweroff winxp-x86
# 恢复快照 revert winxp-x86 the-snapshot
# 删除快照 delete winxp-x86 the-snapshot
# 创建快照 create winxp-x86 the-snapshot
def main():
host = "192.168.0.254"
user = "root"
pwd = "password"
port = 443
arg_len = len(sys.argv)
if arg_len <= 2:
print("bad args")
return
try:
si = SmartConnectNoSSL(host=host, user=user, pwd=pwd, port=port)
atexit.register(Disconnect, si)
content = si.RetrieveContent()
if sys.argv[1] == 'poweron':
return poweron(content, sys.argv[2])
elif sys.argv[1] == 'poweroff':
return poweroff(content, sys.argv[2])
elif sys.argv[1] == 'revert':
return revert_snapshot(content, sys.argv[2], sys.argv[3])
elif sys.argv[1] == 'delete':
return delete_snapshot(content, sys.argv[2], sys.argv[3])
elif sys.argv[1] == 'create':
return create_snapshot(content, sys.argv[2], sys.argv[3])
else:
print("bad args.")
return
except vmodl.MethodFault as error:
print("Caught vmodl fault : " + error.msg)
print("failed.")
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment