
MÔnikord on vaja kiiresti teha uue teenuse jÀlgimist, kuid valmis infrastruktuuri/ekspertiisi pole kÀepÀrast. Selles juhendis loome poole tunni jooksul tööriista mis tahes veebiteenuste jÀlgimiseks, kasutades ainult Ubuntu sisseehitatud tööriistu: bash, cron ja curl. Teavituste edastamiseks kasutame Telegrami.
«Kirsiks tordil» on kasutajate emotsionaalne kaasamine. Kontrollitud inimestel â toimib.
Kui me telemeditsiiniteenus Doktor RÔÔm lÔime kasutajate stressi taseme mÀÀramiseks chati-boti, vajasime jÀlgimist. Paari tunni jooksul loodi mini-projekt, mis mitte ainult ei tööta suurepÀraselt, vaid toob ka positiivsust oma sÔnumitega.
Alustuseks saame skriptide reposti:
git clone https://github.com/rshekhovtsov/msms.gitLiigume msms kausta ja töötlus toimub seal.
Kui Telegram on blokeeritud, kasutage proksi. KÔige lihtsam ja usaldusvÀÀrsem variant on torsocks:
sudo apt install tor
sudo apt install torsocksNÀitena seadistame kolme sammu jooksul google.com esilehe jÀlgimise.
SAMM 1. Loome boti Telegramis ja saame kasutaja ID.
- Otsinguribal Telegramis otsime :

- KĂ€ivitage see nupuga Start, sisestage kĂ€sk /newbot ja vastake kĂŒsimustele. Peate meeles pidama, et name â see on boti nimi, mis kuvatakse kasutajatele, ja username â on ainulaadne ja peab lĂ”ppema sĂ”naga «bot»:

Muuhulgas annab bot HTTP API jaoks salajase tokeni, mille tuleb kopeerida ja salvestada failisse telegram-api-key.txt kausta msms. - Otsime Telegramis meie boti nime ja kÀivitame selle.
- Viimase lihvina lisame end jÀlgimise teavituste saajate loendisse:
sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.shSkript vĂ€ljastab nimekirja viimastest pöördumistest botile, seal peaks olema ĂŒks rida meie ID ja nimega Telegramis. VĂ”tame selle ID ja salvestame faili services/google-recipients.txt. Faili formaat: iga rida â ĂŒks ID. NĂ€ide:
123456789 987654321
Uue saaja lisamiseks peab ta kÀivitama Telegramis boti, kÀivitama recipients-setup.sh ja lisama ID faili.
SAMM 2. Seame jĂ€lgimise ĂŒles.
Teenuse kirjeldamine toimub ini-faili loomise kaudu kaustas services. Peame mÀÀrama viis parameetrit:
- MSMS_SERVICE_NAME: teenuse nimetus â seda kasutatakse teavitustes ja jĂ€lgimislogs.
- MSMS_SERVICE_ENDPOINT: teenuse endpoint, mille poole me pöördume curl'iga.
- MSMS_CURL_PARAMS: tÀiendavad curl parameetrid, vt allolevat nÀidet.
- MSMS_EXPECTED: teenuse oodatud vastus. Kasutatakse, kui vastus on lĂŒhike.
- MSMS_EXPECTED_FILE: faili nimi, mis sisaldab teenuse oodatud vastust. Kui on mÀÀratud, kirjutab MSMS_EXPECTED ĂŒle.
- MSMS_RECIPIENTS: fail, mis sisaldab teavituste saajate loendit.
PĂ€ring google.com tagastab fikseeritud html koos ĂŒmbersuunamisega, kasutame seda kui serveri oodatud vastust:
curl google.com > services/google-response.htmlLoome faili services/google.ini:
MSMS_SERVICE_NAME='google esileht'
# teenuse lÔpp-punkt
MSMS_SERVICE_ENDPOINT='google.com'
# curl parameetrid
MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7'
# oodatud teenuse vastus
MSMS_EXPECTED_FILE='google-response.html'
# saajate loendi fail
MSMS_RECIPIENTS='google-recipients.txt' Uues MSMS_CURL_PARAMS vÔib mÀÀrata kÔik, mida curl toetab, sealhulgas:
- Keelata curl sÔnumid, et mitte ummistada konsooli ja logi:
-s - MÀÀrata ĂŒhenduse aegumine kontrollitava teenusega (sekundites):
--connect-timeout 3 - MÀÀrata vastuse saamise aegumine:
-m 7 - Keelata SSL sertifikaadi kontroll (nÀiteks kui kasutatakse iseallkirjastatud sertifikaati):
--insecure - MÀÀrata http-pĂ€ringu tĂŒĂŒp:
-X POST - MÀÀrata pÀised:
-H "Content-Type: application/json" - MÀÀrata pÀringu sisu stringina vÔi failina. NÀitena failile:
-d @request.json
Keelame teavitused ja mÀÀrame 3 sekundi ĂŒhenduse ning 7 sekundi vastuse aegumised.
EttevaatusabinĂ”ud: mÀÀrake parameetrite vÀÀrtused ĂŒhekordsetes jutumĂ€rkides, nagu nĂ€ites. Kahjuks on bash selles osas ĂŒsna habras ning vale asetatud jutumĂ€rk vĂ”ib pĂ”hjustada keerulisi, raskesti diagnoositavaid vigu.
Oleme seadnud jÀlgimise. Kontrollime, et kÔik on korras:
sudo chmod +x ./monitoring.sh
torsocks ./monitoring.shKÀsklus peaks vÀljuma sÔnumiga:
2020-01-10 12:14:31
health-check "google esileht": OKSAMM 3. Seadistame ajakava
Seadistame jÀlgimise ajakava cronis:
sudo crontab -eLisame rea iga minuti kontrollimiseks google.com:
*/1 * * * * torsocks /monitoring.sh >> /monitoring.log 2>&1Lisame igal pÀeval kell 11.00 teavituse, mis kinnitab jÀlgimise toimimise. Selleks edastame skriptile parameetri DAILY:
0 11 * * * torsocks /monitoring.sh DAILY >> /monitoring.log 2>&1
2>&1 â standardne meetod, mis suunab vead pĂ”hivĂ€ljundvoogu. Seega jĂ”uavad need ka jĂ€lgimislogisse.
Salvestame muudatused ja laadime need sisse kÀsuga:
sudo service cron reloadRohkem teavet cron seadistamise kohta saab lugeda nÀiteks .
Nii hakkab iga minuti jÀrel kÀivituma jÀlgimise skript, mis teeb curl'i kaudu pöördumise google.com-i poole. Kui saadud vastus erineb oodatud vastusest, saadab skript hoiatused saajate nimekirjale telegramis. Kontrollide ajalugu hoitakse failis monitoring.log
Kui on vaja lisada veel ĂŒks teenus, loome lihtsalt selle jaoks uue ini-faili kausta services ja vajadusel koostame eraldi saajate nimekirja. KĂ”ik muu töötab automaatselt.
Kui kontrollitav teenus muutub kĂ€ttesaamatuks, saadetakse teavitus iga minuti jĂ€rel. Kui teenust ei Ă”nnestu kiiresti taastada, saab telegrami botis teavitused ajutiselt vĂ€lja lĂŒlitada.
NĂŒĂŒd vaatame lĂ€hemalt lisavĂ”imalusi ja skriptide rakendust.
SÔnumite mallid ja emotsionaalne kaasatus
Selleks, et suhtlemine botiga oleks elavam, nimetasime ta Manjaks, lisasime vastava pildi avatariks ja kaasasime professionaalsed suhtekorraldajad sÔnumite tekstide loomiseks. Saate kasutada meie arengut vÔi muuta vastavalt oma maitsele.
NĂ€iteks nii:

