Zarządzanie konfiguracją „wielu administratorów na jednym serwerze”

9

Stworzyliśmy serwer, który obsługuje infrastrukturę dla małego stowarzyszenia. Do tej pory próbowaliśmy zarządzać konfiguracją za pomocą Ansible, ale nie był to duży sukces. Być może robimy to źle.

Zasadniczo chodzi o to, że ten serwer pozostanie sam przez większość czasu, a ludzie będą dodawać lub zmieniać rzeczy raz na niebieskim księżycu. To sprawia, że ​​ważne jest, aby wszystko, co jest skonfigurowane i działało na serwerze, było dobrze udokumentowane i przejrzyste, ponieważ osoby, które nie administrują często systemem, muszą stracić informacje ogólne (nie mówiąc już o szczegółach). Ponadto z czasem zmieni się skład grupy osób, które będą administrować tym serwerem (w miarę opuszczania i dołączania do „komitetu”).

Zaczęliśmy od czystej instalacji, dodając role w ansible, kiedy tylko chcieliśmy coś skonfigurować (nginx, phpfpm, postfix, firewall, sftp, munin, ..). Być może z powodu naszego braku doświadczenia, oczywiście nigdy nie jesteśmy w stanie wpisać zestawu odpowiadających zadań dokładnie tak, jak potrzebujemy, za jednym razem, również dlatego, że konfiguracja jest trochę procesem prób i błędów. Oznacza to, że w praktyce zwykle najpierw konfigurujemy dowolną usługę, którą chcemy uruchomić na serwerze , a następnie tłumaczymy na zadania odpowiadające. Możesz zobaczyć dokąd to zmierza. Ludzie zapominają następnie przetestować to zadanie lub boją się tego, ryzykując zepsucie rzeczy, lub gorzej: zapominamy lub zaniedbujemy dodawanie rzeczy do ansible.

Dzisiaj mamy bardzo małą pewność, że konfiguracja ansible faktycznie odzwierciedla konfigurację na serwerze.

Obecnie widzę trzy główne problemy:

  • Trudno jest (czytać: nie mamy dobrego sposobu) testować wykonalnych zadań bez ryzyka zepsucia.
  • Dodaje dodatkową pracę, aby najpierw ustalić pożądaną konfigurację, a następnie dowiedzieć się, jak przełożyć ją na zadania możliwe do wykonania.
  • (Idealnie) nie używamy go wystarczająco często, aby budować znajomość i rutynę.

Ważną kwestią jest to, że dla wszystkiego, co skończymy, początkującym powinno być łatwo nauczyć się lin bez mnóstwa ćwiczeń.

Czy istnieje realna alternatywa, która nadal zapewnia pewne gwarancje i kontrole (porównywalne do łączenia plików Ansible z niektórymi master), które „nie konfigurują rzeczy i zapisują to, co zrobiłeś”?

EDYCJA: Rozważaliśmy zobowiązanie się /etcdo git. Czy istnieje rozsądny sposób na ochronę tajemnic (klucze prywatne itp.) W ten sposób, ale nadal ma jakieś repozytorium konfiguracji dostępne poza serwerem?

Joost
źródło

Odpowiedzi:

10

Po prostu uruchom testową / testową maszynę wirtualną, której możesz użyć do sprawdzenia poprawności zmian. Twoja obecna metoda ręcznego wprowadzania zmian najpierw jest beznadziejnie zepsuta i skazana na niepowodzenie. Ty i twój zespół musicie zobowiązać się do prawidłowego korzystania z CM, a częścią tego jest udostępnienie systemu testowego. Wystarczy nawet lokalna włóczęga VM.

Pomoże to nie tylko w testowaniu nowych zmian, ale także posłuży jako miejsce testowe dla nowych pracowników (lub starszych pracowników, którzy nie korzystali z systemu od dłuższego czasu) w celu zapoznania się z konfiguracją ansible.

Odnośnie trzymania / etc / in git: nie, nie rób tego. Ten katalog to tylko niewielka część tego, co zmienia się w ansible, a posiadanie git tam tylko zachęci ludzi do wprowadzania lokalnych zmian.

Zachowaj swój grzeczny podręcznik. Zastanów się nad ograniczeniem uprawnień, aby tylko Ty możesz zastosować zmiany odpowiadające na serwerze na żywo. Inni mogą przesyłać żądania ściągania wraz z ich zmianami, które można przejrzeć i scalić w trybie głównym, jeśli to konieczne.

