Skrypty startowe
os.startup_scripts tworzy ograniczoną pracę one-shot systemd dla powstałego obrazu. Każdy wpis deklaruje polecenie powłoki, wymagane pakiety, użytkownika wykonującego i jednostkę kolejności.
Skrypty startowe to kod z uprawnieniami root, o ile run_as nie stanowi inaczej. Wymagają takiego samego przeglądu jak każdy skrypt instalacyjny.
Kanoniczny kształt
{
"os": {
"startup_scripts": [
{
"name": "write-build-marker",
"description": "Create a local readiness marker after networking is available.",
"command": "set -Eeuo pipefail\ninstall -d -m 0755 /var/lib/example\nprintf '%s\\n' ready > /var/lib/example/build-ready",
"packages": [],
"run_as": "root",
"after": "network-online.target"
}
]
}
}Pola to description i command, a nie legacy pole script. run_as i after również używają snake_case. after to jeden łańcuch jednostki systemd, nie tablica.
Schemat akceptuje co najwyżej 32 wpisy i ograniczony rozmiar polecenia. Walidacja odrzuca puste polecenia i bajty NUL, ale nie czyni zawartości powłoki bezpieczną ani idempotentną.
Projektowanie pod ponowienia i częściowe błędy
Boot może zostać przerwany po wystąpieniu skutków ubocznych. Pisz skrypty tak, aby kolejne uruchomienie albo kończyło się bezpiecznie, albo wychodziło ze stanem jasnym i możliwym do inspekcji.
Dobre wzorce obejmują:
- zapis do pliku tymczasowego, weryfikacja, potem atomowa zmiana nazwy;
- sprawdzenie, czy użytkownicy, katalogi lub wpisy konfiguracyjne już istnieją;
- użycie
installdla jawnego właściciela i trybu; - zastosowanie
set -Eeuo pipefaili świadome obsługiwanie oczekiwanych wyników różnych od zera; - ograniczone timeouts sieciowe i skończoną liczbę ponowień; oraz
- zapis markera gotowości dopiero po powodzeniu wszystkich wymaganych kroków.
Nie polegaj na sleep jako sprawdzeniu gotowości. Sprawdź rzeczywistą zależność.
Pobieranie zewnętrzne
Unikaj curl ... | sh. Jeśli first boot musi pobrać artefakt:
- użyj HTTPS z weryfikacją certyfikatu;
- przypnij oczekiwany artefakt lub wersję źródła;
- zweryfikuj digest kryptograficzny lub zatwierdzony podpis przed wykonaniem;
- ustaw connect i total timeouts;
- fail closed, gdy weryfikacja się nie powiedzie; oraz
- nie loguj credentials ani podpisanych URL-i.
Dla naprawdę offline lub reprodukowalnego zachowania umieść przejrzany content w obrazie lub zatwierdzonym repozytorium pakietów zamiast pobierać przy first boot.
Sekrety
Nigdy nie osadzaj credentials w postaci jawnego tekstu w przepisie, poleceniu, URL-u ani wygenerowanym markerze. JSON przepisu i logi buildu są zachowywane jako dowód i mogą być widoczne dla operatorów. Użyj zatwierdzonego mechanizmu enrollment lub dostarczania sekretów w czasie wdrożenia i ogranicz wynikowe credential do celu.
Tożsamość wykonania
Preferuj konto usługi bez uprawnień. Jeśli root jest wymagany, ogranicz polecenie do najmniejszego kroku z uprawnieniami i ustaw jawną własność plików. Potwierdź, że run_as wskazuje konto utworzone przed startem jednostki.
Weryfikacja
Testuj wyniki, a nie tylko status zakończenia jednostki:
{
"type": "file_contains",
"description": "The startup unit wrote its readiness marker.",
"params": {
"path": "/var/lib/example/build-ready",
"content": "ready"
}
}Przetestuj też drugi boot, niedostępną zależność i odzyskiwanie po przerwanym pierwszym uruchomieniu. Przy błędzie sprawdź systemctl status i dziennik jednostki.