vÔi isegi nii:

Miks mitte?
Boti nimi ja avatar mÀÀratakse lÀbi .
SÔnumite mallid asuvad kaustas templates:
- curl-fail.txt: sÔnum, mis saadetakse, kui curl tagastab nullist erineva veakoodi. See tÀhendab tavaliselt, et teenusele ei saanud ligi.
- daily.txt: igapÀevane sÔnum, mis kinnitab, et teenuse jÀlgimine töötab.
- service-fail.txt: sÔnum, mis saadetakse, kui teenuse vastus erineb oodatud vastusest.
Vaatame kohandamise vÔimalusi sisseehitatud sÔnumite mallide nÀitel.
Mallides kasutatakse emojisi. Kahjuks habr neid ei kuva.
Emojide otsimiseks on mugav kasutada otsingut :

Sobiva sĂŒmboli kopeerite lihtsalt ja kleepite sĂ”numite malli tekstis (see on tavaline unicode).
- curl-fail.txt:
Kassipoeg, aita mind... Ei saa teenusele "$MSMS_SERVICE_NAME" ligi `CURL EXIT CODE: $EXIT_CODE`Kasutame meie mÀÀratud teenuse nime (muutuja
MSMS_SERVICE_NAME) ja skripti sisemiselt mÀÀratud muutuja curl'i vĂ€ljalaskekoodiga (EXIT_CODE). Samuti vormindasime sĂ”numi, kasutades vormindust : sĂŒmbolid "`" ĂŒmbritsevad fikseeritud laiusega teksti. Kuna jutumĂ€rgid ja apostroofilised sĂŒmbolid on bashis erisĂŒmbolid, peame need sĂŒmboliga "" varjama. Muutujate nimed algavad sĂŒmboliga "$".Tulemus:

- service-fail.txt:
Kallis, aita mind... Teenuse "$MSMS_SERVICE_NAME" tÔttu olen ma kurb See ei toimi korralikult, siin on, mida see mulle vastab: `$RESPONSE`Tulemus:

Siin kasutame veel ĂŒhte skripti muutujat:RESPONSE. See sisaldab teenuse vastust. - daily.txt:
Tere, kallis! Mul on kÔik hÀsti, jÀlgin teenust: "$MSMS_SERVICE_NAME" iga minuti tagant... Aga kuidas sul lÀheb?Tulemus:

