Opcje wysokiej dostępności dla wielu witryn z Puppet

14

Utrzymuję dwa centra danych, a ponieważ większa część naszej ważnej infrastruktury zaczyna być kontrolowana przez marionetkę, ważne jest, aby mistrz marionetek pracował w drugim miejscu, w przypadku awarii naszego głównego miejsca.

Jeszcze lepiej byłoby mieć rodzaj aktywnej / aktywnej konfiguracji, aby serwery w drugiej lokacji nie odpytywały sieci WAN.

Czy są jakieś standardowe metody wysokiej dostępności kukiełek w wielu miejscach?

Kyle Brandt
źródło
1
Czy zrozumiałem twoje pytanie, prawda? Szukasz sposobu na zbędnego mistrza marionetek na wypadek, gdyby mistrz marionetek był niedostępny?
Hrvoje Špoljar
To zależy od tego, jak używasz marionetki. Istnieje duża elastyczność. Na przykład używasz zapisanych konfiguracji?
Zoredache
3
Czy spojrzałeś na „mistrza marionetek”? Istotą tego jest to, że każdy agent ma kasę manifestów i stosuje je lokalnie. Skończysz z gitlub svnlub rsyncjakimkolwiek innym systemem kontroli wersji, którego używasz, będąc tym, czego potrzebujesz do skalowania, a nie marionetkowym mistrzem.
Ladadadada,
3
Tylko wskazówka rozwiązująca aktywne-aktywne pytanie: Przy pomocy anycast można ogłosić ten sam ( „wirtualny” / „serwis-” ) adres IP z obu centrów danych. Robimy to dla naszych serwerów DNS. W każdym centrum danych nasi loadbalancerzy ogłaszają ten sam anycast IP. Nasz routing preferuje lokalny moduł równoważenia obciążenia, ale w przypadku awarii wraca do innych kontrolerów domeny (~ „nie zapowiada już anycast IP”).
Michuelnik
1
Widzę, że jedną z nowych funkcji marionetek 3.0 jest obsługa rekordów SRV , coś, co ludzie Windows znają i mogą pomóc w tworzeniu witryn.
sysadmin1138

Odpowiedzi:

13

Marionetka w rzeczywistości nadaje się całkiem dobrze do środowisk z wieloma mistrzami, z pewnymi zastrzeżeniami. Główny? Wiele części Lalek lubi być scentralizowanych. Urząd certyfikacji, usługi związane z inwentaryzacją i pulpitem nawigacyjnym / raportowaniem, gromadzeniem plików i przechowywanymi konfiguracjami - wszystkie są w najlepszej formie (lub po prostu wymagają) konfiguracji, w której jest tylko jedno miejsce do rozmowy.

Jest jednak całkiem wykonalne, aby wiele ruchomych części pracowało w środowisku z wieloma wzorcami, jeśli nie masz nic przeciwko płynnej utracie niektórych funkcji po utracie głównej witryny.


Zacznijmy od podstawowej funkcji, aby węzeł raportował do mastera:

Moduły i manifesty

Ta część jest prosta. Kontrola wersji. Jeśli jest to rozproszony system kontroli wersji, po prostu scentralizuj i zsynchronizuj oraz odpowiednio zmodyfikuj przepływ push / pull w witrynie trybu failover. Jeśli jest to Subversion, prawdopodobnie będziesz chciał svnsyncrepozytorium na swojej stronie trybu failover.

Urząd certyfikacji

Jedną z opcji jest tutaj synchronizacja plików urzędu certyfikacji między wzorcami, aby wszystkie miały ten sam certyfikat główny i mogły podpisywać certyfikaty. Zawsze wydawało mi się, że „robię to źle”;

  • Czy jeden master powinien naprawdę widzieć swój certyfikat prezentowany w autoryzacji klienta dla połączenia przychodzącego z innego master jako ważny?
  • Czy to niezawodnie zadziała w przypadku usługi inwentaryzacji, deski rozdzielczej itp.?
  • Jak dodać dodatkowe prawidłowe nazwy alternatywne DNS w dalszej części drogi?

Nie mogę szczerze powiedzieć, że dokładnie przetestowałem tę opcję, ponieważ wydaje się to okropne. Jednak wydaje się, że Puppet Labs nie chcą zachęcać do tej opcji, zgodnie z notatką tutaj .

Więc to, co pozostawia, to mieć centralnego mistrza CA. Wszystkie relacje zaufania działają nadal, gdy urząd certyfikacji jest wyłączony, ponieważ wszyscy klienci i inni mistrzowie buforują certyfikat urzędu certyfikacji i listę CRL (chociaż nie odświeżają listy CRL tak często, jak powinni), ale nie będzie można podpisywać nowych certyfikatów, dopóki odzyskujesz główną witrynę lub przywracasz główny urząd certyfikacji z kopii zapasowych w witrynie przełączania awaryjnego.

