Lab: healthcheck skriptini haqiqiy nosozlik sharoitida ishlatish
Healthcheck skripti loyihasida healthcheck.sh noldan, funksiyama-funksiya qurilgan edi. Bu lab o'sha skript allaqachon mavjud deb hisoblaydi va boshqa savol beradi: biror narsa haqiqatan noto'g'ri bo'lgan zahoti, u inson ishtirokisiz, jadval bo'yicha va uning bajarilishini hech kim kuzatmagan holda ishlayotganda, to'g'ri ishlaydimi? Monitoring skriptini qurish va ishonish mumkin bo'lgan skriptni joriy qilish — ikki xil ko'nikma. Bu lab butunlay ikkinchisi haqida.
Maqsad va yakuniy natija
Bu lab oxirida healthcheck.sh systemd timer orqali har besh daqiqada avtomatik ishga tushadi. Siz uning WARNING va CRITICAL yo'llarini uchta mustaqil, real nosozlik sharoitida — yuqori disk bandligi, yuqori xotira bandligi va to'xtatilgan servis — ataylab ishga tushirgan bo'lasiz va har bir holatda skriptning exit kodi va chiqishi haqiqatni to'g'ri aks ettirishini tasdiqlaysiz.
Topologiya va boshlang'ich holat
Healthcheck skripti dagi healthcheck.sh skripti allaqachon qurilgan bitta lab VM. Agar o'sha loyihani tugatmagan bo'lsangiz, avval uni quring — bu lab skript qurmaydi, allaqachon mavjud skriptni sinaydi.
mkdir -p ~/lab/healthcheck-deploy
cp ~/lab/healthcheck-project/healthcheck.sh ~/lab/healthcheck-deploy/
chmod +x ~/lab/healthcheck-deploy/healthcheck.sh
Talablar
- tugallangan
healthcheck.shskripti; - istalgan paytda to'xtatish mumkin bo'lgan, faqat lab uchun mo'ljallangan systemd servisi (Xizmatlarni boshqarish labi dagi
greeter.servicedan qayta foydalaning yoki oddiysini yarating).
Xavfsizlik va snapshot haqida eslatma
Bu lab faqat o'qiydigan skriptni foydalanuvchi darajasidagi systemd timer orqali jadvalga qo'yadi — tizim bo'yicha hech qanday holat o'zgartirilmaydi va tozalash timer va lab katalogini olib tashlash bilan cheklanadi.
1-qadam: uni systemd timer bilan jadvalga qo'yish
# ~/.config/systemd/user/healthcheck.service
[Unit]
Description=Run healthcheck.sh
[Service]
Type=oneshot
ExecStart=/home/<username>/lab/healthcheck-deploy/healthcheck.sh
# ~/.config/systemd/user/healthcheck.timer
[Unit]
Description=Run healthcheck.sh every 5 minutes
[Timer]
OnCalendar=*:0/5
Persistent=true
[Install]
WantedBy=timers.target
Tekshirish:
NEXT LEFT LAST PASSED UNIT ACTIVATES
Tue 2026-07-29 10:35:00 UTC 3min 12s n/a n/a healthcheck.timer healthcheck.service
2-qadam: bazaviy holat toza o'tishini tasdiqlash
OK: disk (/) 42% used
OK: memory 38% used
OK: service 'ssh' is running
OK: service 'cron' is running
---
OVERALL STATUS: OK
ExecMainStatus=0 systemd’ning o'zi to'g'ri exit kodni kuzatganini tasdiqlaydi. Bu $? ni bevosita o'qish bilan bir xil intizom, faqat interaktiv ishga tushirish o'rniga rejalashtirilgan unit’ga qo'llanilgan.
Nega aynan 0 / 1 / 2 — monitoring exit kodlari kelishuvi
Bu skript ishlatadigan exit kodlar ixtiyoriy emas: 0 = OK, 1 = WARNING, 2 = CRITICAL va 3 = UNKNOWN — bu Nagios plugin kelishuvi (Manbalar bo'limida havola berilgan). Bu har bir asosiy monitoring agenti — Nagios, Icinga, Zabbix’ning tashqi tekshiruvlari, ko'pchilik Prometheus textfile-exporter o'ramlari — hech qanday maxsus tahlilsiz tushunadigan amaldagi standart. Labning chop etilgan OVERALL STATUS qatoriga ishonish o'rniga ExecMainStatus ni tekshirishining butun sababi shu. Inson o'qiy oladigan matn journal’ni o'qiyotgan odam uchun, exit kod esa monitoring tizimi aslida unga qarab harakat qiladigan mashina o'qiydigan kelishuv. OVERALL STATUS: CRITICAL deb chiqarib, 0 bilan tugaydigan skriptni har bir avtomatlashtirilgan iste’molchi mutlaqo sog'lom deb hisoblaydi. Bu faqat exit kodni tekshirish fosh qiladigan jim, xavfli nosozlik. 3/UNKNOWN ni "tekshiruvning o'zi ishga tusha olmadi" holati uchun saqlang (yo'q bog'liqlik, o'qib bo'lmaydigan /proc fayli). Bu "tekshiruv ishladi va tizim kritik holatda" holatidan haqiqatan boshqa holat.
3-qadam: WARNING yo'lini ishga tushirish — simulyatsiya qilingan yuqori disk bandligi
Haqiqiy root fayl tizimini ataylab to'ldirish xavfli bo'lgani uchun (Disk bandligi labi buning o'rniga izolyatsiya qilingan loopback fayl tizimidan foydalanishni ko'rib chiqadi), diskni haqiqatan to'ldirish o'rniga skriptning o'z chegarasini vaqtincha pasaytirib, holatni simulyatsiya qiling:
sed -i 's/DISK_WARN=75/DISK_WARN=1/' ~/lab/healthcheck-deploy/healthcheck.sh
systemctl --user start healthcheck.service
journalctl --user -u healthcheck.service -n 5
Exit kod WARNING darajasini to'g'ri aks ettiradi. Bu shunchaki log matnida ko'rinmasdan, skript natijasini iste’mol qiladigan har qanday narsa tomonidan haqiqatan kuzatilishini tekshiring.
4-qadam: CRITICAL yo'lini ishga tushirish — haqiqatan to'xtatilgan servis
Yuqoridagi simulyatsiya qilingan disk holatidan farqli o'laroq, bu nosozlik haqiqatan yuzaga keltiriladi, chunki faqat lab uchun mo'ljallangan servisni to'xtatish hech qanday haqiqiy oqibatga olib kelmaydi:
sed -i 's/SERVICES=("ssh" "cron")/SERVICES=("ssh" "greeter")/' ~/lab/healthcheck-deploy/healthcheck.sh
systemctl --user start healthcheck.service
journalctl --user -u healthcheck.service -n 5
OK: disk (/) 42% used
OK: memory 38% used
OK: service 'ssh' is running
CRITICAL: service 'greeter' is not running
---
OVERALL STATUS: CRITICAL
Servisni tiklang va tiklanish ham aniqlanishini tasdiqlang:
sudo systemctl start greeter.service
systemctl --user start healthcheck.service
journalctl --user -u healthcheck.service -n 5
Skript faqat nosozlikni emas, tiklanishni ham to'g'ri xabar qilishini tasdiqlash nosozlikni aniqlashning o'zi kabi muhim. Haqiqiy tuzatishdan keyin CRITICAL deb xabar berishda qotib qolgan monitoring skripti cheksiz yolg'on signallar hosil qilardi.
Amaliy vaziyat: timer natijasini ogohlantirishga ulash
Muammo. Timer orqali ishga tushirish journalctl da natija hosil qiladi, lekin journal’ni hech kim uzluksiz kuzatmaydi. Natija o'qilishini kutmasdan, CRITICAL holatida kimnidir faol xabardor qilishi kerak.
Buyruq:
cat <<'EOF' > ~/lab/healthcheck-deploy/alert-wrapper.sh
#!/bin/bash
/home/<username>/lab/healthcheck-deploy/healthcheck.sh > /tmp/healthcheck-last.txt
status=$?
if [ "$status" -eq 2 ]; then
logger -t healthcheck-alert "CRITICAL: $(cat /tmp/healthcheck-last.txt | tr '\n' ' ')"
fi
exit "$status"
EOF
chmod +x ~/lab/healthcheck-deploy/alert-wrapper.sh
sed -i 's#ExecStart=.*#ExecStart=/home/<username>/lab/healthcheck-deploy/alert-wrapper.sh#' ~/.config/systemd/user/healthcheck.service
systemctl --user daemon-reload
4-qadamdagi servisni to'xtatish trigger’ini takrorlab, unga mos yozuv paydo bo'lishini tasdiqlash orqali tekshiring:
sudo systemctl stop greeter.service
systemctl --user start healthcheck.service
journalctl -t healthcheck-alert -n 5
Jul 29 10:40:05 host healthcheck-alert[6210]: CRITICAL: CRITICAL: service 'greeter' is not running --- OVERALL STATUS: CRITICAL
Xulosa. logger teglangan yozuvni bevosita tizim journal’iga yozadi. Bu yerdan haqiqiy alerting pipeline healthcheck-alert bilan teglangan har qanday narsani chaqiruv tizimiga yoki chat kanaliga uzatadi. Bu aynan Monitoring, logging va automation maqolasi park miqyosida ko'rib chiqqan integratsiya turi, bu yerda esa minimal ishlaydigan versiya sifatida bitta hostga qo'llanilgan.
Keng tarqalgan xatolar
- Faqat OK yo'lini sinab, WARNING/CRITICAL "mantiq to'g'ri ko'ringani uchun" ishlaydi deb o'ylash. Bu lab ko'rsatganidek, har bir tarmoqni haqiqatan ishga tushirish quyi tizim aslida oladigan exit kod kod mo'ljallagan narsaga mos kelishini tasdiqlashning yagona usuli.
- Sinovdan keyin pasaytirilgan chegarani tiklashni unutib, skriptni doimiy ravishda haddan tashqari sezgir holda qoldirish. 3-qadamdagi tozalash qatorini shoshilishda o'tkazib yuborish oson. Sinovni tugagan deb hisoblashdan oldin test chegaralarini har doim tiklang.
- Faqat holat o'zgarganda emas, har bir ishga tushirishda ogohlantirish yuborish. Yuqoridagi o'ram har bir CRITICAL ishga tushirishda ogohlantirish yuboradi. Bu bir xil davom etayotgan muammo uchun har besh daqiqada kimnidir chaqirardi. Yetukroq versiya oxirgi ma’lum holatni kuzatib boradi va faqat o'tishda ogohlantiradi — bu mashq sifatida qoldirilgan tabiiy kengaytma.
Orqaga qaytarish va tozalash
systemctl --user disable --now healthcheck.timer
rm -f ~/.config/systemd/user/healthcheck.service ~/.config/systemd/user/healthcheck.timer
systemctl --user daemon-reload
rm -rf ~/lab/healthcheck-deploy
Yakuniy baholash mezoni
Quyidagilarning hammasi bajarilsa, bu lab yakunlangan hisoblanadi:
- timer
healthcheck.shni qo'lda aralashuvsiz avtomatik ishga tushiradi va busystemctl --user list-timersorqali tasdiqlangan; - uchala exit kod (0, 1, 2) ataylab ishga tushirilgan va ular shunchaki skriptning matnli chiqishidan o'qilmasdan,
ExecMainStatusorqali tasdiqlangan; - CRITICAL natija alert o'rami orqali alohida, teglanadigan journal yozuvini hosil qiladi va asosiy muammo tuzatilgach, tiklanish to'g'ri aks etadi.
Mashqlar
- Alert o'ramini oldingi ishga tushirish holatini holat faylida (
/tmp/healthcheck-last-status) kuzatib boradigan va faqat holat oldingi ishga tushirishdan o'zgargandaloggerni chaqiradigan qilib o'zgartiring. Bu yuqorida qayd etilgan takroriy ogohlantirish muammosini yo'q qiladi. healthcheck.shga mavjud tekshiruvlar bilan bir xilcheck_*funksiya shabloniga amal qilib, to'rtinchi tekshiruvni —uptimeyoki/proc/loadavgyordamida load average’ni — qo'shing va u umumiy holatni hisoblashga to'g'ri qo'shilishini tekshiring.ExecMainStatusnisystemctl --user showorqali tekshirish nega faqat skriptning chop etilgan "OVERALL STATUS" qatorini o'qishdan qat’iyroq sinov ekanini qisqa paragrafda tushuntiring.