Libvirt z Pythonem

Libvirt z Pythonem
W jednym z moich poprzednich postów pokazałem, jak można zacząć z Libvirt i KVM. Ten stos wirtualizacji nie ma być używany jako oprogramowanie do wirtualizacji komputerów stacjonarnych, raczej ma działać na serwerach oferujących większą elastyczność, wydajność i stabilność, zamiast przyjazności dla użytkownika. Ma to być zautomatyzowane w nth stopień zamiast polegać na konfiguracji ręcznej. Zobaczmy więc, jak możesz połączyć się z demonem Libvirt i zautomatyzować podstawowe zarządzanie i monitorowanie VM za pomocą Pythona.

Konfiguracja i podstawowe założenia

Używam instalacji libvirt kVM na serwerze Debian. Skrypty Pythona, których użyję, działają w Python 3.7.3 Środowisko. Ten artykuł ma zmoczyć stopy dzięki powiązaniom Python Libvirt, gdy projektujesz swoją aplikację, zawsze należy odwołać się do oficjalnej dokumentacji obejmującej szeroki zakres przypadków użycia i są często aktualizowane dość często aktualizowane.

Najpierw zainstaluj wszystkie zależności wymagane dla libvirt:

$ sudo apt Zainstaluj pkg-config libvirt-dev
$ PIP3 Zainstaluj libvirt-python

To wszystkie potrzebne pakiety.

Uruchomione są następujące skrypty i fragmenty lokalnie na hoście libvirt, jako root, zamiast być uruchamiającym zdalnego klienta. Możesz jednak zdalnie uzyskać dostęp do usług, które wymagałyby długiej dygresji do zabezpieczenia połączenia między klientem a serwerem. Dlatego będziemy łączyć się lokalnie, ze względu na prostotę.

Nawiązanie połączenia z usługą Libvirtd

Aby rozpocząć, otwórzmy monit Python, zaimportuj bibliotekę libvirt i otwórz połączenie z libvirt.metoda otwarcia.

root@deb: ~# Python3
Python 3.7.3 (domyślnie, 15 kwietnia 2019, 01:55:37)
[GCC 6.3.0 20170516] na Linux

Wpisz „Pomoc”, „Copyright”, „Kredyty” lub „Licencja”, aby uzyskać więcej informacji.

>>> Importuj libvirt
>>> conn = libvirt.Open ('qemu: /// System')

Zmienna conn może być teraz używana do zapytania o demon libvirt, a my zrobimy to wkrótce. Ale najpierw trochę dygresji.

LIBVIRT może być używany do zarządzania wieloma różnymi stosami wirtualizacji i kontenerów. KVM-QEMU, XEN i LXC są najpopularniejsze z nich. Więc kiedy wpisujesz libvirt.Open ('qemu: /// System') Libvirt umożliwia gromadzenie informacji o i zarządzaniu gośćmi QEMU. Równie dobrze możesz porozmawiać z Demonem LXD lub Xen Hypervisor za pomocą odpowiednio LXC: /// System lub Xen: /// System.

Podobnie metoda libvirt.Open () nie jest jedynym do Twojej dyspozycji. Open (Nazwa), OpenAuth (URI, Auth, Flags) i OpenReadonly (Nazwa) to trzy różne połączenia, z których każde zwraca obiekt Virconnect i oferuje zmienny poziom kontroli nad hostem. Możesz przeczytać o nich więcej tutaj. Na razie mamy Conn jako obiekt klasy Virconnect. Ten obiekt jest bramą do robienia prawie wszystkiego, od konfiguracji samego hiperwizora po modyfikację gości i ich alokacji zasobów.

Po zakończeniu pracy z obiektem upewnij się, że zamknij połączenie, wywołując metodę zamknięcia.

>>> Conn.zamknąć()

Jednak nie uruchamiaj jeszcze powyższego polecenia. Ponieważ będziemy bawić się z Libvirt nieco więcej. Zapytajmy naszego hiperwizora o kilka szczegółów o sobie, takich jak nazwa hosta, i liczba VCPU, które może zaoferować w sumie gościnnie VMS.

>>> Conn.Gethostname ()
„Deb”
>>> Conn.getmaxvcpus („qemu”)
16

Teraz musimy zrozumieć, że w przypadku metadanych libvirt o obiektach takich jak statystyki hiperwizora, maszyny wirtualne, ich informacje o sieci i przechowywanie itp. Są reprezentowane w formacie XML. XML jest w pewnym sensie jak JSON nieco bardziej niezdarny (i trochę starszy). Dane są przechowywane i prezentowane jako dosłowne sznur, a to oznacza, że ​​jeśli zapytasz libvirt, a wyjście tego zapytania jest XML Nowa linia. Wbudowana funkcja drukowania Pythona może ją wyczyścić dla czytelności ludzkiej

>>> Drukuj (Conn.getSySinfo ())


Dell Inc.
A14


Lista i monitorowanie maszyn wirtualnych

