用python(pyvmomi)管理vmware ESXi/vCenter
环境
开发环境:Ubuntu 18.04 + python3.7
以下环境经过测试都可以使用:centos 6/7 + python3.4/3.6/3.7
和windows 7/2016 +python3.4/3.6/3.7
安装必要模块pyvmomi
pip install pyvmomi
如果是linux系统有pip2和pip3 两个版本,需要使用
pip3 install pyvmomi
代码
host='ESXi 机器ip'
user='root'
password='密码'
port=443#端口
context = None
if hasattr(ssl, '_create_unverified_context'):
context = ssl._create_unverified_context()
si = SmartConnect(host=host,user=user,pwd=password,port=port,sslContext=context)
if not si:
print("帐号密码有问题")
atexit.register(Disconnect, si)
###################################################################################################
def WaitForTasks(tasks, si):#任务
pc = si.content.propertyCollector
taskList = [str(task) for task in tasks]
objSpecs = [vmodl.query.PropertyCollector.ObjectSpec(obj=task) for task in tasks]
propSpec = vmodl.query.PropertyCollector.PropertySpec(type=vim.Task,pathSet=[], all=True)
filterSpec = vmodl.query.PropertyCollector.FilterSpec()
filterSpec.objectSet = objSpecs
filterSpec.propSet = [propSpec]
filter = pc.CreateFilter(filterSpec, True)
try:
version, state = None, None
while len(taskList):
update = pc.WaitForUpdates(version)
for filterSet in update.filterSet:
for objSet in filterSet.objectSet:
task = objSet.obj
for change in objSet.changeSet:
if change.name == 'info':
state = change.val.state
elif change.name == 'info.state':
state = change.val
else:
continue
if not str(task) in taskList:
continue
if state == vim.TaskInfo.State.success:
taskList.remove(str(task))
elif state == vim.TaskInfo.State.error:
raise task.info.error
version = update.version
finally:
if filter:
filter.Destroy()
def getvmname():#打印所有虚拟机名
content = si.RetrieveContent()
for child in content.rootFolder.childEntity:
if hasattr(child, 'vmFolder'):
datacenter = child
vmFolder = datacenter.vmFolder
vmList = vmFolder.childEntity
for vm in vmList:
print(vm.summary.config.name)
print(vm.name)
def getvmstatus(vm_name):#获取虚拟机状态
content = si.RetrieveContent()
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 == vm_name :
print(vm.summary.runtime.powerState)
def poweronvm(vm_name):#打开虚拟机
content = si.content
objView = content.viewManager.CreateContainerView(content.rootFolder,[vim.VirtualMachine],True)
vmList = objView.view
objView.Destroy()
tasks = [vm.PowerOn() for vm in vmList if vm.name in vm_name]
print(tasks)
WaitForTasks(tasks, si)
print("虚拟机启动成功")
def get_vmsnapshotinfo(vm_name):#查看快照信息
content = si.RetrieveContent()
container = content.viewManager.CreateContainerView(content.rootFolder, [vim.VirtualMachine], True)
for c in container.view:
if c.name == vm_name:
snapshots = c.snapshot.rootSnapshotList
return snapshots
def get_vmlist():#获取虚拟机列表
content = si.RetrieveContent()
for child in content.rootFolder.childEntity:
if hasattr(child, 'vmFolder'):
datacenter = child
vmFolder = datacenter.vmFolder
vmList = vmFolder.childEntity
return vmList
def re_snapshot(vm_name,snapshot_name):##恢复快照
for vm in get_vmlist():
pass
#print(vm.name)
if vm.name == vm_name:
snapshots = vm.snapshot.rootSnapshotList
for snapshot in snapshots:
print(snapshot.name)
if snapshot_name == snapshot.name:
snap_obj = snapshot.snapshot
print ("恢复快照", snapshot.name)
task = [snap_obj.RevertToSnapshot_Task()]
WaitForTasks(task, si)
#re_snapshot("虚拟机名","快照名") #恢复快照
#print(get_vmsnapshotinfo("虚拟机名")) #获取虚拟机快照信息
#print(get_vmsnapshotinfo("虚拟机名"))#查看虚拟机快照
#poweronvm("虚拟机名") #打开虚拟机
其它功能我闲了就增加
如果有其它着急需求或者使用方法可以回帖寻求帮助

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
给妹子讲python-S01E23初识异常
【妹子问】从字面上来看,异常是程序运行时出现的错误吧。 没错,每当在运行时检测到程序错误时,python就会引发异常。对待异常有两种方法:一是可以在程序中捕捉和响应错误;或者忽略已发生的异常。 如果是忽略已发生的异常,python默认的异常处理行为将启动:停止程序,打印出错消息。如果不想启动这种默认行为,就要写try语句来捕捉异常并从异常中恢复,当程序运行检测到错误时,python会跳到try处理器,而程序在try之后会重新继续执行。 首先来看看python自带的默认异常处理器 def fetcher(obj, index): return obj[index] x = 'spam' print(fetcher(x,3)) print(fetcher(x,9)) m Traceback (most recent call last ): File "E:/
-
下一篇
复杂链表的复制
题目描述:有一个复杂链表,其结点除了有一个Next指针指向下一个结点外,还有一个random指向链表中的任意结点或者NULL。其链表的定义如下: public class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; RandomListNode(int label) { this.label = label; } } 请实现 public RandomListNode Clone(RandomListNode pHead) 函数实现克隆一个链表。 解决思路: 暴力的解法:首先只复制链表,不管random指针。然后再遍历原链表,复制random指针。复制random指针的方法是根据原链表从头开始,而指向复制链表的指针也同时开始,判断random指针是指向哪一个结点,然后根据位置对应,把复制链表的指针的位置赋值给random。好吧,其实画个图很简单。 import java.util.*; public class Main { class RandomListN...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL数据库在高并发下的优化方案
- CentOS8编译安装MySQL8.0.19
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker容器配置,解决镜像无法拉取问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果