Jak RTE komunikuje się z aplikacją
Wychodzący, przychodzący lub bazy danych: kto otwiera połączenie i co nim przechodzi
Dla administratorów: od wersji 7.3.0 RTE komunikuje się z aplikacją przez jeden WebSocket i nie ma poświadczeń do bazy danych. Wybierz tryb, który pasuje do sieci między nimi: kto może otworzyć połączenie do kogo i przez jakie proxy i zapory ono przechodzi.
Trzy tryby
RTE_MODE na RTE mówi, jak łączy się ono z aplikacją; jego runner ma ten sam Tryb:
| Tryb | Kto otwiera połączenie | Co ma RTE | Dla |
|---|---|---|---|
outbound | RTE łączy się z aplikacją pod APP_URL i utrzymuje jeden otwarty WebSocket | Swój RTE_TOKEN, bez poświadczeń do bazy danych | DMZ, NAT lub strefy, która nie dopuszcza połączeń przychodzących: nic nie dociera do RTE z zewnątrz |
inbound | Aplikacja łączy się z RTE pod adresem jego runnera i utrzymuje jeden otwarty WebSocket | Swój RTE_TOKEN, bez poświadczeń do bazy danych | Sieci, w której każde połączenie otwiera strona centralna, projektu compose, poda |
database (przestarzały) | Aplikacja wywołuje API RTE przez HTTP, a RTE samo czyta i zapisuje bazę danych aplikacji | Poświadczenia bazy danych (DB_*) i ENCRYPTION_SECRET | Zachowanie z wersji 7.0 do 7.2, usunięte w 8.0.0 |
RTE bez RTE_MODE działa w trybie bazy danych przez całą serię 7.x i przy starcie zapisuje ostrzeżenie [DEPRECATED] This RTE runs in database mode. Runner dodany przed wersją 7.3.0 ma tryb Baza danych (przestarzały); przy przenoszeniu ustaw go na tryb, w którym działa jego RTE.
Wychodzący
Połączenie otwiera RTE, więc działa to z sieci, która w ogóle nie przyjmuje połączeń przychodzących:
- Gniazdo : RTE łączy się z
APP_URLz dopisanym/api/v2/rte/socket, przezwss://(ws://dla adresuhttp://), ze swoimRTE_TOKENi nazwą swojego runnera,RTE_NAME. Gdy gniazdo zostanie zerwane, łączy się ponownie - Za pierwszym razem : prosi o dołączenie, a jego runner czeka na zatwierdzenie przez admina w Połączenia > Runnery, połączony, ale bez zadań (zobacz Prośba o dołączenie). Token dołączenia,
RTE_JOIN_TOKEN, zatwierdza go od razu. Od tej pory loguje się własnym tokenem - Sieć : tylko ze strefy RTE do aplikacji, na porcie aplikacji, przez proxy, gdy tak mówi
HTTPS_PROXY. Reverse proxy przed aplikacją musi przepuszczać WebSocket na tej ścieżce (zobacz WebSockety runnerów) - Certyfikat : certyfikat aplikacji jest sprawdzany. Prywatne CA wskaż przez
NODE_EXTRA_CA_CERTSalbo, tylko wewnątrz jednej zaufanej sieci, wyłącz sprawdzanie przezAPP_TLS_VERIFY=0 - Runner : nie potrzebuje adresu, więc jego poświadczenie RTE zawiera tylko token
- Gotowość :
/readyodpowiada503, dopóki gniazdo do aplikacji nie jest otwarte
Przy kilku węzłach aplikacji za load balancerem gniazdo trzyma ten węzeł, do którego dotrze RTE. Zadanie może uruchomić dowolny węzeł: węzeł, który trzyma gniazdo, wysyła je do RTE, w ciągu dwóch sekund, gdy zadanie uruchomiono na innym węźle.
Przychodzący
RTE nasłuchuje na swoim PORT, a aplikacja łączy się z nim pod adresem jego runnera, z dopisanym /rte/v1/socket i tokenem RTE. Przy kilku węzłach aplikacji gniazdo każdego runnera w trybie przychodzącym trzyma naraz jeden węzeł; gdy ten się zatrzyma, przejmuje je inny i łączy się ponownie.
Aplikacja potrzebuje runnera RTE, zanim będzie mogła się z nim połączyć: typ RTE, tryb Przychodzący i poświadczenie RTE z adresem RTE i jego RTE_TOKEN. Trafia on tam na jeden z dwóch sposobów:
| Jak | Co ustawić |
|---|---|
| RTE prosi o dołączenie | APP_URL i RTE_URL (adres, pod który łączy się aplikacja). RTE wykonuje jedno wywołanie, POST /api/v2/rte/register, a jego runner czeka na zatwierdzenie przez admina: aplikacja łączy się z nim, gdy zostanie zatwierdzony (zobacz Prośba o dołączenie). Z RTE_JOIN_TOKEN jest zatwierdzany od razu. RTE w trybie przychodzącym z APP_URL, ale bez RTE_URL odmawia startu |
| Ty dodajesz runner | Bez APP_URL: dodaj runner w Połączenia > Runnery lub w config seed, jak w Uruchamianie RTE |
Projekt Docker Compose, chart Helm i kontroler instalatora uruchamiają w ten sposób własne RTE, w trybie przychodzącym, zadeklarowane przez seed.
Przez HTTPS. Przy HTTPS=1 RTE udostępnia swoje gniazdo przez TLS, z kluczem i certyfikatem z HTTPS_KEY i HTTPS_CERT (domyślnie key.pem i cert.pem w jego folderze certificates). RTE z RTE_URL w postaci https:// wysyła ten certyfikat, gdy prosi o dołączenie, a aplikacja go przypina: łączy się z RTE tylko wtedy, gdy przedstawia ono ten sam certyfikat, więc samopodpisany działa bez CA. RTE zapisuje przy starcie odcisk certyfikatu (pierwsze 8 cyfr szesnastkowych SHA-256 jego bajtów DER, jako abcd-ef12), a okno zatwierdzania pokazuje odcisk, który otrzymała aplikacja: sprawdź, czy się zgadzają, zanim zatwierdzisz. Instalator konfiguruje w ten sposób swoje runnery w trybie przychodzącym, z certyfikatem ich własnego adresu.
Baza danych (przestarzały)
RTE z wersji 7.0 do 7.2: aplikacja wywołuje jego API przez HTTP, a RTE przejmuje zadanie w bazie danych, zapisuje tam wynik i aktualizuje własny wiersz runnera, z RTE_REGISTER. Tryb bazy danych opisuje, czym różnią się jego kroki. Nadal działa w 7.x, z ostrzeżeniem przy każdym starcie, i zostanie usunięty w 8.0.0.
Aby przenieść takie RTE do trybu gniazda, zachowaj jego runner i token:
- Runner z config seed: najpierw ustaw dla niego w seedzie
rte_mode: outboundlubrte_mode: inbound(przychodzący: z adresem, pod który łączy się aplikacja, wurljego poświadczenia). RTE nie może samo przenieść runnera z seeda - Na RTE ustaw
RTE_MODE=outboundzAPP_URLalboRTE_MODE=inbound(zAPP_URLiRTE_URL, aby wykonało swoje jedno wywołanie rejestracji) i ustawRTE_NAMEna nazwę, jaką ma jego runner w Połączenia > Runnery. Zachowaj jegoRTE_TOKEN - Usuń
DB_*iENCRYPTION_SECRETz jego środowiska orazRTE_REGISTER, które odczytuje tylko tryb bazy danych, a potem je zrestartuj
Gdy zaktualizowane RTE zaloguje się nazwą runnera i własnym tokenem runnera, aplikacja od razu przenosi ten runner do trybu RTE, bez zatwierdzania, i zapisuje w dzienniku Runner ‘<name>’ moved from database mode to outbound: its RTE signed in with the runner’s own token. Runner nie jest już wierszem zarejestrowanym przez swoje RTE, więc worker nigdy go nie usuwa, gdy stary kontener przestaje odpowiadać. Runner z config seed, który nadal jest w trybie bazy danych, jest natomiast odrzucany, z runner ‘<name>’ is managed by the config seed in database mode: set rte_mode: outbound for it in the seed …, then restart this RTE. Nie używaj do tego tokenu dołączenia: token dołączenia jest odrzucany dla runnera, który jest już zatwierdzony. RTE w trybie przychodzącym bez APP_URL nie wykonuje żadnego wywołania: ustaw zamiast tego Tryb jego runnera na Przychodzący w Połączenia > Runnery, a aplikacja się z nim połączy. Instalator aktualizuje w ten sposób runner z wersji 7.2.
Co przechodzi przez gniazdo
W obu trybach gniazda aplikacja wysyła RTE każde zadanie ze wszystkim, co RTE wcześniej czytało w bazie danych, i zapisuje to, co wraca: wynik, zdarzenia, dziennik zadania i zakończenie, dokładnie raz. Aplikacja wysyła też powiadomienia o zakończeniu.
Spool. Każda paczka wyniku, paczka zdarzeń, dziennik, start i zakończenie są numerowane i zapisywane w pliku spoola zadania (RTE_SPOOL_PATH), zanim zostaną wysłane, i przechowywane, dopóki aplikacja nie potwierdzi ich zapisania. Po ponownym połączeniu, z tym samym węzłem aplikacji lub innym, RTE wysyła ponownie to, co nie zostało potwierdzone, a aplikacja pomija to, co już zapisała: nic nie ginie i nic nie jest zapisane dwukrotnie. Trzymaj spool na wolumenie, żeby RTE, które się restartuje, nadal wysłało to, czego nie dostarczyło. Playbook, który działał, gdy RTE się zrestartowało, nie może kontynuować: jego zadanie kończy się jako porzucone.
Pojemność. RTE uruchamia naraz do RTE_MAX_JOBS playbooków albo tyle, ile ustawiono na jego stronie runnera, i co 20 sekund mówi aplikacji, ile ich działa. Zadanie dla pełnego RTE czeka, jak opisano w Kilka RTE.
Pliki zadania. RTE_FILES albo ustawienie Pliki zadań na stronie jego runnera mówi, skąd RTE bierze playbooki i inwentarze:
RTE_FILES | Skąd pochodzą pliki |
|---|---|
transfer (domyślnie) | Aplikacja wysyła folder playbooków i inwentarze z zadaniem, każde spakowane i nazwane hashem swojej zawartości. RTE trzyma je spakowane w RTE_CACHE_PATH, ostatnio używane do RTE_CACHE_MB (domyślnie 1024 MB), i prosi tylko o hash, którego nie ma: niezmieniony folder nigdy nie jest wysyłany dwa razy. RTE nie potrzebuje współdzielonego dysku ani dostępu do repozytoriów |
local | RTE działa z własnych folderów, jak RTE w trybie bazy danych: zamontuj na nim playbooki (ANSIBLE_PATH) i repozytoria (REPO_PATH) |
Przy transfer każde zadanie rozpakowuje swoje pliki we własnym prywatnym folderze, usuwanym po zakończeniu zadania: żadne zadanie nie widzi tego, co zapisało inne, i żaden plik inwentarza ani extravars nie zostaje rozpakowany na dysku RTE. RTE mogą współdzielić jeden RTE_CACHE_PATH; każde trzyma swoje zadania w osobnym folderze, a folder RTE, które się zatrzymało (zabite w trakcie zadania lub odtworzone z inną nazwą hosta), pozostałe usuwają po 10 minutach. Folder większy niż RTE_FILES_MAX_MB (domyślnie 512, odczytywane przez aplikację, stosowane bez restartu) nie jest wysyłany: zadanie kończy się błędem z informacją, by zamiast tego zamontować folder na RTE. Folder ssh nigdy nie jest wysyłany: RTE trzyma własny klucz prywatny i known_hosts w /home/node/.ssh.
Hosty i zadania. Od wersji 7.3.0 RTE w każdym trybie zapisuje strukturalne zdarzenia playbooka obok jego wyniku tekstowego: każdy play, task i wynik hosta oraz podsumowanie, zapisywane przez jego wtyczkę callback af_events. Strona zadania pokazuje je w Hosty i zadania (zobacz Śledzenie zadania).
Sieć
Co otworzyć między aplikacją, RTE i zarządzanymi hostami, w zależności od trybu:
| Tryb | Skąd | Dokąd | Port |
|---|---|---|---|
| Wychodzący | RTE | Aplikacja, pod APP_URL | Port aplikacji (443 za większością proxy) |
| Przychodzący | Węzły aplikacji | RTE, pod adresem jego runnera | PORT RTE (8000) |
| Baza danych (przestarzały) | RTE oraz węzły aplikacji i worker | Baza danych oraz RTE | 3306 i PORT RTE |
| Każdy tryb | RTE | Zarządzane hosty | ssh (22), WinRM, ich API |
W trybie gniazda RTE nigdy nie łączy się z bazą danych. Jego API odpowiada tylko gniazdu i sondom: /live, /ready, /metrics.