Webszolgáltatások monitorozó bot fél óra alatt: telegram + bash + cron

Webszolgáltatások monitorozó bot fél óra alatt: telegram + bash + cron

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.git

Lé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 torsocks

Pé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: @botfather:

    Webszolgáltatások monitorozó bot fél óra alatt: telegram + bash + cron

  • 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:

    Webszolgáltatások monitorozó bot fél óra alatt: telegram + bash + cron

    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.sh

    A 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:

  1. MSMS_SERVICE_NAME: a szolgáltatás neve — ez fog szerepelni az értesítésekben és a monitorozási naplóban.
  2. MSMS_SERVICE_ENDPOINT: a szolgáltatás végpontja, amelyet a curl-lal fogunk elérni.
  3. MSMS_CURL_PARAMS: további curl paraméterek, lásd az alábbi példát.
  4. MSMS_EXPECTED: a szolgáltatás várt válasza. Akkor használatos, ha a válasz rövid.
  5. 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.
  6. 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.html

Ké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:

  1. A curl üzenetek letiltása, hogy ne szennyezzék a konzolt és a naplót: -s
  2. Kapcsolati időkorlát megadása az ellenőrzött szolgáltatáshoz (másodpercekben): --connect-timeout 3
  3. Válaszidő időkorlát megadása: -m 7
  4. 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
  5. HTTP kérés típusának megadása: -X POST
  6. Fejlécek megadása: -H "Content-Type: application/json"
  7. 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.sh

A szkriptnek a következő formátumú üzenetet kell kiadnia:

2020-01-10 12:14:31
health-check "google főoldal": OK

3. LÉPÉS: Állítsuk be az ütemezést

Állítsuk be a monitorozás ütemezését a cron-ban:

sudo crontab -e

Adjunk hozzá egy sort a google.com percenkénti ellenőrzéséhez:

*/1 * * * * torsocks /monitoring.sh >> /monitoring.log 2>&1

Naponta 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 reload

További információkat talál a cron beállításáról, például itt.

Í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:

Webszolgáltatások monitorozó bot fél óra alatt: telegram + bash + cron
vagy akár így:

Webszolgáltatások monitorozó bot fél óra alatt: telegram + bash + cron
Miért ne?

A bot neve és avatare a következő módon állítható be @botfather.
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 emojipedia.org:

Webszolgáltatások monitorozó bot fél óra alatt: telegram + bash + cron

A megfelelő karaktert egyszerűen másolja és illessze be az üzenetmintába (ez egy sima unicode).

  1. 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 telegram markdown: 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:

    Webszolgáltatások monitorozó bot fél óra alatt: telegram + bash + cron

  2. 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:

    Webszolgáltatások monitorozó bot fél óra alatt: telegram + bash + cron

    Itt újabb szkriptváltozót használunk: RESPONSE. Ez tartalmazza a szolgáltatás válaszát.

  3. daily.txt:
    Kicsi, szia!
    Minden rendben van, figyelem a szolgáltatást:
    "$MSMS_SERVICE_NAME" minden percben...
    Hogy vagy?
    

    Eredmény:

    Webszolgáltatások monitorozó bot fél óra alatt: telegram + bash + cron

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"
done

A 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"
fi

Ez 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.py

Itt 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)\/getUpdates

Zá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

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster