Zagoni skripti
os.startup_scripts ustvari omejeno enkratno delo systemd za nastali image. Vsaka postavka deklarira shell ukaz, potrebne pakete, uporabnika za izvedbo in enoto za vrstni red.
Zagoni skripti so koda z root pravicami, razen če run_as določa drugače. Prejmejo enak pregled kot kateri koli namestitveni skript.
Kanonična oblika
{
"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"
}
]
}
}Polji sta description in command, ne zastarelo polje script. Tudi run_as in after uporabljata snake_case. after je en niz enote systemd, ne tabela.
Shema sprejme največ 32 postavk in omejeno velikost ukaza. Validacija zavrne prazne ukaze in bajte NUL, vendar ne naredi vsebine shella varne ali idempotentne.
Načrtovanje za ponovitve in delne napake
Zagon lahko prekine, ko so se že zgodili nekateri stranski učinki. Pišite skripte tako, da naslednja izvedba ali varno dokonča delo, ali konča z jasnim stanjem, ki ga lahko preverite.
Dobri vzorci vključujejo:
- pisanje v začasno datoteko, preverjanje in atomično preimenovanje;
- preverjanje, ali uporabniki, imeniki ali vnosi konfiguracije že obstajajo;
- uporabo
installza eksplicitnega lastnika in način; - uporabo
set -Eeuo pipefailin namerno obravnavo pričakovanih neničelnih rezultatov; - omejene omrežne timeoute in končno število ponovitev; in
- pisanje oznake pripravljenosti šele po uspehu vseh zahtevanih korakov.
Ne zanašajte se na sleep kot preverjanje pripravljenosti. Preverite dejansko odvisnost.
Zunanja prenos
Izogibajte se curl ... | sh. Če mora prvi zagon pridobiti artefakt:
- uporabite HTTPS z preverjanjem certifikata;
- pripnite pričakovani artefakt ali različico vira;
- pred izvedbo preverite kriptografski digest ali odobren podpis;
- nastavite timeoute za povezavo in skupni čas;
- ob neuspehu preverjanja končajte z napako; in
- ne zapisujte v dnevnik poverilnic ali podpisanih URL-jev.
Za res offline ali ponovljivo obnašanje vključite pregledano vsebino v image ali odobren repozitorij paketov namesto prenosa ob prvem zagonu.
Skrivnosti
Nikoli ne vgrajujte poverilnic v plaintextu v recept, ukaz, URL ali generirano oznako. JSON recepta in build dnevniki se hranijo kot dokaz in so lahko vidni operaterjem. Uporabite odobren mehanizem vpisa ali dostave skrivnosti ob namestitvi in omejite nastali credential na cilj.
Identiteta izvedbe
Raje uporabite neprivilegiran servisni račun. Če je root potreben, zožite ukaz na najmanjši privilegiran korak in nastavite eksplicitno lastništvo datotek. Preverite, da run_as poimenuje račun, ustvarjen pred zagonom enote.
Preverjanje
Preizkušajte izide, ne le izhodne kode enote:
{
"type": "file_contains",
"description": "The startup unit wrote its readiness marker.",
"params": {
"path": "/var/lib/example/build-ready",
"content": "ready"
}
}Preizkusite tudi drugi zagon, nedosegljivo odvisnost in obnovo po prekinjenem prvem zagonu. Ob napaki preglejte systemctl status in dnevnik enote.