ЁЯкг рдзрдбрд╛ 03 тАФ Toil: рдЖрдзреА рдмрд╛рджрд▓реНрдпрд╛ рдореЛрдЬрд╛, рдордЧ рддреНрдпрд╛рдВрдирд╛ automate рдХрд░рд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 03 ┬╖ рдорд╛рдЧреЗ: lesson-02-error-budget-policy ┬╖ рдкреБрдвреЗ: lesson-04-on-call
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбрд╛ 02, рдЕрдзрд┐рдХ рдкрдердХрд╛рдЪреА toil рдЪреА рдиреЛрдВрджрд╡рд╣реА. Toil рдореНрд╣рдгреВрди рдХрд╛рдп рдореЛрдЬрд▓реЗ рдЬрд╛рддреЗ (рдЖрдгрд┐ рдХрд╛рдп рдирд╛рд╣реА), рддреЗ
рдХрд╕реЗ рдореЛрдЬрд╛рдпрдЪреЗ, рдЖрдгрд┐ рдХреЛрдгрддреЗ automation рдЖрдзреА рдмрдирд╡рд╛рдпрдЪреЗ рд╣реЗ рддреНрдпрд╛рдЪреНрдпрд╛ payback time рд╡рд░реВрди рдХрд╕реЗ рдард░рд╡рд╛рдпрдЪреЗ тАФ
рдирд╡реНрдпрд╛ tool рд▓рд╛ рд╕реНрд╡рддрдГрд▓рд╛ рд▓рд╛рдЧрдгрд╛рд▒реНрдпрд╛ upkeep рд╕рдХрдЯ. sre/crew.py рдордзреАрд▓ ToilLedger
рдЖрдгрд┐ sre/demo.py рдордзреАрд▓ toil().
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рджреАрдкрд┐рдХрд╛ рдПрдХ рд╡рд╣реА рдареЗрд╡рддреЗ. ЁЯУТ рдкрдердХ рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдПрдЦрд╛рджреЗ рдХрдВрдЯрд╛рд│рд╡рд╛рдгреЗ рдХрд╛рдо рд╣рд╛рддрд╛рдиреЗ рдХрд░рддреЗ, рддреЗрд╡реНрд╣рд╛ рддреА рддреЗ рд▓рд┐рд╣реВрди рдареЗрд╡рддреЗ: рдХрд╛рдо рдХрд╛рдп рд╣реЛрддреЗ, рдХрд┐рддреА рд╡реЗрд│ рд▓рд╛рдЧрд▓рд╛, рддреЗ рдХрд┐рддреА рд╡реЗрд│рд╛ рд╣реЛрддреЗ.
рдорд╣рд┐рдиреНрдпрд╛рднрд░рд╛рдиреЗ рддреА рдмреЗрд░реАрдЬ рдХрд░рддреЗ. "рдЖрдкрдг рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреАрдВрдЪреА locked accounts рдЖрдард╡рдбреНрдпрд╛рд▓рд╛ 60 рд╡реЗрд│рд╛ reset рдХрд░рддреЛ. рдкреНрд░рддреНрдпреЗрдХреА рджрд╣рд╛ рдорд┐рдирд┐рдЯреЗ. рдореНрд╣рдгрдЬреЗ рдЖрдард╡рдбреНрдпрд╛рд▓рд╛ 10 рддрд╛рд╕ тАФ рдХрддрд░рд┐рдирд╛рдЪреНрдпрд╛ рдЖрдард╡рдбреНрдпрд╛рддрд▓рд╛ рдПрдХ рдкреВрд░реНрдг рджрд┐рд╡рд╕, рджрд░ рдЖрдард╡рдбреНрдпрд╛рд▓рд╛."
рдордЧ рддреА рд╡рд┐рдЪрд╛рд░рддреЗ: "рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреАрдВрдиреА рдЖрдкрд▓реЗ account рд╕реНрд╡рддрдГ reset рдХрд░рд╛рд╡реЗ рдЕрд╕реЗ рдмрдЯрдг рдмрдирд╡рд╛рдпрд▓рд╛ рдХрд┐рддреА рд╡реЗрд│ рд▓рд╛рдЧреЗрд▓?" рдХрддрд░рд┐рдирд╛ рдореНрд╣рдгрддреЗ: "16 рддрд╛рд╕." рдореНрд╣рдгрдЬреЗ рджреЛрди рдЖрдард╡рдбреНрдпрд╛рдВрдкреЗрдХреНрд╖рд╛ рдХрдореА рдХрд╛рд│рд╛рдд рдмрдЯрдгрд╛рдиреЗ рдЖрдкрд▓реА рдХрд┐рдВрдордд рд╡рд╕реВрд▓ рдХреЗрд▓реА. рддреНрдпрд╛рдирдВрддрд░ рддреЛ рдореЛрдХрд│рд╛ рд╡реЗрд│ рдЖрд╣реЗ.
рдкрдг рдХрд╛рд╣реА рдХрд╛рдореЗ рдХреНрд╡рдЪрд┐рддрдЪ рдпреЗрддрд╛рдд. Certificate рдЪреЗ рдиреВрддрдиреАрдХрд░рдг рд╡рд░реНрд╖рд╛рддреВрди рдЪрд╛рд░ рд╡реЗрд│рд╛ рд╣реЛрддреЗ. рддреНрдпрд╛рд╕рд╛рдареА tool рдмрдирд╡рд╛рдпрд▓рд╛ 12 рддрд╛рд╕ рд▓рд╛рдЧрддрд╛рдд рдЖрдгрд┐ рддреЗ рдЬрд╡рд│рдкрд╛рд╕ рдХрд╛рд╣реАрдЪ рд╡рд╛рдЪрд╡рдд рдирд╛рд╣реА. рд╡рд╣реАрдиреБрд╕рд╛рд░ рддреЗ рдлрд╛рдпрджреНрдпрд╛рдЪреЗ рдирд╛рд╣реА. (рддрд░реАрд╣реА рджреАрдкрд┐рдХрд╛ рддреЗ рдХрд░рддреЗ тАФ рдХрд╛рд░рдг рддреЗ рдПрдХрджрд╛ рдЬрд░реА рд╡рд┐рд╕рд░рд▓реЗ, рддрд░ рд╕рдВрдкреВрд░реНрдг рдЗрдорд╛рд░рдд рдЕрдВрдзрд╛рд░рд╛рдд рдЬрд╛рддреЗ. рд╡рд╣реА рд╣реАрдЪ рдПрдХрдореЗрд╡ рдореЛрдЬрдгреНрдпрд╛рдЪреА рдЧреЛрд╖реНрдЯ рдирд╛рд╣реА.)
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
ledger["ЁЯУТ toil ledger<br/>24.2 h/week"] --> rank["ЁЯУК rank by payback<br/>build ├╖ (saved тИТ upkeep)"]
rank --> a["backups 1.2 wk"]
rank --> b["account resets 1.6 wk"]
rank --> c["disk resize 2.8 wk"]
rank --> d["print queue 3.5 wk<br/>(next quarter)"]
rank --> e["TLS cert 137 wk<br/>(use ACME anyway)"]
a & b & c --> done["ЁЯФз 40 h budget spent: 30 h<br/>toil 24.2 тЖТ 6.2 h/week"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/sre/lesson-diagrams.html#l03
тЭУ рдХрд╛рдп
- Toil тАФ Google SRE рдкреБрд╕реНрддрдХрд╛рдЪреА рд╡реНрдпрд╛рдЦреНрдпрд╛: production service рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╢реА рдЬреЛрдбрд▓реЗрд▓реЗ рдЕрд╕реЗ рдХрд╛рдо рдЬреЗ рд╣рд╛рддрд╛рдиреЗ рдХреЗрд▓реЗрд▓реЗ, рдкреБрдиреНрд╣рд╛ рдкреБрдиреНрд╣рд╛ рд╣реЛрдгрд╛рд░реЗ, automate рдХрд░рддрд╛ рдпреЗрдгрд╛рд░реЗ, рддрд╛рддреНрдХрд╛рд▓рд┐рдХ (рд╡реНрдпрддреНрдпрдпрд╛рдВрд╡рд░ рдЪрд╛рд▓рдгрд╛рд░реЗ) рдЕрд╕рддреЗ, рдЬреНрдпрд╛рд▓рд╛ рдЯрд┐рдХрд╛рдК рдореВрд▓реНрдп рдирд╕рддреЗ, рдЖрдгрд┐ рдЬреЗ service рд╡рд╛рдвреЗрд▓ рддрд╕реЗ рд░реЗрд╖реАрдп рдкреНрд░рдорд╛рдгрд╛рдд рд╡рд╛рдврддреЗ. Accounts рд╣рд╛рддрд╛рдиреЗ reset рдХрд░рдгреЗ рд╣реЗ toil рдЖрд╣реЗ. рддреБрдореНрд╣рд╛рд▓рд╛ рди рдЖрд╡рдбрдгрд╛рд░реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рдо toil рдирд╕рддреЗ.
- Overhead тАФ service рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╢реА рди рдЬреЛрдбрд▓реЗрд▓реЗ рдХрд╛рдо: рдмреИрдардХрд╛, рдирд┐рдпреЛрдЬрди, рдкреНрд░рд╢рд┐рдХреНрд╖рдг, reviews. рдЖрд╡рд╢реНрдпрдХ, рдкрдг toil рдирд╛рд╣реА. рдиреЛрдВрджрд╡рд╣реА рддреЗ рд╡реЗрдЧрд│реЗ рдареЗрд╡рддреЗ рдореНрд╣рдгрдЬреЗ рддреЗ рдЖрдХрдбреНрдпрд╛рдВрдордзреНрдпреЗ рд▓рдкрдд рдирд╛рд╣реА.
- Engineering тАФ рдЯрд┐рдХрд╛рдК рдореВрд▓реНрдп рдЕрд╕рд▓реЗрд▓реЗ рдХрд╛рдо: tools, design рдордзреАрд▓ рдмрджрд▓, automation.
- Toil budget тАФ SRE рдкреБрд╕реНрддрдХрд╛рдЪреЗ рдзреНрдпреЗрдп рдореНрд╣рдгрдЬреЗ рдкреНрд░рддреНрдпреЗрдХ SRE рдЪреНрдпрд╛ рд╡реЗрд│реЗрдЪреНрдпрд╛ 50% рдкреЗрдХреНрд╖рд╛ рдХрдореА toil рдареЗрд╡рдгреЗ (рддреЛ рдзрдбрд╛ 01 рдордзреАрд▓ ops share рдЪрд╛ рднрд╛рдЧ рдЖрд╣реЗ).
- Payback time тАФ
build hours ├╖ (hours saved per week тИТ upkeep hours per week). Automation рдиреЗ рддреНрдпрд╛рд▓рд╛ рд▓рд╛рдЧрд▓реЗрд▓рд╛ рд╡реЗрд│ рдкрд░рдд рдХрд░реЗрдкрд░реНрдпрдВрддрдЪреЗ рдЖрдард╡рдбреЗ. Upkeep рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рдЖрд╣реЗ: рджрд░ рдорд╣рд┐рдиреНрдпрд╛рд▓рд╛ рдмрд┐рдШрдбрдгрд╛рд░реА script рдореЛрдлрдд рдирд╕рддреЗ. - Automate рдХрд░рдгреНрдпрд╛рдЖрдзреА рдХрд╛рдвреВрди рдЯрд╛рдХрд╛ тАФ рд╕рд░реНрд╡рд╛рдд рдЪрд╛рдВрдЧрд▓рд╛ рдЙрдкрд╛рдп рдЧрд░рдЬрдЪ рдХрд╛рдвреВрди рдЯрд╛рдХрддреЛ: print queue рдХрд╛ рдЕрдбрдХрддреЗ рддреЗ рд╢реЛрдзрд╛. Restart automate рдХреЗрд▓реНрдпрд╛рдиреЗ bug рд▓рдкрддреЛ рдЖрдгрд┐ upkeep рдЪрд╛ рдЦрд░реНрдЪ рддрд░реАрд╣реА рд▓рд╛рдЧрддреЛ.
- Self-service тАФ рдмрд╣реБрддреЗрдХ рд╡реЗрд│рд╛ рд╕рд░реНрд╡рд╛рдд рдЪрд╛рдВрдЧрд▓реЗ automation рдореНрд╣рдгрдЬреЗ рдЬреНрдпрд╛рдиреЗ рдорд╛рдЧрд┐рддрд▓реЗ рддреНрдпрд╛рд▓рд╛рдЪ рддреЗ рд╕реНрд╡рддрдГ рдХрд░реВ рджреЗрдгреЗ (рдПрдХ "рдорд╛рдЭреЗ account reset рдХрд░рд╛" рдмрдЯрдг), рд╕рдВрд░рдХреНрд╖рдХ рдХрдардбреНрдпрд╛рдВрд╕рд╣.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг toil рдореНрд╣рдгрдЬреЗрдЪ рдмрд╛рджрд▓реНрдпрд╛. рддреЗ рд╢рд╛рд│реЗрд╕реЛрдмрдд рд╡рд╛рдврддреЗ, рдЖрдгрд┐ рдЬреНрдпрд╛ engineering рдиреЗ рддреЗ рдХрдореА рдЭрд╛рд▓реЗ рдЕрд╕рддреЗ рддрд┐рд▓рд╛ рдмрд╛рдЬреВрд▓рд╛ рд╕рд╛рд░рддреЗ. рддреЗ рд▓реЛрдХрд╛рдВрд╕рд╛рдареАрд╣реА рд╡рд╛рдИрдЯ рдЖрд╣реЗ: рдкреБрдиреНрд╣рд╛ рдкреБрдиреНрд╣рд╛ рд╣реЛрдгрд╛рд░реЗ, рд╡реНрдпрддреНрдпрдпрд╛рдВрд╡рд░ рдЪрд╛рд▓рдгрд╛рд░реЗ рдХрд╛рдо рдердХрд╡рдгрд╛рд░реЗ рдЖрдгрд┐ рдЪреБрдХрд╛рдВрдирд╛ рдЖрдордВрддреНрд░рдг рджреЗрдгрд╛рд░реЗ рдЕрд╕рддреЗ тАФ 60 рдкреИрдХреА 58 рд╡реЗ account reset рдХрд░рдгрд╛рд░реА рд╡реНрдпрдХреНрддреА рдЪреБрдХреАрдЪреЗ account reset рдХрд░рдгреНрдпрд╛рдЪреА рд╢рдХреНрдпрддрд╛ рдЬрд╛рд╕реНрдд рдЕрд╕рддреЗ. рдЖрдгрд┐ рдХреЛрдгреА рдореЛрдЬрд▓реНрдпрд╛рд╢рд┐рд╡рд╛рдп рддреЗ рджрд┐рд╕рдд рдирд╛рд╣реА. рдиреЛрдВрджрд╡рд╣реА "рдЖрдореНрд╣реА рдиреЗрд╣рдореА рд╡реНрдпрд╕реНрдд рдЕрд╕рддреЛ" рдпрд╛рд▓рд╛ рдЖрдзреА рдХрд╛рдп рджреБрд░реБрд╕реНрдд рдХрд░рд╛рдпрдЪреЗ рдпрд╛рдЪреНрдпрд╛ рдХреНрд░рдорд╡рд╛рд░ рдпрд╛рджреАрдд рдмрджрд▓рддреЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
sre/crew.py рдордзреАрд▓ ToilLedger(tasks)
(name, minutes each, times per week, kind, hours to automate, upkeep hours per week) рдЪреНрдпрд╛ rows рдШреЗрддреЗ.
hours(kind) рдЖрдард╡рдбреНрдпрд╛рдЪреНрдпрд╛ рддрд╛рд╕рд╛рдВрдЪреА рдмреЗрд░реАрдЬ рдХрд░рддреЗ; roi() toil rows рдирд╛ payback рдиреБрд╕рд╛рд░ рдХреНрд░рдо рд▓рд╛рд╡рддреЗ;
plan(budget_hours, max_payback_weeks=26) build budget рд╕рдВрдкреЗрдкрд░реНрдпрдВрдд payback рдХреНрд░рдорд╛рдиреЗ automations
рдирд┐рд╡рдбрддреЗ, рдЖрдгрд┐ рдЬреНрдпрд╛рдЪрд╛ payback 26 рдЖрдард╡рдбреНрдпрд╛рдВрдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЕрд╕реЗрд▓ рддреЗ рд╡рдЧрд│рддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 sre/demo.py toil
python3 - <<'EOF'
import sys; sys.path.insert(0, "sre"); from crew import ToilLedger
L = ToilLedger([("reset locked pupil accounts", 10, 60, "toil", 16, 0.25),
("restart the stuck print queue", 15, 24, "toil", 20, 0.25),
("answer 'is it down?' chat questions", 5, 40, "toil", 10, 0.5),
("weekly crew meeting", 60, 3, "overhead", 0, 0)])
print(f"toil {L.hours('toil'):.2f} h/week ┬╖ overhead {L.hours('overhead'):.1f} h/week")
for name, saved, build, upkeep, pay in L.roi():
print(f"{name:<36} saves {saved:5.2f} h/week ┬╖ pays back in {pay:4.1f} weeks")
for budget in (16, 30, 50):
print(f"budget {budget:>2} h тЖТ", L.plan(budget))
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
toil рд╣реЗ print рдХрд░рддреЗ:
тФАтФА the toil ledger: toil 24.2 h/week ┬╖ overhead 3.0 h ┬╖ engineering 8.0 h
copy grades to the backup drive 5.00 h/week ┬╖ build 6 h ┬╖ upkeep 0.10 h/week тЖТ pays back in 1.2 weeks
reset locked pupil accounts 10.00 h/week ┬╖ build 16 h ┬╖ upkeep 0.25 h/week тЖТ pays back in 1.6 weeks
grow a full disk by hand 3.00 h/week ┬╖ build 8 h ┬╖ upkeep 0.10 h/week тЖТ pays back in 2.8 weeks
restart the stuck print queue 6.00 h/week ┬╖ build 20 h ┬╖ upkeep 0.25 h/week тЖТ pays back in 3.5 weeks
renew a TLS certificate by hand 0.19 h/week ┬╖ build 12 h ┬╖ upkeep 0.10 h/week тЖТ pays back in 137.1 weeks
toil falls from 24.2 to 6.2 h/week, plus 0.45 h/week of upkeep for the new tools
рддреБрдордЪрд╛ snippet рд╣реЗ print рдХрд░рддреЛ:
toil 19.33 h/week ┬╖ overhead 3.0 h/week
reset locked pupil accounts saves 10.00 h/week ┬╖ pays back in 1.6 weeks
restart the stuck print queue saves 6.00 h/week ┬╖ pays back in 3.5 weeks
answer 'is it down?' chat questions saves 3.33 h/week ┬╖ pays back in 3.5 weeks
budget 16 h тЖТ (['reset locked pupil accounts'], 16)
budget 30 h тЖТ (['reset locked pupil accounts', "answer 'is it down?' chat questions"], 26)
budget 50 h тЖТ (['reset locked pupil accounts', 'restart the stuck print queue', "answer 'is it down?' chat questions"], 46)
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреАрд╕ рддрд╛рд╕рд╛рдВрдЪреНрдпрд╛ рдмрд╛рдВрдзрдгреАрдиреЗ рджрд░ рдЖрдард╡рдбреНрдпрд╛рдЪреЗ 18 рддрд╛рд╕ toil рдХрд╛рдвреВрди рдЯрд╛рдХрд▓реЗ (24.2 тЖТ 6.2), рддреНрдпрд╛рдмрджрд▓реНрдпрд╛рдд рдЖрдард╡рдбреНрдпрд╛рд▓рд╛ 0.45 рддрд╛рд╕ upkeep. рдХреНрд░рдо "рд╕рд░реНрд╡рд╛рдд рдореЛрдареЗ рдХрд╛рдо рдЖрдзреА" рдЕрд╕рд╛ рдирд╛рд╣реА тАФ account resets рд╕рд░реНрд╡рд╛рдд рдЬрд╛рд╕реНрдд рд╡рд╛рдЪрд╡рддрд╛рдд, рдкрдг backup copy рд╕рд░реНрд╡рд╛рдд рд▓рд╡рдХрд░ рд╡рд╕реВрд▓ рд╣реЛрддреЗ. 30 рддрд╛рд╕рд╛рдВрдд planner рдиреЗ print queue (20 h) рд╡рдЧрд│рд▓реА рдЖрдгрд┐ рддреНрдпрд╛рдРрд╡рдЬреА рд╕реНрд╡рд╕реНрдд "is it down?" item рдШреЗрддрд▓рд╛; 50 рддрд╛рд╕рд╛рдВрдд рддреНрдпрд╛рдиреЗ рддрд┐рдиреНрд╣реА рдШреЗрддрд▓реЗ. рдЖрдгрд┐ certificate рдиреЛрдВрджрд╡рд╣реАрдЪреА рдорд░реНрдпрд╛рджрд╛ рджрд╛рдЦрд╡рддреЗ: рддрд╛рд╕рд╛рдВрдЪреНрдпрд╛ рд╣рд┐рд╢реЛрдмрд╛рдиреЗ рд╡рд╕реБрд▓реАрд▓рд╛ 137 рдЖрдард╡рдбреЗ, рддрд░реАрд╣реА рдПрдХрджрд╛ рд╡рд┐рд╕рд░рд▓реЗрд▓реЗ рдиреВрддрдиреАрдХрд░рдг рдореНрд╣рдгрдЬреЗ outage. рдзреЛрдХрд╛рд╣реА рдореЛрдЬрд▓рд╛ рдЬрд╛рддреЛ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рд╕рдЧрд│реНрдпрд╛ ops рдХрд╛рдорд╛рд▓рд╛ toil рдореНрд╣рдгрдгреЗ тАФ overhead рдЖрдгрд┐ рдЦрд░реЗ incident рдХрд╛рдо toil рдирд╛рд╣реА
- рдХрд╛рд╣реА рдЖрдард╡рдбреЗ рдиреЛрдВрдж рдареЗрд╡рдгреНрдпрд╛рдРрд╡рдЬреА рдЖрдард╡рдгреАрддреВрди toil рдЪрд╛ рдЕрдВрджрд╛рдЬ рд▓рд╛рд╡рдгреЗ
- рдмрд┐рдШрдбрд▓реЗрд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рдвреВрди рдЯрд╛рдХрдгреНрдпрд╛рдРрд╡рдЬреА рддреА automate рдХрд░рдгреЗ ("рджрд░ рддрд╛рд╕рд╛рд▓рд╛ restart рдХрд░рд╛")
- upkeep рдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ тАФ рдЕрд╕реЗ tool рдЬреНрдпрд╛рд▓рд╛ рджрд░ рдЖрдард╡рдбреНрдпрд╛рд▓рд╛ рдПрдХ рдорд╛рдгреВрд╕ рд▓рд╛рдЧрддреЛ
- рд╕рдВрд░рдХреНрд╖рдХ рдХрдардбреЗ рдирд╕рд▓реЗрд▓реЗ automation: рдЪреБрдХреАрдЪреА disk resize рдХрд░рдгрд╛рд░реА script, рд╡реЗрдЧрд╛рдиреЗ, рд╕рдЧрд│реАрдХрдбреЗ
- рдкреБрдиреНрд╣рд╛ рдХрдзреАрдЪ рди рдореЛрдЬрдгреЗ, рдореНрд╣рдгрдЬреЗ toil рдкрд░рдд рдЖрд▓реЗрд▓реЗ рдХреЛрдгрд╛рд▓рд╛рдЪ рджрд┐рд╕рдд рдирд╛рд╣реА
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдХрд╛рдо рдЬрд┐рдереЗ рдЖрдзреАрдЪ рд╣реЛрддреЗ рддрд┐рдереЗрдЪ toil рдиреЛрдВрджрд╡рд╛. Tickets рдирд╛ рд▓рд╛рдЧрд▓реЗрд▓реНрдпрд╛ рдорд┐рдирд┐рдЯрд╛рдВрд╕рд╣ toil tag рд▓рд╛рд╡рд╛; рдорд╣рд┐рдиреНрдпрд╛рддреВрди рдПрдХрджрд╛
рдХрд╛рдорд╛рдиреБрд╕рд╛рд░ рдмреЗрд░реАрдЬ рдХрд░рд╛. рдЦрд▒реНрдпрд╛ account рд╡рд░ тАФ рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рддреБрдордЪреНрдпрд╛ ticket system рдЪреНрдпрд╛ CSV export рдордзреВрди:
# columns: task,minutes
awk -F, 'NR > 1 { m[$1] += $2 } END { for (t in m) printf "%6.1f h %s\n", m[t] / 60, t }' toil-2026-09.csv | sort -rn
Kubernetes рд╡рд░ cert-manager (ACME, Let's Encrypt) рд╡рд╛рдкрд░реВрди certificate рдЪреЗ рдиреВрддрдиреАрдХрд░рдг рдХрд╛рдпрдордЪреЗ рдХрд╛рдвреВрди рдЯрд╛рдХрд╛; рддреЗ expiry рдЪреНрдпрд╛ рдЖрдзреАрдЪ рдиреВрддрдиреАрдХрд░рдг рдХрд░рддреЗ:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata: {name: timetable-tls, namespace: timetable}
spec:
secretName: timetable-tls
dnsNames: [timetable.school.example]
issuerRef: {name: letsencrypt-prod, kind: ClusterIssuer}
renewBefore: 720h # renew 30 days before the certificate expires
рд╕рдВрд░рдХреНрд╖рдХ рдХрдардбреНрдпрд╛рдВрд╕рд╣ self-service рдореНрд╣рдгрдЬреЗ рдмрд╣реБрддреЗрдХ рд╡реЗрд│рд╛ рдПрдХ рдЫреЛрдЯреЗ runbook-automation job (Rundeck, рдПрдЦрд╛рджреЗ рдЕрдВрддрд░реНрдЧрдд portal, рдХрд┐рдВрд╡рд╛ chat command) рдЬреЗ рдХреЛрдг рдорд╛рдЧрдд рдЖрд╣реЗ рддреЗ рддрдкрд╛рд╕рддреЗ, рдкреНрд░рддреНрдпреЗрдХ run log рдХрд░рддреЗ рдЖрдгрд┐ рдлрдХреНрдд рдПрдХрдЪ рдХрд╛рдо рдХрд░рддреЗ.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ: рдпрд╛ рдЖрдард╡рдбреНрдпрд╛рдд toil рдЪреА рдиреЛрдВрджрд╡рд╣реА рд╕реБрд░реВ рдХрд░рд╛. рдорд╣рд┐рдиреНрдпрд╛рднрд░рд╛рдиреЗ рд╡рд░рдЪреНрдпрд╛ рддреАрди rows рд╣рд╛ рддреБрдордЪрд╛ automation рдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛ рдЕрд╕реЗрд▓, рдЖрдзреАрдЪ рдХреНрд░рдо рд▓рд╛рд╡рд▓реЗрд▓рд╛, рдЖрдгрд┐ рддреЗ рдЖрдХрдбреЗ рддреБрдордЪреНрдпрд╛ manager рд╕рдореЛрд░ рддреНрдпрд╛ рд╡реЗрд│реЗрдЪреЗ рд╕рдорд░реНрдерди рдХрд░рддрд╛рдд.
тПня╕П рдкреБрдвреЗ
рдХрд╛рд╣реА рдмрд╛рджрд▓реНрдпрд╛ рдкрд╣рд╛рдЯреЗ 3 рд╡рд╛рдЬрддрд╛ рдпреЗрддрд╛рдд. рдкреБрдврдЪрд╛ рдзрдбрд╛ рдбреНрдпреБрдЯреАрдЪреНрдпрд╛ рдлреЛрдирдмрджреНрджрд▓ рдЖрд╣реЗ: рддреЛ рдХреЛрдг рд╕рд╛рдВрднрд╛рд│рддреЗ, рддреЛ рдХрд┐рддреА рд╡реЗрд│рд╛ рд╡рд╛рдЬрддреЛ, рдЖрдгрд┐ рддреЗ рдЯрд┐рдХрд╛рдК рдХрд╕реЗ рдареЗрд╡рд╛рдпрдЪреЗ.
git checkout lesson-04-on-call