Liigume skriptide rakendamise juurde.
JĂ€lgimisskript
monitoring.sh teeb lihtsa automaatse avastuse â vĂ”tab kĂ”ik ini-failid kaustast services ja kĂ€ivitab igaĂŒhe jaoks pĂ”hiskripti kontrollimise loogikaga ja teavituste saatmisega:
#!/bin/bash
cd $(dirname "$0")/services
for service_ini in $(ls *.ini); do
bash ../msms.sh "$1" "$service_ini"
doneKdaily mess sÔnumi moodustamiseks skriipti saab edastada parameeter DAILY.
Pange tÀhele, et skripti kÀivitamisel vahetatakse praegune kaust services'iks. See vÔimaldab ini-failides mÀÀrata failide teed suhtelisegi services.
Kontrollimise ja teavituste saatmise skript
msms.sh sisaldab teenuse kontrollimise ja teavituste saatmise peamist loogikat.
Töö telegramiga:
# telegram endpoint
TG_API_URL="https://api.telegram.org/bot$(cat ../telegram-api-key.txt)/sendMessage"
#################################################################
# send message to telegram
# parameter: message text
#################################################################
function send_message {
for chat_id in $(cat ../$MSMS_RECIPIENTS); do
curl -s -X POST --connect-timeout 10 $TG_API_URL -d chat_id=$chat_id -d parse_mode="Markdown" -d text="$1"
echo
done
}
Me moodustame URL-i REST API telegramile juurdepÀÀsuks, kasutades failis salvestatud salajast vÔtit.
Funktsioon send_message kasutab curl'i sÔnumite saatmiseks sellele REST API-le, saades saajate id-d failist, mille me oleme mÀÀranud ini-s. Saatmise andmetes mÀÀrame, et kasutame sÔnumite vormindamist: parse_mode="Markdown".
VÀljastame praeguse kuupÀeva-kellaaja ja laadime ini-faili.
echo $(date '+%Y-%m-%d %H:%M:%S')
# laadige muutujad .ini failist:
. $2
Maagiline rida . $2 tÀidab sisendiks antud teise parameetriga ini-faili nagu tavalise skripti, kandes mÀÀratud vÀÀrtused keskkonnamuutujatesse.
Laadime oodatud vastuse failist, kui on mÀÀratud parameeter MSMS_EXPECTED_FILE:
if [ -n "$MSMS_EXPECTED_FILE" ]; then
MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi
Teeme teenuse kontrollimise koos teavituste saatmisega, kui on vaja:
RESPONSE="$(eval curl $MSMS_CURL_PARAMS "$MSMS_SERVICE_ENDPOINT")"
EXIT_CODE=$?
if [[ $EXIT_CODE != 0 ]]; then
echo health-check "$MSMS_SERVICE_NAME" EBAKASS: CURL EXIT WITH $EXIT_CODE
MESSAGE="$(cat ..\/templates\/curl-fail.txt)"
MESSAGE=$(eval echo $MESSAGE)
send_message "$MESSAGE"
elif [[ "$RESPONSE" != "$MSMS_EXPECTED" ]]; then
echo health-check "$MSMS_SERVICE_NAME" EBAKASS: "$RESPONSE"
MESSAGE="$(cat ..\/templates\/service-fail.txt)"
MESSAGE=$(eval echo $MESSAGE)
send_message "$MESSAGE"
else
echo health-check "$MSMS_SERVICE_NAME": OK
fi
KÔigepealt mÀÀrame muutujale RESPONSE curl'i kÀsu tÀitmise tulemuse sellele teenusele.
MÀrkuse EXIT_CODE=$? salvestab muutuja viimase kÀsu, s.t. curl, tÀitmise tulemuse. Kui on vajalik teate saatmine, loetakse vastav mall vastavast failist ja saadetakse adressaatidele kaudu send_message.
Viimane plokk töötleb parameetrit DAILY:
if test "$1" = "DAILY"; then
echo health-check "$MSMS_SERVICE_NAME" DAILY
MESSAGE="$(cat ..\/templates\/daily.txt)"
MESSAGE=$(eval echo $MESSAGE)
send_message "$MESSAGE"
fiSaadetakse teade, mis kinnitab, et jÀlgimine on endiselt toimiv.
Kasutajate id-de nimekiri
recipients-setup.sh kutsutakse API telegram ĂŒles, et saada botile adresseeritud viimased sĂ”numid:
curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdates
| python recipients-setup.pySiin kasutatakse python'i maagiat, et vÀlja anda nimekirja kena vÀljanÀgemisega. See ei ole kohustuslik, vÔid lihtsalt vÔtta vajaliku id json-ist, mille kÀsk vÀlja annab:
torsocks curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdatesKokkuvÔte
Nii saate kasutada valmis skripte ja sĂ”numi malle, seadistades ainult jĂ€lgimist soovitavaid teenuseid ja teavitamise nimekirju; vĂ”ite luua uue âisiksuseâ botile; vĂ”i vĂ”ite teha oma lahenduse pakutud alusel.
Jatkusuutlikuks arendamiseks tundub olevat vajalik jĂ€lgimise konfigureerimine ja haldamine botis endas, kuid siinkohal ei saa piirduda ilma python'ita. Kui keegi jĂ”uab varem minna, teate, kuhu pull request esitada đ
Allikas: habr.com



