
Néha gyorsan kell ellenőrzést végezni egy új szolgáltatásnál, de nincs kéznél kész infrastruktúra vagy szakértelem. Ebben a útmutatóban fél óra alatt létrehozunk egy eszközt bármilyen webszolgáltatás monitorozására, kizárólag az ubuntu beépített eszközeit: bash, cron és curl használva. Az értesítések küldéséhez a telegráf fogjuk használni.
A „torta legfőbb dísze” az érzelmi felhasználói bevonódás lesz. Emberi tapasztalat — működik.
Amikor a Doktor Rául telemedicina szolgáltatásban létrehoztuk a stresszszintet meghatározó chatbotot, szükségünk volt monitorozásra. Pár óra alatt elkészült egy mini-projekt, amely nemcsak nagyszerűen működik, hanem pozitív üzeneteivel is feldobja a hangulatot.
Először szerezzük be a szkripteket tartalmazó tárolót:
git clone https://github.com/rshekhovtsov/msms.gitLépjünk be az msms mappába, és ott folytatjuk a munkát.
Ha a telegráf blokkolva van, használj proxyt. A legegyszerűbb és legmegbízhatóbb opció a torsocks:
sudo apt install tor
sudo apt install torsocksPéldaként három lépésben beállítjuk a google.com kezdőlap monitorozását.
1. Lépés. Hozzunk létre egy botot a telegráfon, és szerezzük meg a felhasználói azonosítót.
- A telegráfon a kontaktkereső keresőjében keressük: :

- Indítsuk el a Start gomb megnyomásával, írjuk be a /newbot parancsot, és válaszoljunk a kérdésekre. Ne felejtsük el, hogy a név — a bot neve, amely a felhasználóknál látható, míg a felhasználónév egyedi, és „bot” végződéssel kell rendelkeznie:

