Poradnik lalek dla początkujących: co to jest lalka i jak z niej korzystać?

Zanim nauczymy się Marionetki, zrozummy:

Co to jest zarządzanie konfiguracją?

Zarządzanie konfiguracją to proces utrzymywania oprogramowania i systemów komputerowych (na przykład serwerów, pamięci masowej, sieci) w znanym, pożądanym i spójnym stanie. Umożliwia także dostęp do dokładnego historycznego zapisu stanu systemu na potrzeby zarządzania projektami i audytu.

Administratorzy systemów wykonują głównie powtarzalne zadania, takie jak instalowanie serwerów, konfigurowanie tych serwerów itp. Specjaliści ci mogą zautomatyzować to zadanie, pisząc skrypty.

Jest to jednak trudne zadanie, gdy pracują na ogromnej infrastrukturze. Aby rozwiązać takie problemy, wprowadzono narzędzie do zarządzania konfiguracją, takie jak Puppet.

Co to jest Marionetka?

Marionetka to narzędzie do zarządzania systemem, służące do centralizacji i automatyzacji procesu zarządzania konfiguracją. Puppet jest również używany jako narzędzie do wdrażania oprogramowania. Jest to oprogramowanie do zarządzania konfiguracją typu open source, szeroko stosowane do konfiguracji serwerów, zarządzania, wdrażania i orkiestracji różnych aplikacji i usług w całej infrastrukturze organizacji.

Puppet jest specjalnie zaprojektowany do zarządzania konfiguracją Linuksa i Windows systemy. Jest napisany w języku Ruby i wykorzystuje jego unikalność Domain Sspecyficzne Ljęzyk (DSL) do opisu konfiguracji systemu.

Jakie są wersje Puppet?

Marionetka występuje w dwóch wersjach:

  • Marionetka Open Source: Jest to podstawowa wersja narzędzia do zarządzania konfiguracją Puppet, znanego również jako Open Source Puppet. Jest dostępny bezpośrednio na stronie internetowej Puppet i jest licencjonowany w ramach systemu Apache 2.0.
  • Przedsiębiorstwo lalek: Wersja komercyjna oferująca funkcje takie jak raportowanie zgodności, orkiestracja, kontrola dostępu oparta na rolach, graficzny interfejs użytkownika, interfejs API i narzędzia wiersza poleceń do efektywnego zarządzania węzłami.

Co potrafi Marionetka?

Na przykład masz infrastrukturę obejmującą około 100 serwerów. Jako administrator systemu masz obowiązek dopilnować, aby wszystkie te serwery były zawsze aktualne i działały z pełną funkcjonalnością.

Administrator systemu pracuje ręcznie na serwerach
Administrator systemu pracujący ręcznie na serwerach

Aby to zrobić, możesz użyć Puppet, który pozwala napisać prosty kod, który może być automatycznie wdrażany na tych serwerach. Zmniejsza to wysiłek ludzki i sprawia, że ​​proces rozwoju jest szybki i efektywny.

Puppet automatyzuje zarządzanie serwerem
Puppet automatyzuje zarządzanie serwerem

Lalka wykonuje następujące funkcje:

  • Puppet umożliwia zdefiniowanie odrębnych konfiguracji dla każdego hosta.
  • Narzędzie pozwala na ciągłe monitorowanie serwerów w celu sprawdzenia, czy wymagana konfiguracja istnieje, czy nie i czy nie jest ona zmieniana. Jeśli konfiguracja zostanie zmieniona, narzędzie Puppet powróci do wstępnie zdefiniowanej konfiguracji na hoście.
  • Zapewnia także kontrolę nad całym skonfigurowanym systemem, dzięki czemu scentralizowana zmiana zostaje dokonana automatycznie.
  • Jest również używany jako narzędzie do wdrażania, ponieważ automatycznie wdraża oprogramowanie w systemie. Implementuje infrastrukturę jako kod, ponieważ zasady i konfiguracje są zapisywane jako kod.

Marionetkowy DSL i paradygmaty programowania

