#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. Полный пример можно найти здесь.