Получить отфильтрованный список виртуальных машин vCenter с использованием API REST и Python?

#python #vmware #vcenter

Вопрос:

Мне нужно получить список виртуальных машин VMware vCenter на основе подстановочного знака. Из того, что я читал, следует, что vCenter не поддерживает подстановочные знаки. Я не могу получить полный список виртуальных машин, потому что в моей среде более тысячи виртуальных машин.

Есть еще один вопрос, похожий на мой:»Как фильтровать с использованием частичного имени виртуальной машины (строки) в vmware vSphere client REST API?» с прошлого года, но ответом была программа на C#, которую я не мог понять, так как я действительно не знаю C#. В основном программа на C# напрямую обращалась к функциям поиска в пользовательском интерфейсе и извлекала данные (блестяще!). Я заблудился в программе на C#, когда автор начал работать с файлами cookie.

Пожалуйста, извините мой код, я новичок в Python и пытаюсь разобраться в API. Я инженер по операционной системе, но я хочу стать лучше в программировании. 🙂 Вот код, который у меня есть до сих пор, который, по-моему, работает. Есть несколько инструкций печати для выгрузки данных по мере запуска программы, чтобы я мог видеть ответы API:

 import json
from base64 import b64encode
import base64
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
from urllib.parse import parse_qs, urlparse
from bs4 import BeautifulSoup

vcip="myvcenter.fqdn.local" # vCenter server ip address/FQDN
vcid = "testuser@testdomain" # TESTING: Username
vcpw = "SeekretPassword" # TESTING: password

def get_loginurl(vcip):
         vcurl = requests.get('https://' vcip '/ui/login',allow_redirects=True, verify=False)
         return vcurl.url

# Encode the username and password. 
vccred64enc = base64.urlsafe_b64encode(bytes(f'{vcid}:{vcpw}',
                                encoding='utf-8')).decode('utf-8')
# Create the authentication header
auth_header = f'Basic {vccred64enc}'
print(auth_header)
print("="*60)

# DEBUG: Display the SAML URL
vcuilogin = get_loginurl(vcip)
print(vcuilogin)
print("="*60)

# DEBUG: Authenticate to the redirected URL
saml1response = requests.post(vcuilogin,
                      headers={"Authorization": auth_header}, verify=False)
print(saml1response.url)
print("="*60)

# Castle Authorization - idk what this means
headers2 = {
      'Authorization': auth_header,
      'Content-type': 'application/x-www-form-urlencoded',
    'CastleAuthorization=': auth_header
    }

# Parse the URL and then separate the query section
samlparsed = urlparse(saml1response.url)
saml_qs_parse = parse_qs(samlparsed.query)

# Convert from a list item to a single string
samlrequest = ''.join(saml_qs_parse['SAMLRequest'])
samlparams = {'SAMLRequest': samlrequest}

buildurl1 = f"https://{samlparsed.netloc}{samlparsed.path}"

response = requests.post(buildurl1, params=samlparams, headers=headers2, verify=False)

# Make some Soup so that we can find the SAMLResponse
soup = BeautifulSoup(response.text, "html.parser")
#Extract the SAMLResponse value
saml_respvalue = soup.find('input', {'name': 'SAMLResponse'})['value']

print(f'SAMLResponse: {saml_respvalue}')
 

Ответ №1:

Короче говоря, API vSphere REST на самом деле не предназначен для использования для поиска на стороне сервера. Однако существует функция разбиения на страницы, которая позволит вам просматривать более 1000 виртуальных машин, которые у вас есть, а затем фильтровать их локально на стороне клиента.

Одна вещь, на которую, возможно, стоит обратить внимание, — это SDK автоматизации vSphere для Python. В том, как вы это делаете в примере кода, нет ничего плохого, но SDK был создан для работы со службой REST API для vSphere, и есть несколько примеров кода, которые также могут помочь вам в репо.

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

1. Моя цель, к которой я стремлюсь, на самом деле заключается в сценарии развертывания сервера, и я хотел бы, чтобы сценарий нашел следующее имя виртуальной машины, которое я могу использовать. Мы используем очень стандартное соглашение об именовании, поэтому человеку легко определить следующее имя виртуальной машины. Досадно, что API vCenter не может предоставить простой фильтр для имен виртуальных машин.