Starta skripti
os.startup_scripts izveido ierobežotu systemd vienreizēju darbu rezultējošajam attēlam. Katrs ieraksts deklarē shell komandu, nepieciešamās pakotnes, izpildes lietotāju un secības vienību.
Starta skripti ir kods ar root iespējām, ja run_as nenosaka citādi. Tos jāpārskata tāpat kā jebkuru instalācijas skriptu.
Kanoniskā forma
{
"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"
}
]
}
}Lauki ir description un command, ne mantotā lauka script. run_as un after arī izmanto snake_case. after ir viena systemd vienības virkne, ne masīvs.
Shēma pieņem ne vairāk kā 32 ierakstus un ierobežota lieluma komandu. Validācija noraida tukšas komandas un NUL baitus, bet nepadara shell saturu drošu vai idempotentu.
Projektēšana atkārtotiem mēģinājumiem un daļējai kļūdai
Palaišana var tikt pārtraukta pēc daļējiem blakus efektiem. Rakstiet skriptus tā, lai nākamā izpilde vai nu droši pabeidz darbu, vai beidzas ar skaidru, pārskatāmu stāvokli.
Labie modeļi:
- rakstīt pagaidu failā, pārbaudīt, tad atomiski pārdēvēt;
- pārbaudīt, vai lietotāji, direktorijas vai konfigurācijas ieraksti jau pastāv;
- izmantot
installskaidram īpašniekam un režīmam; - lietot
set -Eeuo pipefailun apzināti apstrādāt paredzamos nenulles rezultātus; - izmantot ierobežotus tīkla timeout un galīgu mēģinājumu skaitu; un
- gatavības marķieri rakstīt tikai pēc visu nepieciešamo soļu veiksmes.
Neuzskatiet sleep par gatavības pārbaudi. Pārbaudiet faktisko atkarību.
Ārējās lejupielādes
Izvairieties no curl ... | sh. Ja pirmajā palaišanā jāiegūst artefakts:
- izmantojiet HTTPS ar sertifikāta pārbaudi;
- piesaistiet gaidīto artefaktu vai avota versiju;
- pirms izpildes pārbaudiet kriptogrāfisko kopsavilkumu vai apstiprinātu parakstu;
- iestatiet savienojuma un kopējos timeout;
- ja verifikācija neizdodas, pārtrauciet izpildi; un
- nelogojiet credentials vai parakstītus URL.
Patiesi offline vai atkārtojamai uzvedībai iekļaujiet pārskatītu saturu attēlā vai apstiprinātā pakotņu repozitorijā, nevis lejupielādējiet pirmajā palaišanā.
Noslēpumi
Nekad neievietojiet credentials atklātā tekstā receptē, komandā, URL vai ģenerētā marķierī. Recipe JSON un build logi tiek glabāti kā pierādījumi un var būt redzami operatoriem. Izmantojiet apstiprinātu reģistrācijas vai slepeno datu piegādes mehānismu izvietošanas laikā un ierobežojiet iegūto credential mērķim.
Izpildes identitāte
Dodiet priekšroku nepriviliģētai servisa kontam. Ja vajadzīgs root, samaziniet komandu līdz mazākajam priviliģētajam solim un iestatiet skaidru faila īpašumtiesības. Pārliecinieties, ka run_as norāda kontu, kas izveidots pirms vienības starta.
Verifikācija
Pārbaudiet rezultātus, ne tikai vienības exit statusu:
{
"type": "file_contains",
"description": "The startup unit wrote its readiness marker.",
"params": {
"path": "/var/lib/example/build-ready",
"content": "ready"
}
}Pārbaudiet arī otro palaišanu, nepieejamu atkarību un atjaunošanu pēc pārtrauktas pirmās palaišanas. Kļūmes gadījumā apskatiet systemctl status un vienības žurnālu.