Aktualizacje systemu dla wielu serwerów

11

Mamy wiele serwerów i nadal chcemy je wszystkie aktualizować. Rzeczywisty sposób jest taki, że którykolwiek z sysadminów przechodzi z serwera na serwer i robi aptitude update && aptitude upgrade- wciąż nie jest fajny.

Szukam teraz rozwiązania, które jest jeszcze lepsze i bardzo inteligentne. Czy marionetka może to zrobić? Jak ty to robisz?

Dennis Wisnia
źródło
tak, marionetka może to zrobić. cssh również naprawi twój problem w krótkim okresie.
Sirex,

Odpowiedzi:

10

Możesz użyć exectakiego typu, jak:

exec { "upgrade_packages":
    command => "apt-get upgrade -q=2",
    path    => "/usr/local/bin/:/bin/:/usr/bin/",
    # path  => [ "/usr/local/bin/", "/bin/" ],  # alternative syntax
}

Szczerze mówiąc, sam tego nie próbowałem, ale myślę, że wystarczy utworzyć nowy moduł, który zawiera taką definicję exec.

apt-get upgradeKomenda jest interaktywny. Aby działał cicho, możesz dodać opcję, -q=2jak pokazano powyżej.

Khaled
źródło
wygląda bardzo dobrze! Wydaje mi się, że tworzę skrzynkę marionetek z kilkoma maszynami testowymi, aby tego spróbować. Wielkie dzięki!
Dennis Wisnia
3
+1 za polecenie Puppet! Zmienia twoje życie jako sysadmin :)
Antoine Benkemoun
3
Pamiętaj, że ten exec będzie działał przy każdym uruchomieniu Puppet (co 30 minut), co może mocno utrudnić działanie serwera proxy i / lub kopii lustrzanej, jeśli masz „dużo serwerów”. Osobiście polecam wdrożenie harmonogramu dla powyższego typu exec, upewniając się, że działa on na przykład tylko w nocy. Moim zdaniem jednak Puppet ma na celu wymuszenie stanu systemu, a uruchomienie polecenia podobnego do upgrade_packages bez nadzoru przez człowieka jest zarówno przerażające, jak i trochę nadużywanie Puppet. Lepszym rozwiązaniem może być narzędzie mColective dostarczane z Puppet Enterprise (lub jego odpowiednikiem typu open source).
wzzrd
7
Nasza instalacja marionetek ma podobny exec, który sprawdza znacznik czasu w pliku i uruchamia aktualizację, tylko jeśli jest nowsza niż wersja na kliencie. Kiedy chcemy wszystko uaktualnić, zapisujemy touchto w marionetkowym mistrzu.
Ladadadada,
@wzzrd: Dobra uwaga, ale można to poprawić, sprawdzając niektóre warunki zewnętrzne, jak powiedział Ladadadada.
Khaled
7

jeśli wszystkie hosty są debianem, możesz wypróbować pakiet aktualizacji nienadzorowanych.

http://packages.debian.org/sid/unattended-upgrades

Tutaj używamy marionetki do zarządzania naszymi wirtualnymi maszynami debiana, dzięki marionetce jesteśmy w stanie włączyć i zarządzać konfiguracjami bez aktualizacji na wszystkich serwerach.

Ostatnio nasz zespół testuje narzędzie mcollective do uruchamiania poleceń na wszystkich serwerach, ale do korzystania z mcollective potrzebne są umiejętności ruby.

[s] Guto

gutocarvalho
źródło
5

Polecam wybranie Puppet, facter i mCollective.

mCollective to bardzo fajny framework, w którym można uruchamiać polecenia na szeregu hostów (równolegle), używając factera jako filtra.

Dodaj do tego lokalny serwer proxy / pamięć podręczną, a będziesz dobrze skonfigurowany do zarządzania serwerami.

CloudWeavers
źródło
Zgadzam się, Puppet nie jest tak naprawdę najlepszym narzędziem do zarządzania działaniami administracyjnymi, takimi jak masowe / koordynowane aktualizacje pakietów.
robbyt
3

Użyj narzędzia stworzonego do uruchamiania jednego polecenia na wielu serwerach. I przez to nie mam na myśli, że terminale kazillion są otwarte przy użyciu Terminatora lub ClusterSSH, ale zamiast tego mam jeden terminal do serwera zarządzania z uruchomionym narzędziem odpowiednim do tego zadania.

W tym kontekście polecam func, Salt lub mCollective. Jeśli masz już Puppet, wybierz mCollective (ładnie integruje się z Puppet). Jeśli nie masz i masz starego Pythona na swoich komputerach, możesz cieszyć się func. Jeśli pytasz w nowym języku, spróbuj Salt. Wszystkie te narzędzia uruchamiają polecenie określone w wierszu poleceń asynchronicznie, co jest o wiele przyjemniejsze niż sekwencyjna pętla ssh lub nawet wykonywanie tych samych poleceń w wielu oknach Terminatora na wielu serwerach.