Zanim nauczymy się Puppet DSL, zrozummy paradygmaty programowania:

Paradygmat programowania to styl, którego używasz w programowaniu komputerowym.

Cztery typy paradygmatów to:

  • Tryb rozkazujący.
  • Deklaracyjny.
  • Funkcjonalny (który jest uważany za podzbiór tego deklaratywnego paradygmatu)
  • Zorientowany obiektowo.

Skupimy się na trybie imperatywnym i deklaratywnym.

Paradygmaty imperatywne

Ten paradygmat programowania wyraża logikę obliczeń (co robić) i opisuje przepływ sterowania (jak to zrobić)

Przykład:

Załóżmy, że jedziesz do swojego biura, rezerwujesz taksówkę i zaczynasz udzielać kierowcy wskazówek krok po kroku, aż dotrzesz do biura. Określanie, co i jak robić, jest stylem imperatywnym.

Paradygmaty deklaratywne

Ten paradygmat programowania wyraża logikę obliczeń (co zrobić) bez opisywania przepływu sterowania (jak to zrobić)

Przykład:

Załóżmy, że jedziesz do swojego biura, rezerwujesz taksówkę Uber i określasz miejsce docelowe (Biuro). Określanie, co należy zrobić, a nie jak to zrobić, jest stylem deklaratywnym.

Paradygmat Co robić: Jak zrobić
imperatyw Tak Tak
Deklaracyjny Tak Nie

Marionetka używa deklaratywnego paradygmatu programowania

Puppet wykorzystuje deklaratywne podejście do programowania.

Przykład: Utwórz użytkownika w systemie:

Można to zrobić za pomocą wzorca programowania Imperatywnego za pomocą skryptu powłoki: Tutaj określamy, jak utworzyć użytkownika i jakich poleceń użyć na system operacyjny.

Paradygmaty deklaratywne

Można to jednak zrobić przy użyciu deklaratywnego wzorca programowania z zaledwie kilkoma linijkami kodu marionetkowego i językiem specyficznym dla domeny Puppet (DSL) i nadal osiągnąć ten sam wynik.

Paradygmaty deklaratywne

Modele wdrażania narzędzi do zarządzania konfiguracją

Istnieją dwa modele wdrażania dla narzędzia do zarządzania konfiguracją :

  • Model wdrażania oparty na push: inicjowany przez węzeł główny.
  • Model wdrażania oparty na ściąganiu: inicjowany przez agentów.

Model wdrażania oparty na technologii push

W tym modelu wdrażania serwer główny przekazuje konfiguracje i oprogramowanie poszczególnym agentom. Po sprawdzeniu bezpiecznego połączenia master zdalnie uruchamia polecenia na agentach. Na przykład, Wiarygodne i Stos Solny.

Model wdrażania oparty na ściąganiu.

W tym modelu wdrożenia poszczególne serwery kontaktują się z serwerem głównym, weryfikują i nawiązują bezpieczne połączenie, pobierają konfiguracje i oprogramowanie, a następnie odpowiednio się konfigurują — na przykład Puppet i Chef.

Jak działa Marionetka?

Puppet opiera się na modelu wdrażania Pull, w którym węzły agentów regularnie meldują się po każdym uruchomieniu 1800 sekund z węzłem głównym, aby sprawdzić, czy coś wymaga aktualizacji w agencie. Jeśli coś wymaga aktualizacji, agent pobiera niezbędne kody marionetkowe od mistrza i wykonuje wymagane działania.

Wyjaśnijmy to na przykładzie:

Przykład: Mistrz – Konfiguracja agenta:

Mistrz

Komputer oparty na systemie Linux z zainstalowanym oprogramowaniem Puppet Master. Odpowiada za utrzymywanie konfiguracji w postaci kodów marionetkowych. Węzłem głównym może być tylko Linux.

Agenci

Maszyny docelowe zarządzane przez marionetkę z zainstalowanym oprogramowaniem agenta marionetkowego.