A bot többek között megad egy titkos tokent a HTTP API-hoz, amelyet másoljunk ki, és mentsük el az msms mappában a telegram-api-key.txt fájlba. - A telegráf keresőjében írjuk be a botunk nevét, és indítsuk el.
- Záró érintésként adjuk hozzá magunkat a monitorozás értesítési címzettjei közé:
sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.shA szkript kiírja az utolsó botkeresések listáját, ahol egy sorban látnunk kell a mi azonosítónkat és nevünket a telegráfon. Vegyük ezt az azonosítót, és mentsük el a services/google-recipients.txt fájlba. A fájl formátuma: minden sor egy azonosító. Példa:
123456789 987654321
Új címzett hozzáadásához kérjük meg, hogy indítsa el a botot a telegráfon, futtassa a recipients-setup.sh-t, és adja hozzá az azonosítót a fájlhoz.
2. Lépés. Beállítjuk a monitorozást.
A szolgáltatás leírása ini fájl létrehozásával történik a services mappában. Öt paramétert kell megadnunk:
- MSMS_SERVICE_NAME: a szolgáltatás neve — ez fog szerepelni az értesítésekben és a monitorozási naplóban.
- MSMS_SERVICE_ENDPOINT: a szolgáltatás végpontja, amelyet a curl-lal fogunk elérni.
- MSMS_CURL_PARAMS: további curl paraméterek, lásd az alábbi példát.
- MSMS_EXPECTED: a szolgáltatás várt válasza. Akkor használatos, ha a válasz rövid.
- MSMS_EXPECTED_FILE: a szolgáltatás várt válaszának fájlneve. Ha meg van adva, felülírja a MSMS_EXPECTED-t.
- MSMS_RECIPIENTS: értesítési címzettek listáját tartalmazó fájl.
A google.com kérés fix HTML-t ad vissza átirányítással, ezt használjuk a szerver várható válaszának:
curl google.com > services/google-response.htmlKészítjük a services/google.ini fájlt:
MSMS_SERVICE_NAME='google főoldal'
# szolgáltatás végpont
MSMS_SERVICE_ENDPOINT='google.com'
# curl paraméterek
MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7'
# várt szolgáltatás válasz
MSMS_EXPECTED_FILE='google-response.html'
# címzettek listát tartalmazó fájl
MSMS_RECIPIENTS='google-recipients.txt' A MSMS_CURL_PARAMS Mindent megadhatunk, amit a curl tud, beleértve:
- A curl üzenetek letiltása, hogy ne szennyezzék a konzolt és a naplót:
-s - Kapcsolati időkorlát megadása az ellenőrzött szolgáltatáshoz (másodpercekben):
--connect-timeout 3 - Válaszidő időkorlát megadása:
-m 7 - A SSL tanúsítvány ellenőrzésének letiltása (például, ha önaláírt tanúsítványt használ):
--insecure - HTTP kérés típusának megadása:
-X POST - Fejlécek megadása:
-H "Content-Type: application/json" - A kérés törzsét sztringként vagy fájlként megadni. Fájl példa:
-d @request.json
Lezártuk az értesítéseket és időkorlátokat állítottunk be 3 másodpercre a kapcsolatnál és 7 másodpercre a válasznál.
Figyelem: adja meg a paraméterek értékeit egyszeres idézőjelek között, mint a példában. Sajnos a bash ebből a szempontból elég érzékeny, és egy véletlenül megjelenő hiba, mint egy hibás idézőjel, nehezen diagnosztizálható hibákhoz vezethet.
Beállítottuk a monitorozást. Ellenőrizzük, hogy minden rendben van:
sudo chmod +x ./monitoring.sh
torsocks ./monitoring.shA szkriptnek a következő formátumú üzenetet kell kiadnia:
2020-01-10 12:14:31
health-check "google főoldal": OK3. LÉPÉS: Állítsuk be az ütemezést
Állítsuk be a monitorozás ütemezését a cron-ban:
sudo crontab -eAdjunk hozzá egy sort a google.com percenkénti ellenőrzéséhez:
*/1 * * * * torsocks /monitoring.sh >> /monitoring.log 2>&1Naponta 11.00-kor értesítést állítunk be a monitorozás működésének megerősítésére. Ehhez a szkriptnek a DAILY paramétert kell átadnunk:
0 11 * * * torsocks /monitoring.sh DAILY >> /monitoring.log 2>&1
2>&1 — a standard módszer, amely az alapvető kimeneti áramlásba irányítja a hibákat. Ennek eredményeképpen ezek is bekerülnek a monitorozási naplóba.
Mentjük a változtatásokat és alkalmazzuk őket a következő parancssal:
sudo service cron reloadTovábbi információkat talál a cron beállításáról, például .
Így minden egyes percben elindul a monitorozó skript, amely a curl segítségével hívja meg a google.com-ot. Ha a kapott válasz eltér a várt eredménytől, a skript értesítést küld a címzettek listájára a telegramon. A ellenőrzések naplója a monitoring.log fájlban található.
Ha szeretne hozzáadni egy új szolgáltatást, egyszerűen új ini-fájlt hozunk létre a services mappában, és szükség esetén formálunk egy külön címzettlistát. Minden más automatikusan működni fog.
Ha a vizsgált szolgáltatás elérhetetlenné válik, az értesítések percenként érkeznek. Ha nem sikerül gyorsan helyreállítani a szolgáltatást, ideiglenesen leállíthatja az értesítéseket a telegram botjának beállításaiban.
Most nézzük meg részletesen a szkriptek további lehetőségeit és megvalósítását.
Üzenetminták és érzelmi bevonódás
A bot interakciójának élénkebbé tétele érdekében elneveztük Manének, hozzáadtunk egy megfelelő képet-avatare és profi PR szakembereket vontunk be az üzenetek írásába. Használhatja munkáinkat, vagy kicserélheti a saját ízlése szerint.
Például így:

vagy akár így:

Miért ne?
A bot neve és avatare a következő módon állítható be .
Az üzenetminták a mappában találhatók templates:
- curl-fail.txt: üzenet, amely akkor küldésre kerül, ha a curl nem nullás hibakódot adott vissza. Általában azt jelzi, hogy nem sikerült elérni a szolgáltatást.
- daily.txt: napi üzenet, amely megerősíti, hogy a szolgáltatás monitorozása működik.
- service-fail.txt: üzenet, amely akkor küldésre kerül, ha a szolgáltatás válasza eltér a várt eredménytől.
A beépített üzenetminták testreszabási lehetőségeit vizsgáljuk meg.
A mintákban emoji-kat használnak. Sajnos, a habr nem jeleníti meg őket.
Az emoji-k kereséséhez kényelmesen használhatja a :

A megfelelő karaktert egyszerűen másolja és illessze be az üzenetmintába (ez egy sima unicode).
- curl-fail.txt:
Cica, segíts nekem... Nem tudok elérni a "$MSMS_SERVICE_NAME" szolgáltatást. `CURL EXIT CODE: $EXIT_CODE`Használjuk a megadott szolgáltatás nevét (változó
MSMS_SERVICE_NAME) és a skript belső változóját a curl kimeneti kódhoz (EXIT_CODE). Ezen kívül az üzenetet formáztuk a : A karakterek "`" egy fix szélességű szöveget kereteznek. Mivel a szalagok és aposztrófok a bash szolgáltatásai, ezeket "" karakterrel kell escape-elni. A változók neve elől "$" jellel kezdődik.Eredmény:

- service-fail.txt:
Cica, segíts nekem... A "$MSMS_SERVICE_NAME" szolgáltatásom csalódást okozott. Nem működik helyesen, ezt válaszolja: `$RESPONSE`Eredmény:

Itt újabb szkriptváltozót használunk:RESPONSE. Ez tartalmazza a szolgáltatás válaszát. - daily.txt:
Kicsi, szia! Minden rendben van, figyelem a szolgáltatást: "$MSMS_SERVICE_NAME" minden percben... Hogy vagy?Eredmény:

Lépjünk a szkriptek megvalósítására.
Monitoring szkript
monitoring.sh egyszerű automatikus felfedezést végez – összes ini fájlt a services mappából veszi, és mindegyikhez végrehajtja a fő szkriptet a ellenőrzési és értesítési logikával:
#!/bin/bash
cd $(dirname "$0")/services
for service_ini in $(ls *.ini); do
bash ../msms.sh "$1" "$service_ini"
doneA napi monitoring állapotjelentés előállításához a szkriptnek átadható a DAILY paraméter.
Tartsuk szem előtt, hogy a szkript indításakor a jelenlegi mappa services-re változik. Ez lehetővé teszi az ini fájlokban, hogy a fájlok útvonalai a services-hez képest legyenek megadva.
A szolgáltatás ellenőrzését és az értesítések küldését végző szkript
msms.sh tartalmazza a szolgáltatás ellenőrzésének és értesítések küldésének fő logikáját.
Munka a telegrammal:
# 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
}
URL-t készítünk a REST API telegramhoz való hozzáféréshez, a fájlban tárolt titkos kulcs felhasználásával.
A send_message funkció curl-t használ az üzenetek küldésére ezen a REST API-n, a címzettek id-jét pedig a számunkra adott ini fájlból visszük el. A küldött adatokban megadjuk, hogy üzenet formázást használunk: parse_mode="Markdown".
Kiírjuk az aktuális dátum-időt, és betöltjük az ini fájlt.
echo $(date '+%Y-%m-%d %H:%M:%S')
# változók betöltése az .ini fájlból:
. $2
Varázslatos sor . $2 az átadott második paraméter élő fájlként működik, rendes szkriptként, és a benne megadott értékeket környezeti változókba írja.
Betöltjük a várt választ a fájlból, ha a paraméter meg van adva. MSMS_EXPECTED_FILE:
if [ -n "$MSMS_EXPECTED_FILE" ]; then
MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi
Ellenőrizzük a szolgáltatást, értesítések küldésével, ha szükséges:
RESPONSE="$(eval curl $MSMS_CURL_PARAMS "$MSMS_SERVICE_ENDPOINT")"
EXIT_CODE=$?
if [[ $EXIT_CODE != 0 ]]; then
echo health-check "$MSMS_SERVICE_NAME" FAILED: 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" FAILED: "$RESPONSE"
MESSAGE="$(cat ..\/templates\/service-fail.txt)"
MESSAGE=$(eval echo $MESSAGE)
send_message "$MESSAGE"
else
echo health-check "$MSMS_SERVICE_NAME": OK
fi
Első lépésben a változóhoz RESPONSE a curl parancs futásának eredményét rendeljük hozzá ennek a szolgáltatásnak.
Kifejezés EXIT_CODE=$? eltárolja az utolsó parancs, azaz a curl végrehajtásának eredményét egy változóban. Ha értesítést kell küldeni, a megfelelő fájlból olvassa be a sablont, és küldje el a címzetteknek send_message.
Az utolsó blokk a DAILY paramétert dolgozza fel:
if test "$1" = "DAILY"; then
echo health-check "$MSMS_SERVICE_NAME" DAILY
MESSAGE="$(cat ..\/templates\/daily.txt)"
MESSAGE=$(eval echo $MESSAGE)
send_message "$MESSAGE"
fiEz egy üzenetet küld, amely megerősíti a monitorozás működését.
A felhasználói azonosítók listájának lekérése
recipients-setup.sh kapcsolódik a telegram API-hoz, hogy lekérje a bot számára címezett legutolsó üzeneteket:
curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdates
| python recipients-setup.pyItt a python varázslatot alkalmazzuk a lista szépen formázott megjelenítésére. Ez nem kötelező, egyszerűen ki lehet venni a szükséges azonosítót a parancs által megadott json-ból:
torsocks curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdatesZárás
Ezért használhatja a kész szkripteket és az üzenetsablonokat, csak a megfigyelt szolgáltatásokat és az értesítési listákat kell beállítania; létrehozhat egy új "személyiséget" a bot számára; vagy saját megoldást készíthet az ajánlott alapjain.
Lehetséges további fejlődési lehetőség a monitorozás konfigurálása és kezelése a botban, de itt már python nélkül nem lehet megoldani. Ha valakinek hamarabb sikerül, tudjátok, hova kell felölteni a pull requestet 🙂
Forrás: habr.com