Na pewno pokochasz sól .

wzzrd
źródło
2

Sądzę więc, że istnieje wiele rzeczy, które przyczyniają się do dobrego rozwiązania:

  • Pasmo
  • Łatwość administracji
  • Szczegółowe logowanie na wypadek, gdyby coś popsuło.

Przepustowość : W zasadzie przychodzą mi na myśl dwie alternatywy oszczędzania przepustowości:

  • Konfigurowanie kopii dystrybucyjnej Debiana i skonfigurowanie wszystkich klientów do korzystania z kopii dystrybucyjnej można znaleźć na stronie http://www.debian.org/mirror/, aby uzyskać więcej informacji. (Poleciłbym to)
  • Konfigurowanie serwera proxy (apt-cacher, apt-proxy lub Squid) i zwiększanie pamięci podręcznej, aby wszyscy klienci mogli czerpać z niej korzyści

Administracja : skonfigurowałbym powłokę równoległą, taką jak PDSH , PSSH , GNU Parallel i wydałbym polecenie na wszystkich klientach, jeśli testowałem polecenie wcześniej na przykładowej maszynie. To mało prawdopodobne, że może zawieść na wszystkich innych. Alternatywnie możesz rozważyć zadanie crona na wszystkich klientach, ale wtedy może się ono nie powieść automatycznie, więc wolałbym pierwsze rozwiązanie.

Jeśli obawiasz się jednoczesności aktualizacji, możesz zaplanować swoje polecenia at

Rejestrowanie : Podobnie jak w przypadku równoległych powłok, masz możliwość przekierowania danych wyjściowych. Połączę stderr i stdout i zapiszę je w pliku dziennika.

matematyka
źródło
Przepustowość: istnieją proxy buforujące specyficzne dla repozytoriów deb, poszukaj apt-cache lub apt-proxy.
S19N
Świetnie włączę to do odpowiedzi.
matematyka
a oprogramowanie, takie jak mCollective, umożliwia wykonywanie równoległych poleceń ORAZ raportowanie wyniku / wyniku.
CloudWeavers
1

Moje własne równoległe opakowanie ssh: classh jest alternatywą dla różnych narzędzi ssh równoległych i klastrowych.

Może ci się to bardziej podoba lub nie. Są tylko trzy powody, o których tu wspominam:

  • Jest niezwykle prosty w instalacji i użyciu: pojedynczy plik .py bez zewnętrznych zależności poza standardowymi bibliotekami Python 2.5.
  • Jest niezwykle niezawodny w swoich granicach. Używam go każdego dnia roboczego, często prawie 100 razy dziennie i zwykle w kolekcjach od setek do kilku tysięcy celów na polecenie. (Testowałem to na listach docelowych ponad 25 tysięcy serwerów jednocześnie). Nigdy nie przestał działać, nie ukończył się ani nie dał mi żadnego nieokreślonego zachowania. (Jedyne ograniczenia związane z ograniczeniami subprocess.communicate()metody Pythona --- więc można uzyskać przechwytywanie tylko około 64 000 stdout i osobno do 64 000 stderr, na przykład; również każdy zdalny proces, który próbuje odczytać ze swojego stdin, po prostu utknie w martwym punkcie do czasu zabicia lokalnego subporcesu ssh, automatycznie przez obsługę limitu czasu classh )
  • Bardzo łatwo jest napisać własny skrypt w Pythonie, aby użyć classh.py jako modułu. Więc bardzo łatwo jest napisać coś takiego:

    
        !#/bin/env python
        import classh
        job = classh.SSHJobMan(cmd, targets)
        job.start()
        while not job.done():
            completed = job.poll()
            for i in completed:
                # do something with the classh.JobRecord object referenced by i
        # done

    # You can optionally do post-processing on the dictionary of JobRecords here # keyed off the target strings (hostnames) </code></pre>

To wszystko. Na przykład w zagnieżdżonej zakończonej pętli można zebrać listę wszystkich, które zwróciły określony status wyjścia lub skanować w poszukiwaniu określonych komunikatów o błędach, i skonfigurować kolejne zadania, aby sobie z nimi poradzić. (Zadania będą uruchamiane jednocześnie, domyślnie 100 zadań w dowolnym momencie, aż do zakończenia każdego; więc proste polecenie na kilkuset hostach zwykle kończy się w ciągu kilku sekund, a bardzo złożony skrypt powłoki w jednym długim ciągu poleceń. powiedzmy, że około pięćdziesięciu wierszy ... może ukończyć kilka tysięcy hostów w około 10 minut ... około 10 tysięcy hostów na godzinę w moim środowisku, przy czym wiele z nich znajduje się międzykontynentalnie).

Może to być coś, co możesz wykorzystać jako środek ad hoc, dopóki nie zaimplementujesz konfiguracji marionetek i nie sprawdzisz testów ... a także bardzo przydatne do przeprowadzania niewielkich ankiet ad hoc u gospodarzy, aby zobaczyć, które odbiegają od twoich standardów w różne małe sposoby.

