Zarządzanie konfiguracją: topologia oparta na push i pull

22

Bardziej znane systemy zarządzania konfiguracją (CM), takie jak Puppet i Chef, wykorzystują podejście oparte na ciągnięciu: klienci okresowo odpytują scentralizowanego mastera w celu uzyskania aktualizacji. Niektóre z nich oferują masterless podejścia, jak również (tak, push-based), ale stwierdza, że jest to „nie do produkcji” (Saltstack) lub „mniej skalowalne” (Lalek). Jedyny znany mi system oparty na push od samego początku to drugie miejsce Ansible.

Jaka jest szczególna zaleta skalowalności systemu opartego na ściąganiu? Dlaczego podobno łatwiej jest dodawać więcej suwaków niż agentów push?

Na przykład agiletesting.blogspot.nl pisze:

w systemie „pull” klienci kontaktują się z serwerem niezależnie od siebie, więc system jako całość jest bardziej skalowalny niż system „push”

Z drugiej strony Rackspace pokazuje, że mogą obsługiwać systemy 15K za pomocą modelu push.

infastructures.org pisze:

Przysięgamy, że zastosujemy metodologię ściągania dla utrzymania infrastruktury, przy użyciu narzędzia takiego jak SUP, CVSup, serwer rsync lub cfengine. Zamiast wypychać zmiany do klientów, każda indywidualna maszyna kliencka musi być odpowiedzialna za odpytywanie złotego serwera podczas rozruchu, a następnie okresowo, aby utrzymać swój własny poziom obrotów. Przed przyjęciem tego punktu widzenia opracowaliśmy obszerne skrypty push oparte na ssh, rsh, rcp i rdist. Problem, który znaleźliśmy w przypadku komend r (lub ssh) był następujący: po uruchomieniu skryptu opartego na komendach r w celu wypchnięcia zmiany na maszyny docelowe, istnieje prawdopodobieństwo, że jeśli masz więcej niż 30 hostów docelowych, jeden z nich będzie być w dowolnej chwili. Utrzymanie listy uruchomionych maszyn staje się koszmarem. W trakcie pisania kodu, aby to naprawić, skończysz z rozbudowanym kodem opakowania, aby poradzić sobie z: limity czasu od martwych gospodarzy; rejestrowanie i ponawianie prób martwych hostów; rozwidlanie i uruchamianie równoległych zadań, aby spróbować trafić do wielu hostów w rozsądnym czasie; i wreszcie wykrywanie i zapobieganie przypadkowi wykorzystania wszystkich dostępnych gniazd TCP na maszynie źródłowej we wszystkich wychodzących sesjach rsh. W dalszym ciągu masz problem z umieszczeniem wszystkiego, co właśnie zrobiłeś, w obrazach instalacyjnych dla wszystkich nowych hostów do zainstalowania w przyszłości, a także z powtórzeniem tego dla wszystkich hostów, które zginą i będą musiały zostać odbudowane jutro. Po kłopotach, jakie przeszliśmy, aby wdrożyć replikację opartą na poleceniach r, okazało się, że nie jest tego warte. Nie planujemy ponownie zarządzać infrastrukturą za pomocą komend r ani za pomocą żadnego innego mechanizmu wypychania w tym zakresie. Nie skalują się tak dobrze, jak metody oparte na ściąganiu. rozwidlanie i uruchamianie równoległych zadań, aby spróbować trafić do wielu hostów w rozsądnym czasie; i wreszcie wykrywanie i zapobieganie przypadkowi wykorzystania wszystkich dostępnych gniazd TCP na maszynie źródłowej we wszystkich wychodzących sesjach rsh. W dalszym ciągu masz problem z umieszczeniem wszystkiego, co właśnie zrobiłeś, w obrazach instalacyjnych dla wszystkich nowych hostów do zainstalowania w przyszłości, a także z powtórzeniem tego dla wszystkich hostów, które umrą i będą musiały zostać odbudowane jutro. Po kłopotach, jakie przeszliśmy, aby wdrożyć replikację opartą na poleceniach r, okazało się, że nie jest tego warte. Nie planujemy ponownie zarządzać infrastrukturą za pomocą komend r ani za pomocą żadnego innego mechanizmu wypychania w tym zakresie. Nie skalują się tak dobrze, jak metody oparte na ściąganiu. rozwidlanie i uruchamianie równoległych zadań, aby spróbować trafić do wielu hostów w rozsądnym czasie; i wreszcie wykrywanie i zapobieganie przypadkowi wykorzystania wszystkich dostępnych gniazd TCP na maszynie źródłowej we wszystkich wychodzących sesjach rsh. W dalszym ciągu masz problem z umieszczeniem wszystkiego, co właśnie zrobiłeś, w obrazach instalacyjnych dla wszystkich nowych hostów do zainstalowania w przyszłości, a także z powtórzeniem tego dla wszystkich hostów, które zginą i będą musiały zostać odbudowane jutro. Po kłopotach, jakie przeszliśmy, aby wdrożyć replikację opartą na poleceniach r, okazało się, że nie jest tego warte. Nie planujemy ponownie zarządzać infrastrukturą za pomocą komend r ani za pomocą żadnego innego mechanizmu wypychania w tym zakresie. Nie skalują się tak dobrze, jak metody oparte na ściąganiu. i wreszcie wykrywanie i zapobieganie przypadkowi wykorzystania wszystkich dostępnych gniazd TCP na maszynie źródłowej we wszystkich wychodzących sesjach rsh. W dalszym ciągu masz problem z umieszczeniem wszystkiego, co właśnie zrobiłeś, w obrazach instalacyjnych dla wszystkich nowych hostów do zainstalowania w przyszłości, a także z powtórzeniem tego dla wszystkich hostów, które zginą i będą musiały zostać odbudowane jutro. Po kłopotach, jakie przeszliśmy, aby wdrożyć replikację opartą na poleceniach r, okazało się, że nie jest tego warte. Nie planujemy ponownie zarządzać infrastrukturą za pomocą komend r ani za pomocą żadnego innego mechanizmu wypychania w tym zakresie. Nie skalują się tak dobrze, jak metody oparte na ściąganiu. i wreszcie wykrywanie i zapobieganie przypadkowi wykorzystania wszystkich dostępnych gniazd TCP na maszynie źródłowej we wszystkich wychodzących sesjach rsh. W dalszym ciągu masz problem z umieszczeniem wszystkiego, co właśnie zrobiłeś, w obrazach instalacyjnych dla wszystkich nowych hostów do zainstalowania w przyszłości, a także z powtórzeniem tego dla wszystkich hostów, które umrą i będą musiały zostać odbudowane jutro. Po kłopotach, jakie przeszliśmy, aby wdrożyć replikację opartą na poleceniach r, okazało się, że nie jest tego warte. Nie planujemy ponownie zarządzać infrastrukturą za pomocą komend r ani za pomocą żadnego innego mechanizmu wypychania w tym zakresie. Nie skalują się tak dobrze, jak metody oparte na ściąganiu. W dalszym ciągu masz problem z umieszczeniem wszystkiego, co właśnie zrobiłeś, w obrazach instalacyjnych dla wszystkich nowych hostów do zainstalowania w przyszłości, a także z powtórzeniem tego dla wszystkich hostów, które zginą i będą musiały zostać odbudowane jutro. Po kłopotach, jakie przeszliśmy, aby wdrożyć replikację opartą na poleceniach r, okazało się, że nie jest tego warte. Nie planujemy ponownie zarządzać infrastrukturą za pomocą komend r ani za pomocą żadnego innego mechanizmu wypychania w tym zakresie. Nie skalują się tak dobrze, jak metody oparte na ściąganiu. W dalszym ciągu masz problem z umieszczeniem wszystkiego, co właśnie zrobiłeś, w obrazach instalacyjnych dla wszystkich nowych hostów do zainstalowania w przyszłości, a także z powtórzeniem tego dla wszystkich hostów, które zginą i będą musiały zostać odbudowane jutro. Po kłopotach, jakie przeszliśmy, aby wdrożyć replikację opartą na poleceniach r, okazało się, że nie jest tego warte. Nie planujemy ponownie zarządzać infrastrukturą za pomocą komend r ani za pomocą żadnego innego mechanizmu wypychania w tym zakresie. Nie skalują się tak dobrze, jak metody oparte na ściąganiu. lub z dowolnym innym mechanizmem pchającym w tym zakresie. Nie skalują się tak dobrze, jak metody oparte na ściąganiu. lub z dowolnym innym mechanizmem pchającym w tym zakresie. Nie skalują się tak dobrze, jak metody oparte na ściąganiu.