Agenta można skonfigurować w dowolnym obsługiwanym systemie operacyjnym, takim jak Linux lub Windows or Solaris lub MacOS.

Komunikacja pomiędzy masterem a agentem odbywa się za pomocą bezpiecznych certyfikatów.

Komunikacja z agentem-władcą marionetek
Komunikacja z agentem-władcą marionetek

Komunikacja pomiędzy Masterem a Agentem

Krok 1) Po ustanowieniu połączenia między agentem a serwerem głównym agent Puppet wysyła dane o swoim stanie do serwera głównego Puppet. Są one nazywane Faktami: Informacje te obejmują nazwę hosta, szczegóły jądra, adres IP, szczegóły nazwy pliku itp.…

Komunikacja pomiędzy Masterem a Agentem
Agent wysyła fakty do mistrza

Krok 2) Puppet Master wykorzystuje te dane i tworzy listę z konfiguracją, która ma zostać zastosowana do agenta. Ta lista konfiguracji, które należy wykonać na agencie, jest nazywana a katalog. Można to zmienić, na przykład poprzez instalację pakietów, uaktualnienie lub usunięcie, utworzenie systemu plików, utworzenie lub usunięcie użytkownika, ponowne uruchomienie serwera, zmianę konfiguracji IP itp.

Komunikacja pomiędzy Masterem a Agentem
Mistrz wysyła katalog do Agenta

Krok 3) Agent korzysta z tej listy konfiguracji, aby zastosować wszelkie wymagane zmiany konfiguracji w węźle.

W przypadku braku dryfów w konfiguracji Agent nie dokonuje żadnych zmian w konfiguracji i pozostawia węzeł, aby działał z tą samą konfiguracją.

Komunikacja pomiędzy Masterem a Agentem
Agent stosuje konfigurację

Krok 4) Po zakończeniu węzeł raportuje do mistrza marionetek, wskazując, że konfiguracja została zastosowana i zakończona.

Bloki lalek

Puppet zapewnia elastyczność integracji raportów z narzędziami innych firm za pomocą interfejsów API Puppet.

Są cztery rodzaje klocków do budowy lalek

  1. Zasoby
  2. Zajęcia
  3. Oczywisty
  4. Moduły

Zasoby marionetek

Zasoby Puppet to elementy składowe Puppet.

Zasoby to wbudowane funkcje które działają w zapleczu i wykonują wymagane operacje w programie Puppet.

Zajęcia marionetkowe

Kombinację różnych zasobów można zgrupować w jedną jednostkę zwaną klasą.

Manifest Lalek

Manifest to katalog zawierający marionetkowe pliki DSL. Pliki te mają rozszerzenie .pp. Rozszerzenie .pp oznacza program marionetkowy. Kod marionetkowy składa się z definicji lub deklaracji klas lalek.

Moduły marionetkowe

Moduły to zbiór plików i katalogów, takich jak Manifesty i definicje klas. Są to jednostki wielokrotnego użytku i współdzielenia w Puppet.

Na przykład, MySQL moduł do zainstalowania i skonfigurowania MySQL lub moduł Jenkins do zarządzania Jenkinsem itp.

Moduły marionetkowe
Moduły marionetkowe

Rodzaje zasobów marionetek

Ogólnie rzecz biorąc, system składa się z plików, użytkowników, usług, procesów, pakietów itp. W Puppet nazywa się je zasobami. Zasoby są podstawowymi elementami budulcowymi

Puppet. Wszystkie operacje na agentach puppet są wykonywane za pomocą zasobów puppet.

Zasoby Puppet to gotowe narzędzia, które służą do wykonywania różnych zadań i operacji na dowolnej obsługiwanej platformie. Możemy użyć pojedynczego zasobu Puppet do wykonania określonego zadania lub możemy użyć wielu zasobów Puppet razem, aby wykonać złożone konfiguracje wdrożeń aplikacji.

Zasoby mogą mieć różne typy. Używa marionetek zasoby oraz typy zasobów w celu opisania konfiguracji systemu.