Jeśli utrzymujesz dużą gamę maszyn wirtualnych, potrzebujesz metody tworzenia setek maszyn wirtualnych z jednolitą konfiguracją, która również dobrze skaluj się od prostych obciążeń związanych z pojedynczym gwintem do wielordzeniowych, wielowarstwowych przetwarzania. Libvirt nazywa gościa VMS (lub kontenerów, jeśli używasz LXC) Domeny i możesz wymienić informacje o poszczególnych domenach, a także skonfigurować je, jeśli Twój obiekt VirConnect ma wystarczające uprawnienia.

Aby uzyskać informacje o maszynach wirtualnych i ich wykorzystaniu zasobów, możesz użyć następujących połączeń:

>>> Conn.ListdomyainsId ()
[4, 5]

Zwraca szereg identyfikatorów domeny, które są tylko małymi liczbami całkowitych dla prostej konfiguracji libvirt. Bardziej niezawodny sposób etykietowania twoich maszyn wirtualnych, bez posiadania dwóch maszyn wirtualnych (powiedzmy na różnych węzłach) o tym samym identyfikatorze lub nazwie, jest użycie UUIDS. W libvirt wszystko może mieć UUID, który jest losowo generowany 128 -bitowy numer. Szanse na utworzenie dwóch identycznych UUID są rzeczywiście dość małe.

Sieć twoich wirtualnych maszyn, samych maszyn wirtualnych, a nawet pul pamięci i woluminów ma swoje indywidualne UUID. Wykorzystaj ich liberalne w swoim kodeksie Python, zamiast polegać na przypisanych ludzkich imionach. Niestety sposób na uzyskanie UUIDów domen jest nieco nieco bałagan w bieżącej implementacji tej biblioteki, moim zdaniem. Wymaga dostarczenia identyfikatora maszyny wirtualnej (identyfikator domeny), oto jak to wygląda.

Domainids = conn.ListdomyainsId ()
Dla dominidy w dominidach:
domena = conn.LookupbyId ()
UUID = domena.UuidString ()
Drukuj (UUID)

Teraz możesz zobaczyć listę domeny UUIDS. Natknęliśmy się również na nowy obiekt Python Libvirt.Virdomain, który ma swój własny zestaw metod związanych z nim, podobnie jak zmienna conn, która była libvirt.Virconnect obiekt i miał metody takie jak ListdomyAnsId () i LookupBbyId () powiązane z nim.

W obu tych metod możesz użyć wbudowanych metod Dir () Pythona, aby obiekty mogły wymienić swoje wewnętrzne zmienne i metody.

Na przykład:

>>> Dir (Conn)
[„_… Gs”, „harmonogramytype”, „screenshot”, „bezpieczeństwo”, „bezpieczeństwo”,
„SendKey”, „SendProcesssignal”, „Setautostart”, „setblkioparameters”, „setblockoiote”,
„setguestvcpus”, „setInterfaceparameters”, „setmaxmemory”, „setMemory”, „setMemoryflags”,
„setMemoryparameters”, „setMemorySperiod”, „setmetadata”, „setnumaparameters”,
„setPerfevents”, „setschedulerparameters”, „setschedulerparametersflags”, „Settime”,
„Setuse”…]

To może naprawdę pomóc ci szybko przypomnieć dokładną nazwę metody i obiektu, z którym powinien być używany. Teraz, kiedy mamy libvirt.obiekt Virdomain, użyjmy go, aby wymienić różne szczegóły na temat tej działającej maszyny wirtualnej.

>>> domena.informacje ()

Daje to informacje dotyczące stanu VM, maksymalnej pamięci i rdzeni procesora, jak pokazano tutaj.

Możesz także znaleźć inne informacje o maszynie wirtualnej przy użyciu różnych metod, takich jak ostype ()

>>> domena.Ostype ()
„HVM”

Istnieje duża elastyczność, jeśli chodzi o interfejs API, który ujawnia Libvirt i musisz tylko martwić się o swój przypadek użycia i bez martwienia się o ogromną złożoność, którą obsługuje Libvirt.

Wniosek

W moich podróży do technologii libvirt brak UUIDS jako obywatela pierwszej klasy był prawdopodobnie jedynym bólem, z którym się spotkałem, który wydawał się złym wyborem projektu. Poza tym Libvirt jest dość sprytna za to, co osiągnie. Tak, istnieje wiele innych rzeczy, które można było zrobić w lepszy sposób, ale zawsze tak jest w przypadku oprogramowania. Z perspektywy czasu złe decyzje są zawsze oczywiste, ale koszt przepisywania oprogramowania, tak szeroko rozpowszechniony jak libvirt, jest często ogromny.

Wiele zostało zbudowanych, ponieważ projekt ewoluował powoli i stale.

Zamiast próbować nauczyć się całej biblioteki jednocześnie, polecam wymyślić mały projekt lub pomysł i wdrożyć to za pomocą Pythona i libvirt. Dokumentacja jest dość obszerna z wieloma przykładami i naprawdę zmusza cię do myślenia o właściwym projekcie oprogramowania i stosie wirtualizacji w tym samym czasie.