ЁЯФФ рдзрдбрд╛ 10 тАФ Scheduling рдЖрдгрд┐ automation: рдШрдВрдЯрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 10 ┬╖ рдкреБрдвреЗ: lesson-11-ci-and-containers
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ10. рддрд┐рдереЗ рдХреЛрдгреА рдирд╕рддрд╛рдирд╛ script рдЪрд╛рд▓рд╡рдгреЗ тАФ рдЖрдгрд┐ рддреА рджреЛрдирджрд╛, рдЧреБрдкрдЪреВрдк рдХрд┐рдВрд╡рд╛ рдкрд╕рд╛рд▒реНрдпрд╛рдд рдЪрд╛рд▓реВ рдирдпреЗ рдпрд╛рд╕рд╛рдареАрдЪреНрдпрд╛ рдЪрд╛рд░ рд╕рд╡рдпреА.
- bin/backup.sh тАФ рд░рд╛рддреНрд░реАрдЪреЗ рдХрд╛рдо: tar тЖТ verify тЖТ rotate, рдПрдХ lock, рдПрдХ log
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдкрд╣рд╛рдЯреЗ рджреЛрди рд╡рд╛рдЬрддрд╛ рдШрдВрдЯрд╛ рд╡рд╛рдЬрддреЗ рдЖрдгрд┐ рдХреЗрдЕрд░рдЯреЗрдХрд░ backup рдЪреЗ рдХрд╛рд░реНрдб рдЪрд╛рд▓рд╡рддреЛ. рдХреЛрдгреА рдкрд╛рд╣рдд рдирд╕рддреЗ, рдореНрд╣рдгреВрди рдХрд╛рд░реНрдбрдиреЗ рд╣реЗ рдХрд░рд╛рдпрд▓рд╛рдЪ рд╣рд╡реЗ: рдПрдХрд╛ рд╡реЗрд│реА рдПрдХрджрд╛рдЪ рдЪрд╛рд▓рдгреЗ (рджрд╛рд░рд╛рд╡рд░ рдХреБрд▓реВрдк), рдкреБрдиреНрд╣рд╛ рдЪрд╛рд▓рд╡рдгреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдЕрд╕рдгреЗ (idempotent тАФ рддреЛрдЪ рдирд┐рдХрд╛рд▓), рдХрд╛рдп рдЭрд╛рд▓реЗ рддреЗ рд▓рд┐рд╣реВрди рдареЗрд╡рдгреЗ (рд╡реЗрд│рд╛рдВрд╕рд╣ log), рдЖрдгрд┐ рдХрд╛рд╣реАрд╣реА рдЪреБрдХрд▓реЗ рддрд░ рдореЛрдареНрдпрд╛рдиреЗ fail рд╣реЛрдгреЗ (рдзрдбрд╛ 08 рдордзрд▓рд╛ strict mode). рдШрдВрдЯрд╛ рд╕реНрд╡рддрдГ рдмрд╣реБрддреЗрдХ machines рд╡рд░ cron рдЕрд╕рддреЗ, рдЖрдзреБрдирд┐рдХ Linux рд╡рд░ systemd timer, рдХрд┐рдВрд╡рд╛ CI рдордзрд▓реЗ schedule.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
C["ЁЯФФ cron: 0 2 * * *"] --> B["backup.sh"]
B --> L{"mkdir lock?"} -->|exists| D["die: already running"]
L -->|ok| T["tar тЖТ verify тЖТ rotate"] --> U["rmdir lock (trap)"] --> G["log: kept 5"]
тЭУ рдХрд╛рдп
crontab -e, рдкрд╛рдЪ fields:min hour day month weekdayтАФ0 2 * * *рд░реЛрдЬ 02:00 рд▓рд╛,*/15 * * * *рджрд░ 15 рдорд┐рдирд┐рдЯрд╛рдВрдиреА.crontab -lрдпрд╛рджреА рджрд╛рдЦрд╡рддреЛ.- cron рдЪреЗ environment рдЕрдЧрджреА рдореЛрдХрд│реЗ рдЕрд╕рддреЗ: рдореВрд▓рднреВрдд рдЧреЛрд╖реНрдЯреАрдВрдкрд▓реАрдХрдбреЗ
PATHрдирд╛рд╣реА, рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрдкреЗрдХреНрд╖рд┐рддHOMEрдирд╛рд╣реА,cwdрдореНрд╣рдгрдЬреЗ/. absolute paths рд╡рд╛рдкрд░рд╛, crontab рдордзреНрдпреЗPATHset рдХрд░рд╛, output log рдордзреНрдпреЗ redirect рдХрд░рд╛ рдХрд┐рдВрд╡рд╛MAILTOset рдХрд░рд╛. - Locks:
mkdir "$LOCK" || dieatomic рдЖрд╣реЗ; Linux рд╡рд░flock;trapрдордзреНрдпреЗ рд╕реЛрдбрд╛. Idempotent: рджреЛрдирджрд╛ рдЪрд╛рд▓рд╡рд╛, рддреАрдЪ рд╕реНрдерд┐рддреА. Retention: N рдареЗрд╡рд╛. - systemd timers:
OnCalendar=daily, logsjournalctl -uрдордзреНрдпреЗ, overlaps рдирд╛рд╣реАрдд, downtime рдирдВрддрд░ рд░рд╛рд╣рд┐рд▓реЗрд▓реЗ run рднрд░реВрди рдХрд╛рдврддрд╛рдд. cloud рдордзреНрдпреЗ: EventBridge, Kubernetes рдЪрд╛CronJob. - рддреБрдореНрд╣реА рдЬреЗ рдмрдирд╡рд▓реЗ рддреЗ рддрдкрд╛рд╕рд╛: рдХрд┐рдорд╛рди
tar -tzf; рджрд░ рдорд╣рд┐рдиреНрдпрд╛рд▓рд╛ restore рдЪреА рддрд╛рд▓реАрдо.
ЁЯдФ рдХрд╛
"backup рдорд╣рд┐рдиреЛрдирдорд╣рд┐рдиреЗ рдЪрд╛рд▓рд▓рд╛" рдЖрдгрд┐ "backup рдорд╣рд┐рдиреЛрдирдорд╣рд┐рдиреЗ рд░рд┐рдХрд╛рдорд╛ рд╣реЛрддрд╛" рдмрд╛рд╣реЗрд░реВрди рд╕рд╛рд░рдЦреЗрдЪ рджрд┐рд╕рддрд╛рдд. рдлрдХреНрдд log, verification рдЖрдгрд┐ рдЕрдзреВрдирдордзреВрди рдХреЗрд▓реЗрд▓реЗ restore рддреНрдпрд╛рдВрдЪреНрдпрд╛рддрд▓рд╛ рдлрд░рдХ рд╕рд╛рдВрдЧрддрд╛рдд.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
backup.sh: defaults рд╕рд╣ KEEP, DEST, SRC; mkdir "$LOCK" || die;
trap 'rmdir "$LOCK"; log done' EXIT; timestamp рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдирд╛рд╡рд╛рдд tar -czf;
tar -tzf тАж || die; rotation рд╕рд╛рдареА ls -1t | tail -n +$((KEEP+1)) | xargs rm;
рдкреНрд░рддреНрдпреЗрдХ step рд╡реЗрд│реЗрд╕рд╣ log рдХреЗрд▓реЗрд▓реА.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
bin/backup.sh --dest /tmp/bk --keep 2; bin/backup.sh --dest /tmp/bk --keep 2; bin/backup.sh --dest /tmp/bk --keep 2
ls -1 /tmp/bk # only 2 remain
mkdir /tmp/bk/.lock; bin/backup.sh --dest /tmp/bk; echo "exit $?"; rmdir /tmp/bk/.lock # a second run is refused
tar -tzf "$(ls -t /tmp/bk/*.tar.gz | head -1)" # what is inside the newest
echo "0 2 * * * PATH=/usr/bin:/bin $PWD/bin/backup.sh --dest /srv/backups >> /var/log/backup.log 2>&1" # what the crontab line looks like
rm -rf /tmp/bk
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
рддреАрди runs, рддреАрди verified рдУрд│реА, рдордЧ rotated out messages рдЖрдгрд┐ kept 2 backups; lock рдЕрд╕рд▓реЗрд▓рд╛ run another backup is running рдЫрд╛рдкрддреЛ рдЖрдгрд┐ 1 рдиреЗ exit рд╣реЛрддреЛ;
archive рдордзреНрдпреЗ register.csv рджрд┐рд╕рддреЗ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреБрдореНрд╣реА рдЕрд╕рд╛ job schedule рдХрд░реВ рд╢рдХрддрд╛ рдЬреЛ рдПрдХрд╛ рд╡реЗрд│реА рдПрдХрджрд╛рдЪ рдЪрд╛рд▓рддреЛ, рдЖрдкрд▓рд╛ рдЗрддрд┐рд╣рд╛рд╕ рдорд░реНрдпрд╛рджрд┐рдд рдареЗрд╡рддреЛ, рдЖрдкрд▓реЗ output рд╕реНрд╡рддрдГ рд╕рд┐рджреНрдз рдХрд░рддреЛ, рдЖрдгрд┐ рддреНрдпрд╛рдиреЗ рдХрд╛рдп рдХреЗрд▓реЗ рддреЗ рд╕рд╛рдВрдЧрддреЛ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рддреБрдордЪреНрдпрд╛ shell рдордзреНрдпреЗ рдЪрд╛рд▓рдгрд╛рд░реА рдкрдг cron рдордзреНрдпреЗ fail рд╣реЛрдгрд╛рд░реА cron рдУрд│:
PATH,HOME, relative paths. - lock рдирд╛рд╣реА: рдПрдХрдореЗрдХрд╛рдВрд╡рд░ рдЖрд▓реЗрд▓реЗ рджреЛрди runs рдПрдХрдЪ file рдмрд┐рдШрдбрд╡рддрд╛рдд.
- log рдУрд│реАрд╢рд┐рд╡рд╛рдп рдпрд╢. рд╢рд╛рдВрддрддрд╛ рдЖрдгрд┐ рдХрдзреАрдЪ-рди-рдЪрд╛рд▓рд▓реЗрд▓реЗ рдпрд╛рдд рдлрд░рдХ рдХрд░рддрд╛ рдпреЗрдд рдирд╛рд╣реА.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: log rotation, certificate renewal, рд░рд╛рддреНрд░реАрдЪреЗ reports, cache warmers тАФ ops рдЪреЗ рдЕрд░реНрдзреЗ рдХрд╛рдо scheduled scripts рдЕрд╕рддреЗ, рдЖрдгрд┐ рддреНрдпрд╛рдВрдкреИрдХреА рдкреНрд░рддреНрдпреЗрдХрд╛рд▓рд╛ рдпрд╛ рдЪрд╛рд░ рд╕рд╡рдпреА рд▓рд╛рдЧрддрд╛рдд.
тПня╕П рдкреБрдвреЗ
рдзрдбрд╛ 11 тАФ CI рдЖрдгрд┐ containers рдордзрд▓реНрдпрд╛ scripts: рдореЗрд▓рд░реВрдордордзрд▓рд╛ рдХреЗрдЕрд░рдЯреЗрдХрд░, рдЬрд┐рдереЗ terminal рдирд╛рд╣реА рдЖрдгрд┐ exit code рд╣реЗрдЪ рд╕рд░реНрд╡рд╕реНрд╡ рдЖрд╣реЗ.