Istnieją trzy rodzaje typów zasobów:

  1. Rdzeń marionetkowy lub wbudowane typy zasobów.
  2. Typy zasobów zdefiniowane przez marionetkę.
  3. Niestandardowe typy zasobów marionetek.

Rdzeń marionetkowy lub wbudowane typy zasobów

Podstawowe lub wbudowane typy zasobów to gotowe typy zasobów lalek dostarczane z oprogramowaniem lalek. Wszystkie podstawowe lub wbudowane typy zasobów Puppet są pisane i utrzymywane przez zespół Puppet.

Typy zasobów zdefiniowane przez marionetkę

Zdefiniowane typy zasobów to lekkie typy zasobów napisane w deklaratywnym języku Puppet przy użyciu kombinacji istniejących typów zasobów.

Niestandardowe typy zasobów marionetek

Niestandardowe typy zasobów to całkowicie dostosowane typy zasobów napisane w języku Ruby.

Przyjrzyjmy się typom zasobów lalek…

W terminalu wpisz następujące polecenie, aby wyświetlić listę podpoleceń Puppet:

Puppet --help

Niestandardowe typy zasobów marionetek

W naszym przypadku interesuje nas podkomenda „Zasób”, którego użyjemy do znalezienia informacji o wbudowanych typach zasobów lalek.

W terminalu wpisz dowolne z następujących poleceń, aby wyświetlić listę działania powiązany z podkomendą marionetki „Zasób"

Puppet help resource		
Puppet resource --help		

Niestandardowe typy zasobów marionetek

W tym przypadku mamy Zasób jako podpolecenie i –typy jako działanie.

Puppet ma 49 wbudowanych typów zasobów podstawowych.

W terminalu wpisz następujące polecenie, aby wyświetlić listę dostępnych wbudowanych typów zasobów puppet:

puppet resource –types

Niestandardowe typy zasobów marionetek

Każdy typ obsługuje listę atrybuty. Te atrybuty zapewniają szczegółowy opis używany przez Puppet do zarządzania zasobem.

Aby dowiedzieć się wszystkich atrybutów powiązanych z typem zasobu puppet, użyj następującego polecenia:

puppet describe <resource type name>	

Parametry wyświetlą listę wszystkich dostępnych atrybutów dla tego typu zasobu.

marionetka opisuje pakiet

Niestandardowe typy zasobów marionetek

Dla nowej osoby trudno jest zrozumieć i powiązać wiele niezarządzanych plików kodu puppet. Tutaj potrzebujemy grupowania, aby połączyć operacje. Celem jest rozwiązanie pojedynczego problemu, takiego jak wszystkie operacje wymagane do skonfigurowania ssh na serwerze lub usłudze ntp lub kompletnego serwera WWW lub serwera bazy danych od podstaw.

Czym są zajęcia lalkowe?

Klasy marionetek to zbiór zasobów lalek połączonych w jedną całość.

Puppet wprowadził klasy, aby struktura mogła być ponownie wykorzystana i zorganizowana.

Najpierw musimy zdefiniować klasę, używając składni definicji klasy; klasy muszą być unikalne i można je zadeklarować tylko raz o tej samej nazwie:

class <class-name> {
<Resource declarations>
}

Przykład:

class ntpconfig {
    file {
        "/etc/ntp.conf": 
     ensure=> "present", content=> "server 0.centos.pool.ntp.org iburst\n",
    }
}

Do tej pory zdefiniowaliśmy tylko klasę, ale nigdzie jej nie używaliśmy. Oznacza to, że napisany przez nas kod nigdy nie zostanie wykonany, chyba że zadeklarujemy tę klasę gdzie indziej.

Deklaracja klasy

Aby użyć zdefiniowanej klasy w kodzie, użyj metody zawierać słowo kluczowe.

class ntpconfig {
    file {
        "/etc/ntp.conf": 
      ensure=> "present", 
      content=> "server 0.centos.pool.ntp.org iburst\n",
    }
}
include ntpconfig

Rozumiemy to na podstawie prawdziwego scenariusza.