EEAA
źródło
Racja, to idealny scenariusz. Rozumiem. Chodzi o to, że nie jesteśmy firmą i nie mamy ludzi pracujących nad tym w pełnym wymiarze godzin. Być może wyjaśniłem skalę tego w niewystarczająco jasny sposób. Każda dodatkowa część (np. Plik Vagrantfile) zwiększa złożoność, którą należałoby przekazać, i uruchamianie dwóch konfiguracji (tj. Jednego systemu testowego, w którym należy wyśmiewać automatyzację Letsencrypt) nie wspomaga prostoty.
Joost
1
Prosiłeś o rozwiązanie swoich problemów, a ja udzieliłem odpowiedzi. Powyżej jest dokładnie, jak robimy rzeczy w mojej firmie, i działa bardzo dobrze. Tak, testowanie wiąże się z dodatkowymi kosztami miejsca i czasu, ale są one warte tego, ponieważ mamy bardzo wysoki poziom pewności, że w ciągu kilku minut możemy odbudować dowolny z naszych serwerów, jeśli zajdzie taka potrzeba.
EEAA,
3
Zasadniczo jest to problem kulturalny i związany z zasobami, a nie problem techniczny. Nie zobowiązałeś się do korzystania z zarządzania konfiguracją. To, czy jesteś firmą, nie ma znaczenia. Prosisz o pomoc w tym, jak właściwie robić rzeczy, a częścią tego jest środowisko sceniczne.
EEAA,
3
IMHO, tak, powinieneś się do tego zobowiązać. Jednak to, czy uda ci się przekonać kolegów, jest kolejnym pytaniem. Nie ma lekkiego sposobu na zrobienie tego, który nie wymaga pewnego poziomu celowości od osób zarządzających serwerem. Ze współczesnych systemów CM, ansible jest zdecydowanie najłatwiejszym sposobem na przyspieszenie. Ty nie chcesz śledzić zmiany serwera w czasie. Jedynym sposobem, aby to zrobić niezawodnie, jest użycie CM.
EEAA
4
@ThomWiggers Zakładam, że jesteście w tym samym zespole, ponieważ użyliście „my”. OK, zapytałeś, jak to zrobić poprawnie. Dałem odpowiedź. Albo chcesz to zrobić poprawnie, albo nie. Właściwe wykonywanie CM wymaga czasu, pieniędzy i celowości. Jeśli masz wymagania, takie jak zamawianie i wdrażanie certyfikatów za pośrednictwem LE, stań na maszynie wirtualnej za 5 USD / miesiąc za pomocą Digital Ocean i użyj jej do testowania. Do cholery, możesz nawet wdrożyć go na żądanie, gdy chcesz przetestować zmiany, a następnie zabić.
EEAA
6

Być może z powodu naszego braku doświadczenia, oczywiście nigdy nie jesteśmy w stanie wpisać zestawu odpowiadających zadań dokładnie tak, jak potrzebujemy, za jednym razem, również dlatego, że konfiguracja jest trochę procesem prób i błędów. Oznacza to, że w praktyce zwykle najpierw konfigurujemy dowolną usługę, którą chcemy uruchomić na serwerze, a następnie tłumaczymy na zadania odpowiadające.

Chociaż istnieją inne problemy (takie jak brak środowiska testowego), możesz znacznie poprawić, nie robiąc tego .

Jednym z głównych celów projektu Ansible jest bycie idempotentnym , co oznacza, że ​​wielokrotne uruchamianie twojego playbooka nie powinno niczego zmieniać (chyba że zmieniłeś gry). Tak więc, kiedy konfiguruję nowe oprogramowanie, moje kroki to:

  1. Wprowadź zmiany w zadaniach Ansible.
  2. Uruchom poradnik.
  3. Sprawdź system, a jeśli nie jest poprawny, wróć do kroku 1.
  4. Zatwierdź moje zmiany.

Jeśli nie sądzisz, że po raz pierwszy napiszesz poprawną rzecz w Ansible, napisz to i tak i powtarzaj, aż będzie w porządku, tak jak każdy inny kod. To znacznie zmniejsza szansę zapomnienia o Ansiblize niektórych zmian, które wprowadziłeś, ponieważ każda zmiana, którą wprowadziłeś, była już w Ansible na pewnym etapie procesu rozwoju.