Wybierz jednego wzorca, który będzie pełnił rolę urzędu certyfikacji, i wyłącz wszystkie pozostałe wzorce:

[main]
    ca_server = puppet-ca.example.com
[master]
    ca = false

Następnie chcesz, aby ten system centralny pobierał cały ruch związany z certyfikatem. Jest na to kilka opcji;

  1. Użyj obsługi nowego SRVrekordu w 3.0, aby skierować wszystkie węzły agenta we właściwe miejsce dla urzędu certyfikacji -_x-puppet-ca._tcp.example.com
  2. Ustaw ca_serveropcję konfiguracji we puppet.confwszystkich agentach
  3. Proxy cały ruch dla żądań związanych z urzędami certyfikacji od agentów do właściwego wzorca. Na przykład, jeśli uruchamiasz wszystkie swoje serwery główne w Apache przez pasażera, skonfiguruj to na urządzeniach innych niż CA:

    SSLProxyEngine On
    # Proxy on to the CA.
    ProxyPassMatch ^/([^/]+/certificate.*)$ https://puppet-ca.example.com:8140/$1
    # Caveat: /certificate_revocation_list requires authentication by default,
    # which will be lost when proxying. You'll want to alter your CA's auth.conf
    # to allow those requests from any device; the CRL isn't sensitive.
    

I to powinno wystarczyć.


Zanim przejdziemy do usług pomocniczych, notatka dodatkowa;

Nazwy DNS dla certyfikatów głównych

Myślę, że właśnie tutaj jest najbardziej przekonujący powód przejścia na wersję 3.0. Powiedzmy, że chcesz wskazać węzeł na „dowolnego mistrza roboczego”.

W wersji 2.7 potrzebujesz ogólnej nazwy DNS puppet.example.com, a wszyscy mistrzowie potrzebują jej w swoim certyfikacie. Oznacza to ustawienie dns_alt_namesw ich konfiguracji, ponowne wystawienie certyfikatu, który mieli przed skonfigurowaniem go jako wzorca, ponowne wystawienie certyfikatu ponownie, gdy trzeba dodać nową nazwę DNS do listy (na przykład, jeśli chcesz wielu nazw DNS, aby agenci wolą mistrzów na swojej stronie) .. brzydkie.

W wersji 3.0 możesz używać SRVrekordów. Daj to wszystkim swoim klientom;

[main]
    use_srv_records = true
    srv_domain = example.com

Zatem nie są wymagane specjalne certyfikaty dla mistrzów - po prostu dodaj nowy rekord do swojego SRVRR na _x-puppet._tcp.example.comi jesteś gotowy, to mistrz na żywo w grupie. Co więcej, możesz łatwo uczynić logikę wyboru głównego bardziej wyrafinowaną; „dowolny stary mistrz pracy, ale wolisz ten w swojej witrynie”, ustanawiając różne zestawy SRVrekordów dla różnych witryn; nie dns_alt_namespotrzebne


Raporty / pulpit nawigacyjny

Ten działa najlepiej scentralizowany, ale jeśli możesz żyć bez niego, gdy Twoja podstawowa strona nie działa, nie ma problemu. Po prostu skonfiguruj wszystkich swoich mistrzów w odpowiednim miejscu do umieszczenia raportów.

[master]
    reports = http
    reporturl = https://puppetdash.example.com/reports/upload

... i wszystko gotowe. Nieprzesłanie raportu nie jest krytyczne dla uruchomienia konfiguracji; po prostu przepadnie, jeśli toast serwera deski rozdzielczej.

Inwentaryzacja faktów

Kolejną miłą rzeczą, którą przykleiłem do deski rozdzielczej, jest usługa inwentaryzacji. Przy facts_terminusustawieniu na restzalecanym w dokumentacji spowoduje to przerwanie uruchamiania konfiguracji, gdy centralna usługa spisu jest wyłączona. Sztuczka polega na tym, aby użyć inventory_serviceterminala na nie-centralnych masterach, co pozwala na pełną wdzięku porażkę.

facts_terminus = inventory_service
inventory_server = puppet-ca.example.com
inventory_port = 8140

Ustaw centralny serwer zapasów w taki sposób, aby przechowywał dane zapasów za pośrednictwem ActiveRecord lub PuppetDB i powinien być na bieżąco, gdy usługa będzie dostępna.


Tak więc - jeśli nie masz nic przeciwko temu, aby przejść do całkiem przyzwoitego środowiska zarządzania konfiguracją, w którym nie możesz nawet użyć urzędu certyfikacji do podpisania certyfikatu nowego węzła, dopóki nie zostanie przywrócony, to może to działać dobrze - choć byłoby naprawdę fajnie jeśli niektóre z tych komponentów były nieco bardziej przyjazne dla dystrybucji .