Jim Dennis
źródło
Nawiasem mówiąc, na stronach klasyh, na bitbucket.org, jest też lista różnych innych opakowań ssh, które przeglądałem, zanim zdecydowałem się napisać własne. Każdy z nich może działać dla Ciebie. Dodatkowo możesz wyszukać Python Fabric, który jest nowszym projektem z podobnymi, choć nieco bardziej rozbudowanymi i nieco bardziej złożonymi funkcjami.
Jim Dennis
1

Odpowiedź przy użyciu exec jest bardzo pomocna.

Jednak zgodnie z instrukcją apt-get nie warto używać opcji -q = 2 w ten sposób (chociaż korzystałem z niej od lat bez problemów)

-q, --quiet
       Quiet; produces output suitable for logging, omitting progress indicators. More q's will produce more quiet up to a maximum of 2. You can also use -q=# to set the
       quiet level, overriding the configuration file. Note that quiet level 2 implies -y, you should never use -qq without a no-action modifier such as -d, --print-uris or
       -s as APT may decided to do something you did not expect. Configuration Item: quiet.

Sam korzystam ze skryptu od lat, uruchamiając apt-get w następujący sposób:

ssh example.org "apt-get update && apt-get -y upgrade && apt-get -y dist-upgrade && apt-get clean"

Rzeczy takie jak marionetka i inne narzędzia, o których ludzie wspominali, mogą działać, ale wydaje się, że to przesada, ponieważ w zasadzie naśladuje kilka poleceń wpisanych przez człowieka. Wierzę w użycie najprostszego narzędzia do konkretnego zadania, w tym przypadku skrypt bash jest tak prosty, jak to tylko możliwe, bez utraty funkcjonalności.

aseq
źródło
Tak, myślę, że to dobry sposób na niektóre Serwery. Ale jeśli powinienem uzyskać więcej opcji (wdrożenie konfiguracji na każdym serwerze itp.), To jego marionetka jest naprawdę lepszym sposobem. W tej chwili pracuję nad marionetką i jej pięknymi ...
Dennis Wisnia
Nie zgadzam się Ale dla celów tego, o co pytał plakat, może to być przesada.
aseq
1

Od lat z radością aktualizuję i instaluję pakiety za pomocą apt-dater . Jest to lekkie i skuteczne narzędzie do zdalnego zarządzania pakietami. Wykorzystuje on screen, sudoi ssh.
W przypadku zarządzania pakietami apt-dater może być łatwiejszym rozwiązaniem niż narzędzia do zarządzania konfiguracją.
apt-dater jest przydatny do scentralizowanego zarządzania pakietami w różnych wersjach GNU / Linux, takich jak Debian i CentOS.

Onlyjob
źródło
1

możesz użyć tkaniny . Fabric to biblioteka Pythona (2.5–2.7) i narzędzie wiersza polecenia do usprawnienia korzystania z SSH do wdrażania aplikacji lub zadań administracyjnych w systemie.

obywatel
źródło
0

użyj webmin ,, i użyj funkcji klastra webmin, w której możesz dodać wszystkie systemy do jednej konsoli webmin i wydać im dowolne polecenie lub kontrolować je wszystkie z jednego miejsca.

Lub

Użyj klastra ssh

Lub

PSSH

Farhan
źródło
Tak, naprawdę mogę otworzyć wiele okien i mogę pracować w tym równolegle. Cluster SSH jest całkiem fajny, ale myślę, że nie jest wystarczająco inteligentny.
Dennis Wisnia
0

Innym rozwiązaniem, jeśli na wszystkich hostach działa Debian (lub pochodne), jest użycie pakietu cron-apt . Jednak, jak sugeruje dokumentacja, należy zachować ostrożność.

Obecnie używam cron-apt na kilkunastu serwerach do wykonywania wszystkich aktualizacji bezpieczeństwa automatycznie i bez nadzoru. Aby uniknąć niechcianych aktualizacji, używam cron-apt tylko na serwerach, na których działa stabilna dystrybucja Debiana i upewniam się, że skonfigurowałem swoje źródła apt, więc używaj nazwy dystrybucji, wheezy , a nie jej aliasu (stabilny).

Konkretna konfiguracja cron-apt, której używam, jest podsumowana w jednym pliku akcji: /etc/cron-apt/action.d/5-install

dist-upgrade -y -o APT::Get::Show-Upgraded=true -o Dir::Etc::SourceList=/etc/apt/sources.list.d/security.list -o Dir::Etc::SourceParts="/dev/null"

Wszelkie inne aktualizacje są wykonywane ręcznie, przy użyciu ekranu lub innego najbardziej odpowiedniego rozwiązania, ponieważ może wymagać ręcznej interwencji podczas aktualizacji.

Tonin
źródło