在vSphere 6.5中使用pyvmomi获取VM标记



我正在尝试使用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的数组。标记对象。尽管如此,所有的数组都是空的,只有以下一个:

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

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

这怎么可能呢?我遗漏了什么细节吗?

这很可悲,但

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

但是,正如@sky_jokerxx所说,您可以使用vSphere Automation SDK for 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]}},例如,我们有两个VM,相应地具有以下category=标签:

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

您的vm_tags将看起来像:

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

此外,您还可以使用纯REST API。完整的例子可以在这里找到。

相关内容

  • 没有找到相关文章

最新更新