Shane Madden
źródło
1
+1 za rzeczy z CA. Pamiętaj, że możesz zsynchronizować / kontrolować wersję wszystkich gadżetów CA i po prostu nie aktywować żadnego z nich w „rezerwowych” puppetmastersach, dopóki nie pojawi się sytuacja przełączenia awaryjnego (w tym momencie podkręcasz bity CA na nowym „master” i aktualizujesz SRVrekord odpowiednio - SRVzapisy wydają mi się tutaj najbardziej eleganckim rozwiązaniem pomimo mojej ogólnej ambiwalencji wobec nich ...)
voretaq7
1
@ voretaq7 To dobra uwaga - konfiguracja polegająca wyłącznie na przełączaniu awaryjnym byłaby o wiele mniej pracochłonna niż tego rodzaju aktywne / aktywne wdrożenie.
Shane Madden
2
Jako dodatek dodałem również aktualizację do podręcznika skalowania z wieloma wzorcami
Shane Madden
8

Podejście „mistrzowskiej marionetki”, które opisuje Ladadadada, jest tym, które znam najbardziej (jest to w zasadzie to, co robimy z radmindem w mojej firmie). Myślę, że dokładniej jest to „Wielu mistrzów zsynchronizowanych przez proces zewnętrzny”, gdzie każdy serwer mógłby (teoretycznie) służyć naszemu wszechświatowi w nagłych wypadkach.

W naszym przypadku ze względu na naturę radmind po prostu rsynctranskrypty i pliki danych z zatwierdzonego urządzenia głównego na serwer radmind każdego zdalnego serwisu, a klienci pobierają swoje aktualizacje z serwera o krótkiej radmindnazwie hosta (dzięki magii resolv.confto ocenia radmind.[sitename].mycompany.com- zawsze lokalny serwer radmind. Jeśli serwer lokalny jest wyłączony, łatwo jest go zastąpić i wskazać na serwer innej witryny).

Ten rodzaj procesu rsync prawdopodobnie działałby również w twojej sytuacji, ale prawdopodobnie jest on nieoptymalny w porównaniu do rozwiązania opartego na kontroli wersji.


Dla lalek lub szefa kuchni system oparty na kontroli wersji ma więcej sensu niż prosty rsync z kilku powodów - dużym z nich jest to, że kontrolujesz wersje skryptów lalkowych (zamiast całych obrazów systemu operacyjnego, tak jak w przypadku radmind).
Jako dodatkowe korzyści związane z zarządzaniem opartym na kontroli wersji, możesz mieć wielu ludzi pracujących nad repozytorium naraz (świetna wygrana dla równoległości), dostajesz historię zmian zasadniczo za darmo, a jeśli ktoś złamie środowisko Puppet, możesz łatwo wycofać (zakładając, że „ ponownie używasz gitmasz również, git blameco robi to, co jest napisane na puszce).
Twórcze rozgałęzianie i łączenie pozwala nawet obsłużyć znaczną aktualizację systemu operacyjnego lub inne przejście w ramach kontroli wersji - kiedy już to zrobisz, po prostu przełącz się na nową gałąź i (mam nadzieję), że produkcja zacznie działać.

Gdybym to tutaj wdrożył, prawdopodobnie skorzystałbym z haków przed zatwierdzeniem i po zatwierdzeniu w git, aby upewnić się, że zatwierdzone konfiguracje marionetek są rozsądne (po stronie klienta) i wypchnąć je do reszty wszechświata, jeśli są (po stronie serwera - prawdopodobnie również uruchamiają aktualizację środowiska, jeśli zasady wdrażania zezwalają na takie zachowanie).

Jeśli chodzi o uruchamianie nowych serwerów puppetmaster w każdej witrynie, możesz po prostu sprawdzić środowisko kukiełkowe dla każdego zdalnego puppetmaster i użyć albo hackery resolv.conf / hostname, który opisałem powyżej, albo adresów IP usługi anycast przekierowanych do systemów lokalnych, jak sugerował Michuelnik ( ta ostatnia jest przydatna, jeśli chcesz automatycznego przełączania awaryjnego, jeśli jeden z puppetmasterów jednej strony wysadzi się w powietrze), aby upewnić się, że każda strona widzi „właściwego” puppetmaster i nie zatyka linków WAN, próbując uzyskać aktualizacje.


Ludzie z Brain Tree Payments najwyraźniej połączyli kontrolę wersji i rozwiązania rsync z niektórymi niestandardowymi zadaniami Capistrano - ich rozwiązanie wydaje się być na wpół wypalone w tym sensie, że nadal opiera się na ręcznych elementach przepływu pracy, ale można je dostosować i zautomatyzować bez za dużo pracy.
Paranoiczny kompulsywny tester ma we mnie zamiłowanie do noopkroku sprawdzania rozsądku - nie znoszę ręcznych procesów życzy sobie pewnego poziomu automatyzacji wokół niego ...

voretaq7
źródło