Bojkot SE dla Moniki Cellio
źródło
Tak, to świetna rada. Wykonanie tego i upewnienie się, że zawsze możesz przywrócić serwer do znanego dobrego stanu, jest bardzo uwalniające - jeśli wszystko pójdzie na południe, po prostu nuke serwera i uruchom ponownie.
EEAA
Zgadzam się, że jest to bardzo solidny środek między tym, gdzie jesteśmy teraz, a tym, gdzie powinniśmy być. Oczywiście tak zaczęliśmy. Przypuszczam, że głównym powodem, dla którego podeszliśmy do miejsca, w którym jesteśmy teraz, jest to, że krok 2 spowodował, że cały cykl trwał zbyt długo. Możliwe, że źle robiliśmy podręczniki. Teraz, gdy trochę bardziej opanowaliśmy pisanie zadań Ansible, warto jednak spróbować ponownie. Z twojego doświadczenia wynika, ile czasu zajmie pełny cykl i jak często będzie się powtarzał? Zdaję sobie sprawę, że wszelkie liczby będą oparte na wszelkiego rodzaju założeniach.
Joost,
2
Inny problem, który napotkałem podczas tego iteracyjnego procesu, występuje, gdy piszesz zadanie, które wprowadza zmiany, wprowadza zmiany na serwerze, odkrywa, że ​​zmiany są nieprawidłowe, aktualizujesz swoje zadanie i ponownie stosujesz podręcznik. Teraz serwer zawiera mieszankę dwóch zestawów zmian: tych z pierwszej iteracji zadania i tych z drugiego. Zwykle druga iteracja zastępuje pierwszą, ale niekoniecznie zawsze. Czy istnieje rozsądny sposób na „wyczyszczenie” zamiast 1) ręcznego SSH w celu cofnięcia lub 2) rozpoczynania od czystej instalacji za każdym razem?
Joost
Dodatkowo, nukowanie serwera często nie jest trywialne, jeśli masz tylko jeden
Thom Wiggers,
„Z twojego doświadczenia wynika, ile czasu zajmuje pełny cykl i jak często się iteruje?” - Zacząłem używać Ansible w styczniu; mniej więcej w czerwcu doszedłem do momentu, w którym w przypadku większości zadań szybciej wykonuję cały proces w Ansible niż ręcznie. Konkretny czas zależy oczywiście od projektu, od kilku minut do kilku tygodni (w przypadku niektórych szczególnie uciążliwych programów). Jeśli okaże się, że działanie samego playbooka spowalnia cię, możesz rozważyć użycie tagów do uruchamiania podzbioru tylko podczas pętli iteracji.
Bojkot SE dla Moniki Cellio
0

Ansible ma czas na rozruch, zanim przekroczysz swój poprzedni poziom produktywności, ale kiedy to zrobisz, stan systemu jest łatwy do zapewnienia. Twoje praktyki wydają się być niezsynchronizowane z celami końcowymi. Możesz być produktywny dzięki zestawowi narzędzi CM, zachowując solidne praktyki inżynieryjne, ale jego prawidłowe ułożenie zajmuje trochę czasu. Zasadniczo handlujesz wydajnością i łatwością wdrożenia, dla stabilności i skalowalności przedsiębiorstwa. Dokładnie tak samo, jak doświadczony profesjonalny programista nie pisze brzydkich hacków, konsekwencje zawsze przeważają nad korzyściami.

Na początek możesz mieć zbyt wielu kucharzy, bez wyraźnego prawa własności, jeśli tak, spodziewaj się tragedii społeczności. Każdy priorytet biznesowy przebije obawy związane z inżynierią systemu za każdym razem, chyba że zostanie on szeroko rozbrojony, a to, co pozostanie, odbije się bezpośrednio na odpowiedzialnym inżynierze.

Zestaw narzędzi CM nie może być zaprojektowany przez administratorów, właśnie to sobie uświadomiłem. Mogą ponownie wykorzystać istniejącą pracę lub MOŻLIWE rozciągać się na solidne podstawy, ale nawet wtedy wymagałoby to uciążliwej ilości egzekwowania praktyk. To, co może zrobić inżynier, to po prostu NIE to, co może zrobić administrator. Wiele pojęć w Ansible jest prawie takich samych, jak w bazie kodu, czy możesz nauczyć pytona administratora i oczekiwać właściwych wyników? Nie, z całą pewnością nie, spodziewałbym się włamania, więc musisz ustawić to zadanie na tyle, aby włamanie było możliwe.

Musisz więc przygotować rzeczy do sukcesu, opracować rozwiązania dla punktów niepotrzebnej administracji. Wymień złożoność systemów niskiego poziomu na rzeczy, które administrator może faktycznie z powodzeniem zrobić. Zestaw narzędzi CM NIE uchroni Cię przed niedopasowaniami architektonicznymi lub projektowymi.

Więc porządek podlega modyfikacji, oczywiście ponieważ implementacja zależy od tego, która ścieżka jest najmniej zakłócająca dla twojego obecnego stanu.

  1. Przenieś dowolną pracę związaną z przepływem pracy związaną z biznesem do dedykowanego zestawu.

  2. Rozdziel zadania na pudełku, możesz mieć teraz dwa lub więcej pudełek w jednym.

  3. Reimplementuj swoje CM w bardziej uporządkowany sposób i postępuj zgodnie z lepszymi praktykami, podręczniki reprezentujące obiekty, NIE funkcje lub role. Każdy system powinien być opisany w jednej grze.

JM Becker
źródło