Czy nie jest to problem implementacyjny zamiast architektonicznego? Dlaczego trudniej jest napisać wątkowego klienta push niż wątkowy serwer pull?

Willem
źródło
4
Tylko uwaga, Ansible może również ciągnąć za pośrednictwem ansible-pull.
ceejayoz
1
Jedną z głównych zalet jest przechodzenie przez NAT i zapory ogniowe. Często nie jest to przeszkodą, ale czasem zmienia grę.
Dan Garthwaite
SALT wykorzystuje pub / sub ZeroMQ. Który jest inny.
Dan Garthwaite
1
Odbyła się na ten temat debata w temacie Wdrażanie aplikacji a konfiguracja systemu na liście mailingowej [devops-toolchain] [1]. [1]: code.google.com/p/devops-toolchain
sciurus
1
btw - HP Server Automation jest modelowany w trybie push i może zarządzać dziesiątkami tysięcy urządzeń {ujawnienie - jestem architektem automatyki dla partnera HP}
warren

Odpowiedzi:

8

Problem z systemami opartymi na wypychaniu polega na tym, że musisz mieć pełny model całej architektury w centralnym węźle wypychającym. Nie możesz naciskać na maszynę, o której nie wiesz.

Oczywiście może działać, ale synchronizacja wymaga dużo pracy.

