Σενάρια εκκίνησης
Το os.startup_scripts δημιουργεί περιορισμένη συστηματική εργασία μίας λήψης για την εικόνα που προκύπτει. Κάθε καταχώρηση δηλώνει μια εντολή φλοιού, απαιτούμενα πακέτα, χρήστη εκτέλεσης και μονάδα παραγγελίας.
Τα σενάρια εκκίνησης είναι κώδικας με δυνατότητα root, εκτός εάν το run_as λέει διαφορετικά. Πρέπει να λάβουν την ίδια αξιολόγηση με οποιοδήποτε σενάριο εγκατάστασης.
Κανονικό σχήμα
{
"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"
}
]
}
}Τα πεδία είναι description και command, όχι το παλαιωμένο πεδίο script. Τα run_as και after χρησιμοποιούν επίσης snake_case. Το after είναι μια συστημική συμβολοσειρά μονάδας, όχι ένας πίνακας.
Το σχήμα δέχεται το πολύ 32 καταχωρήσεις και ένα περιορισμένο μέγεθος εντολής. Η επικύρωση απορρίπτει κενές εντολές και NUL byte, αλλά δεν καθιστά το περιεχόμενο φλοιού ασφαλές ή ανίσχυρο.
Σχεδιασμός για επαναλήψεις και μερική αποτυχία
Η εκκίνηση μπορεί να διακοπεί μετά την εμφάνιση ορισμένων παρενεργειών. Γράψτε σενάρια έτσι ώστε μια άλλη επίκληση είτε να ολοκληρωθεί με ασφάλεια είτε να φύγει με μια καθαρή, επιθεωρήσιμη κατάσταση.
Τα καλά μοτίβα περιλαμβάνουν:
- γράψτε σε ένα προσωρινό αρχείο, επαληθεύστε το και μετά μετονομάστε ατομικά.
- ελέγξτε εάν υπάρχουν ήδη χρήστες, κατάλογοι ή καταχωρήσεις διαμόρφωσης.
- χρήση
installγια ρητό ιδιοκτήτη και λειτουργία. - Εφαρμόστε το
set -Eeuo pipefailκαι χειριστείτε σκόπιμα τα αναμενόμενα μη μηδενικά αποτελέσματα. - χρήση περιορισμένων χρονικών ορίων δικτύου και πεπερασμένο πλήθος επανάληψης. και
- γράψτε έναν δείκτη ετοιμότητας μόνο αφού επιτύχουν όλα τα απαιτούμενα βήματα.
Μην βασίζεστε στο sleep ως έλεγχο ετοιμότητας. Εξετάστε την πραγματική εξάρτηση.
Εξωτερικές λήψεις
Αποφύγετε το curl ... | sh. Εάν η πρώτη εκκίνηση πρέπει να φέρει ένα τεχνούργημα:
- Χρησιμοποιήστε HTTPS με επαλήθευση πιστοποιητικού.
- καρφιτσώστε το αναμενόμενο τεχνούργημα ή την έκδοση πηγής.
- επαληθεύστε μια κρυπτογραφική σύνοψη ή εγκεκριμένη υπογραφή πριν από την εκτέλεση.
- Ορίστε τη σύνδεση και τα συνολικά χρονικά όρια.
- Η αποτυχία έκλεισε εάν η επαλήθευση αποτύχει. και
- αποφύγετε την καταγραφή διαπιστευτηρίων ή υπογεγραμμένων διευθύνσεων URL.
Για πραγματικά εκτός σύνδεσης ή αναπαραγώγιμη συμπεριφορά, συμπεριλάβετε ελεγμένο περιεχόμενο στην εικόνα ή ένα εγκεκριμένο αποθετήριο πακέτων αντί να κάνετε λήψη κατά την πρώτη εκκίνηση.
Μυστικά
Μην ενσωματώνετε ποτέ διαπιστευτήρια απλού κειμένου στη συνταγή, την εντολή, τη διεύθυνση URL ή τον δείκτη που δημιουργείται. Τα αρχεία καταγραφής JSON συνταγών και έκδοσης είναι αποδεικτικά στοιχεία που διατηρούνται και μπορούν να είναι ορατά στους χειριστές. Χρησιμοποιήστε έναν εγκεκριμένο μηχανισμό εγγραφής ή παράδοσης απόρρητου χρόνου ανάπτυξης και μεταφέρετε τα διαπιστευτήρια που προκύπτουν στον στόχο.
Ταυτότητα εκτέλεσης
Προτιμήστε έναν μη προνομιούχο λογαριασμό υπηρεσίας. Εάν απαιτείται root, μειώστε την εντολή στο μικρότερο προνομιακό βήμα και ορίστε ρητή ιδιοκτησία αρχείου. Επιβεβαιώστε ότι το run_as ονομάζει έναν λογαριασμό που δημιουργήθηκε πριν από την εκκίνηση της μονάδας.
Επαλήθευση
Αποτελέσματα δοκιμής και όχι μόνο η κατάσταση εξόδου της μονάδας:
{
"type": "file_contains",
"description": "The startup unit wrote its readiness marker.",
"params": {
"path": "/var/lib/example/build-ready",
"content": "ready"
}
}Δοκιμάστε επίσης μια δεύτερη εκκίνηση, μια μη διαθέσιμη εξάρτηση και ανάκτηση από μια διακοπείσα πρώτη εκτέλεση. Επιθεωρήστε το systemctl status και το ημερολόγιο της μονάδας για αστοχία.