问题描述
我正在尝试使用 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"],}