Last active
March 16, 2022 20:50
-
-
Save kyle-go/d6d743853d2082e8f7694bce6b9376f5 to your computer and use it in GitHub Desktop.
vmware poweron, poweroff, create_snapshot, delete_snapshot, revert_snapshot
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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