【问题标题】:Get VM tags using pyvmomi in vSphere 6.5在 vSphere 6.5 中使用 pyvmomi 获取 VM 标签
【发布时间】:2021-06-21 01:04:16
【问题描述】:

我正在尝试使用 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 仍然没有从虚拟机中检索标签。

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

提前致谢!

亲切的问候,

【问题讨论】:

  • 很遗憾,pyvmomi 无法获取标签。如果要获取标签,需要使用 vSphere Automation SDK for Python 或 VCSA 的 REST API。见:github.com/vmware/pyvmomi/issues/765

标签: python-3.x automation vsphere pyvmomi


【解决方案1】:

很伤心,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 个虚拟机,相应地具有以下 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找到。

【讨论】:

    猜你喜欢
    • 2015-12-06
    • 2021-11-28
    • 2014-07-22
    • 2015-04-14
    • 2020-04-22
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多