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-devTo 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: ~# Python3Wpisz „Pomoc”, „Copyright”, „Kredyty” lub „Licencja”, aby uzyskać więcej informacji.
>>> Importuj libvirtZmienna 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 ()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 ())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 ()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 ()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)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 ()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.
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.