Wersja demonstracyjna instalacji NTP

Najpierw upewnij się, że pakiet NTP nie znajduje się już na serwerze. Poniższe polecenie nie zwróci żadnych wyników, jeśli telnet nie znajduje się na serwerze:

rpm -qa | grep -i ntp

Demo Zainstaluj NTP

Jak widzimy, pakiet NTP jest już obecny na serwerze. Usuńmy istniejący pakiet NTP:

yum remove ntp

Po usunięciu pakietu upewnij się, że plik ntp.conf nie istnieje:

ls -lrt /etc/ntp.conf

Demo Zainstaluj NTP

Sprawdź, czy usługa NTP nie istnieje, uruchamiając następujące polecenie:

systemctl status ntp

Demo Zainstaluj NTP

Utwórz nowy plik .pp, aby zapisać kod. Z wiersza poleceń:

vi demontp.pp

Przejdź do trybu wstawiania, naciskając i na klawiaturze.

Wpisz poniższy kod, aby utworzyć nowy plik:

# Class Definition 
class ntpconfig {
    # Installing NTP Package 
  package {"ntp": 
    ensure=> "present",
    }
    # Configuring NTP configuration file 
  file {"/etc/ntp.conf": 
    ensure=> "present", 
    content=> "server 0.centos.pool.ntp.org iburst\n",
    }
    # Starting NTP services 
  service {"ntpd": 
    ensure=> "running",
    }
}

Po zakończeniu edycji: naciśnij klawisz esc

Aby zapisać plik, naciśnij :wq!

Następnym krokiem jest ZOBACZ czy kod ma jakieś błędy składniowe. Wykonaj następujące polecenie:

puppet parser validate demontp.pp

Upewnij się, że przełączyłeś się na korzeń aby móc ukończyć test bez żadnego błędu, wykonując polecenie:

su root

Testowanie jest kolejnym krokiem w procesie tworzenia kodu. Wykonaj następujące polecenie, aby wykonać test dymowy:

Puppet applies demontp.pp --noop

Ostatnim krokiem jest biegać marionetkę w trybie rzeczywistym i sprawdź wynik.

puppet apply demontp.pp

Puppet nic nie dał, bo zajęcia pokazowe były po prostu zdefiniowane ale nie Deklarowana.

Zatem dopóki nie zadeklarujesz klasy marionetki, kod nie zostanie zastosowany.

Przejdźmy ogłosić klasa demonstracyjna w tym samym kodzie przy użyciu zawierać nazwę klasy na końcu kodu:

# Class Definition 
class ntpconfig {
    # Installing NTP Package 
  package {"ntp": 
    ensure=> "present",
    }
    # Configuring NTP configuration file 
  file {"/etc/ntp.conf": 
    ensure=> "present", 
    content=> "server 0.centos.pool.ntp.org iburst\n",
    }
    # Starting NTP services 
  service {"ntpd": 
    ensure=> "running",
    }
}

# Class Declaration 
include ntpconfig

Ponownie ZOBACZ czy kod ma jakieś błędy składniowe. Wykonaj następujące polecenie:

puppet parser validate demontp.pp

Upewnij się, że przełączyłeś się na korzeń aby móc ukończyć test bez żadnego błędu, wykonując polecenie:

su root

Testowanie jest kolejnym krokiem w procesie tworzenia kodu. Wykonaj następujące polecenie, aby wykonać test dymowy:

Puppet apply demontp.pp --noop

Ostatnim krokiem jest biegać marionetkę w trybie rzeczywistym i sprawdź wynik.

puppet apply demontp.pp

Tym razem kod zostanie zastosowany, ponieważ klasa została zdefiniowana, a następnie zadeklarowana.

Demo Zainstaluj NTP

Upewnij się, że plik ntp.conf już istnieje:

ls -lrt /etc/ntp.conf

Sprawdź, czy usługa NTP została uruchomiona, uruchamiając następujące polecenie:

systemctl status ntpd

Demo Zainstaluj NTP