Używając rzeczy takich jak Mcollective, możesz przekonwertować Puppet i inne CM do systemu opartego na push. Zasadniczo konwersja systemu pull na system oparty na push jest banalna, ale nie zawsze jest to proste.

Jest także kwestia polityki organizacyjnej. System oparty na wypychaniu daje wszystkie ręce kontrolne centralnym administratorom. W ten sposób zarządzanie złożonością może być bardzo trudne. Myślę, że problemem skalowania jest czerwony śledź, albo podejdź do skali, jeśli spojrzysz na liczbę klientów. Pod wieloma względami push jest łatwiejszy do skalowania. Jednak konfiguracja dynamiczna mniej więcej implikuje, że masz przynajmniej ściąganą wersję rejestracji klienta.

Ostatecznie chodzi o to, który system pasuje do przepływu pracy i własności w organizacji. Zasadniczo systemy ciągnące są bardziej elastyczne.

Fred the Magic Wonder Dog
źródło
2
Dzięki! Ale dlaczego dynamiczna konfiguracja miałaby pociągać? Ansible używa na przykład dynamicznego push. Wygląda więc na to, że fakt, że Puppet nie potrafi dynamicznie naciskać, jest ograniczeniem implementacji, a nie ograniczeniem architektury, prawda?
Willem,
4
@Willem Prawdziwie „dynamiczne” środowisko oznacza, że ​​nowa maszyna może pojawić się w dowolnym miejscu, w dowolnym czasie i wymagać konfiguracji. System oparty na wypychaniu wymaga skonfigurowania tego systemu w węźle centralnym; system oparty na ściąganiu może pobierać (ogólną) konfigurację bez potrzeby, aby administrator środowiska robił cokolwiek na serwerach konfiguracyjnych.
voretaq7
1
Zabbix odkrywa hosty, Ansible może użyć dynamicznej inwentaryzacji, aby przekazać konfigurację ściągania do nowo odkrytych hostów.
bbaassssiiee
tak, ansible może korzystać z wielu źródeł do tworzenia dynamicznych zasobów, na przykład z interfejsu API ESX. W ten sposób wiesz o maszynie wirtualnej, jak tylko zostanie ona utworzona, i możesz uruchamiać rozgrywki na dopasowaniu wzorca.
JM Becker
11

W przypadku, gdy jest to interesujące dla kogokolwiek, wydaje mi się, że przynajmniej mogę dać raport z doświadczenia użytkownika, który po raz pierwszy użył funkcji Ansible po wyjęciu z pudełka w kontekście zarządzania łatkami w konfiguracjach wielu hostów systemów o kluczowym znaczeniu w chmurze Amazon. Aby zrozumieć moje uprzedzenia lub uprzedzenia, powinienem wyjaśnić, że preferuję Ruby na poziomie skryptów automatyzacji i w przeszłości przygotowałem projekty do używania konfiguracji marionetek master-agent dla projektu-Vpc. Więc moje doświadczenie przeczy wcześniejszym uprzedzeniom, jeśli takie były.

Moje ostatnie doświadczenia bardzo sprzyjały dynamicznemu wprowadzaniu do zmieniającej się posiadłości od kilkudziesięciu do setek serwerów, które można skalować w górę lub w dół, mogą być zakończone i odświeżone. W mojej sytuacji wystarczyło proste polecenie ad hoc Ansible 1.7. Jednak ze względu na skuteczność ustawienia AnsibleController (na t2.micro) dla Vpc w tym celu, w przyszłości zamierzam rozszerzyć tę technikę na bardziej złożone wymagania.

