在 vSphere 6.5 中使用 pyvmomi 获取虚拟机标签

如何解决在 vSphere 6.5 中使用 pyvmomi 获取虚拟机标签

我正在尝试使用 pyvmomi 使用 python3 脚本过滤虚拟机。

环境:

Versions:
vSphere: 6.5
Python: 3.7.7
pyvmomi: 6.5

此时此刻,这是我打赌的代码

    si = SmartConnectNoSSL(
        host=config['host'],user=config['username'],pwd=password,port=int(config['port']),)
    # disconnect vc
    atexit.register(disconnect,si)

    content = si.RetrieveContent()
    obj_view = content.viewManager.CreateContainerView(
        content.rootFolder,[vim.VirtualMachine],True)
    vms_list = obj_view.view
    obj_view.Destroy()
    for vm in vms_list:
        print(vm.name)
        print(vm.tag)

据推测,vm.tag 应该返回一个包含所有 vim.Tag 对象的数组。尽管如此,所有数组都是空的,但以下一个

vCenter 6.5                                                                                                         
(vim.Tag) [                                                                                                         
   (vim.Tag) {                                                                                                      
      dynamicType = <unset>,dynamicProperty = (vmodl.DynamicProperty) [],key = 'SYstem/COM.VMWARE.VIM.VC'                                                                              
   }                                                                                                                
]

在浏览集群中的所有虚拟机后,这是唯一明显带有标签的机器。顺便说一句,我已经创建了一些标签并将它们分配给一些虚拟机作为测试。但是,pyvmomi 仍然没有从虚拟机中检索标签

这怎么可能?我是否遗漏了任何细节?

提前致谢!

亲切的问候,

解决方法

很难过,but

标签关联不与其对象一起存储,也不是对象生命周期的一部分。

但是,正如@sky_jokerxx 所说,您可以将 vSphere Automation SDK 用于 Python。以下代码演示了获取 vCenter 中所有虚拟机的标记名称及其类别:

from vmware.vapi.vsphere.client import create_vsphere_client

client = create_vsphere_client(
    server='my-company-vcenter.com',username='my_login',password='my_password',session=None)

cat_dict = {}
for id in client.tagging.Category.list():
    cat = client.tagging.Category.get(id)
    cat_dict[cat.id] = cat.name

tag_dict = {}
for id in client.tagging.Tag.list():
    tag = client.tagging.Tag.get(id)
    tag_dict[id] = tag

vms = client.vcenter.VM.list()
vm_objs = [{'id': v.vm,'type': 'VirtualMachine'} for v in vms]

vm_tags = {}
for vm in client.tagging.TagAssociation.list_attached_tags_on_objects(vm_objs):
    cat_tag_dict = {}
    for ti in vm.tag_ids:
        cat_name = cat_dict[tag_dict[ti].category_id]
        if cat_name not in cat_tag_dict:
            cat_tag_dict[cat_name] = []
        cat_tag_dict[cat_name].append(tag_dict[ti].name)
    vm_tags[vm.object_id.id] = cat_tag_dict
结果

vm_tags 包含 Dict{vm.id: Dict{category_name: List[tag_name]}},例如我们有 2 个 VM,相应地具有以下 category=tags:

  • vm-30116:TEAM=后端,BACKUP=每日,BACKUP=每周
  • vm-31423:团队=前端

您的 vm_tags 将如下所示:

"vm-30116": 
{
  "TEAM": ["backend"],"BACKUP": ["daily","weekly"]
},"vm-31423": 
{
  "TEAM": ["frontend"],}

此外,您可以使用纯 REST API。可以在 here 中找到完整示例。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?