用python(pyvmomi)管理vmware ESXi/vCenter

简介: 自动化运维,用python(pyvmomi)管理vmware ESXi/vCenter

环境

开发环境:Ubuntu 18.04 + python3.7
以下环境经过测试都可以使用:centos 6/7 + python3.4/3.6/3.7windows 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("虚拟机名") #打开虚拟机

其它功能我闲了就增加
如果有其它着急需求或者使用方法可以回帖寻求帮助

目录
相关文章
|
7月前
|
Python
空间管理大师已上线!(2),Python高级工程师进阶学习】
空间管理大师已上线!(2),Python高级工程师进阶学习】
|
4月前
|
存储 固态存储 虚拟化
【vSAN分布式存储服务器数据恢复】VMware vSphere vSAN ESXi超融合HCI分布式存储数据恢复案例
近期,我司处理了一个由10台华为OceanStor存储组成的vSAN超融合架构,其中一台存储闪存盘出现故障,用户取下后用新的闪存盘代替,然后对该闪存盘所在的磁盘组进行重建,导致集群中一台使用0置备策略的虚拟机数据丢失。
94 6
|
5月前
|
数据挖掘 Python
🚀告别繁琐!Python I/O管理实战,文件读写效率飙升的秘密
【7月更文挑战第29天】在 Python 编程中,高效的文件 I/O 对性能至关重要。
51 4
|
5月前
|
数据挖掘 数据处理 Python
🔍深入Python系统编程腹地:文件系统操作与I/O管理,打造高效数据处理流水线
【7月更文挑战第29天】深入Python系统编程腹地:文件系统操作与I/O管理,打造高效数据处理流水线
42 3
|
5月前
|
安全 数据安全/隐私保护 Python
|
5月前
|
JSON 监控 开发者
Python I/O管理新篇章:优化你的程序,让数据流动更顺畅
【7月更文挑战第30天】在数据驱动时代, Python I/O操作效率至关重要。理解I/O瓶颈,使用缓冲技术(如调整`open`的`buffering`参数),并发与异步I/O(借助`asyncio`),高效序列化(json, msgpack),及监控调试(cProfile)能显著提升性能。示例展示了缓冲读取和异步文件操作的最佳实践。不断学习可助开发者优化数据流。
70 2
|
5月前
|
API Python
Python高手修炼手册:精通文件系统操作,掌控I/O管理,提升编程效率
【7月更文挑战第30天】在 Python 编程中, 文件系统操作与 I/O 管理是连接程序与数据的关键。初学者常因路径错误和权限问题受挫, 而高手能自如管理文件。传统 `os` 和 `os.path` 模块易出错, `pathlib` 提供了更直观的对象导向 API。I/O 方面, 同步操作会阻塞程序, 异步 (如使用 `aiofiles`) 则能大幅提升并发能力。真正的高手不仅掌握 API, 更能预见性能瓶颈并优化代码, 实现高效与优雅。
45 1
|
6月前
|
监控 算法 Java
Python中管理内存
Python中管理内存
|
6月前
|
监控 算法 Java
使用Python的垃圾回收机制来管理内存
使用Python的垃圾回收机制来管理内存