Wróćmy więc do pytania zadanego w tym wątku: plusy i minusy popychania w dynamicznie zmieniającej się posiadłości.

Założenia dotyczące rodzaju serwerów, na które celowałem, były następujące:

  • Nie zakładamy, że adresy IP lub lokalne nazwy hostów wygenerowane przez Amazon byłyby długotrwałe - oba mogą przychodzić i odchodzić
  • Wszystkie instancje zostały utworzone z obrazów maszyn, które już miały możliwość umożliwienia dostępu ssh od jednego uprzywilejowanego użytkownika administracyjnego
  • Aby zindywidualizować serwery i potencjalnie podzielić je na grupy, zgodnie z funkcją lub zgodnie z etapem rozwoju (np. Test lub prod), można to zrobić poprzez uruchomienie określonych tagów Amazon o konwencjonalnych nazwach
  • To, że załatałbym osobno administrowanie serwerami Linux i Windows za pomocą różnych komend ad hoc, dlatego po prostu zezwolenie na niepowodzenie logowania do konkretnego Linuxa podczas kontaktu z serwerem Windows było całkowicie dopuszczalne

Mając na uwadze powyższe warunki, utworzenie obrazu maszyny AnsibleController w celu umieszczenia go w wielu wersjach VPC i skonfigurowania (z poświadczeniami) in situ na istniejących kontach serwera jest bardzo proste. Zautomatyzowane w ramach każdej instancji utworzonej z obrazu jest

  1. Zadanie cron polegające na wypychaniu łaty do działających serwerów w regularnych odstępach czasu, tak aby wymagany dostęp do nieruchomości był stale uzyskiwany w odstępach czasu
  2. Sposób obliczania ekwipunku Ansible w każdym takim przedziale czasu.

Drugi przedmiot może być w razie potrzeby względnie wyrafinowany (poprzez strukturę informacji w ekwipunku Ansible). Ale jeśli nie jest potrzebne wyrafinowanie, oto bardzo prosty przykład skryptu do obliczania wszystkich instancji Amazon EC2 w każdym interwale cron i kierowania wyników do odpowiedniego pliku inwentarza (np. / Etc / ansible / hosts)…

#!/bin/bash
# Assumes aws-cli/1.3.4 Python/2.6.9 Linux/3.4.73-64.112.amzn1.x86_64 or greater
# http://aws.amazon.com/releasenotes/8906204440930658
# To check yum list aws-cli
# Assumes that server is equipped with AWS keys and is able to access some or all
# instances in the account within it is running.
# Provide a list of host IPs each on a separate line
# If an argument is passed then treat it as the filename, whether local or absolute 
# path, to which the list is written

function list-of-ips {
    /usr/bin/aws ec2 describe-instances --filters '[ {"Name": "instance-state-code", "Values": [ "16" ] } ]' | grep -w PrivateIpAddress | awk  '{x=$2; gsub("\"","", x); gsub(",","", x); if(x && FNR!=1){print x;}}' | uniq
 }

if [ -n "$1" ]; then
   list-of-ips > "$1"
else
   list-of-ips
fi

Jedynym zastrzeżeniem dla przypadku użycia jest to, że polecenie patch powinno być idempotentne. Pożądane jest wstępne przetestowanie, aby upewnić się, że jest to spełnione, w ramach upewnienia się, że łatka robi dokładnie to, co jest zamierzone.

Podsumowując, zilustrowałem przypadek użycia, w którym dynamiczne wypychanie jest skuteczne w stosunku do wyznaczonych celów. Jest to powtarzalne rozwiązanie (w sensie zamknięcia w obrazie, który można wprowadzić na wielu kontach i regionach). Z mojego dotychczasowego doświadczenia wynika, że ​​technika dynamicznego wypychania jest o wiele łatwiejsza do zapewnienia --- i rozpoczęcia działania --- niż alternatywy dostępne z dostępnych obecnie zestawów narzędzi.

Johnz
źródło
2
//, @jonz, jest to rodzaj dyskusji, w której, jak sądzę, doświadczeni programiści pokochali model Stack Exchange. Szczególnie podoba mi się wybrane przez ciebie warunki, a ta odpowiedź zawiera listę założeń jako pierwszych.
Nathan Basanese