Получение тегов виртуальных машин с помощью pyvmomi в vSphere 6.5

#python-3.x #automation #vsphere #pyvmomi

Вопрос:

Я пытаюсь отфильтровать виртуальные машины с помощью скрипта Python3 с помощью pyvmomi.

Окружающая среда:

 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'                                                                              
   }                                                                                                                
]
 

После просмотра всех виртуальных машин в кластере это единственная машина, на которой, по-видимому, есть тег. Кстати, я уже создал несколько тегов и назначил их некоторым виртуальным машинам в качестве теста. Но все же pyvmomi не извлекает теги из виртуальных машин.

Как это может быть возможно? Я упускаю какую-нибудь деталь?

Заранее спасибо!

С уважением,

Комментарии:

1. К сожалению, pyvmomi не может получить теги. Если вы хотите получить теги, вам нужно использовать vSphere Automation SDK для Python или REST API VCSA. см.: github.com/vmware/pyvmomi/issues/765

Ответ №1:

Это печально, но

Ассоциация тегов не хранится вместе со своим объектом и не является частью жизненного цикла объекта.

Однако, как сказал @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-30116: КОМАНДА=серверная часть, РЕЗЕРВНОЕ КОПИРОВАНИЕ=ежедневно, РЕЗЕРВНОЕ КОПИРОВАНИЕ=еженедельно
  • vm-31423: КОМАНДА=интерфейс

Ваша vm_tags воля будет выглядеть так:

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

Кроме того, вы можете использовать чистый REST API. Полный пример можно найти здесь.