Bot for overvåking av webtjenester på en halvtime: telegram + bash + cron

Bot for overvåking av webtjenester på en halvtime: telegram + bash + cron

Noen ganger må du raskt implementere overvåking for en ny tjeneste, men du har ikke den nødvendige infrastrukturen eller ekspertisen for hånden. I denne veiledningen skal vi implementere et verktøy for å overvåke enhver webtjeneste på en halvtime, kun ved hjelp av innebygde verktøy. ubuntu: bash, cron и curl. Для доставки оповещений будем использовать telegram.

"Kirsebæret på kaken" vil være brukernes følelsesmessige involvering. Testet på mennesker - det fungerer.

Da vi i telemedisintjenesten Doctor Nearby opprettet en chatbot for å fastslå stressnivået til brukere, trengte vi overvåking. På et par timer ble det laget et miniprosjekt som ikke bare fungerer utmerket, men som også tilfører positivitet med budskapene sine.

Først, la oss få et depot med skript:

git clone https://github.com/rshekhovtsov/msms.git

Gå til msms-mappen og jobb i den.

Hvis telegram er blokkert, bruk en proxy. Det enkleste og mest pålitelige alternativet er torsokker:

sudo apt install tor
sudo apt install torsocks

La oss for eksempel sette opp overvåking av google.com-startsiden i tre trinn.

TRINN 1. Lag en bot i telegram og få bruker-ID

  • I søkefeltet for kontakter i telegram ser vi etter @botfar:

    Bot for overvåking av webtjenester på en halvtime: telegram + bash + cron

  • Vi starter den med Start-knappen, skriver inn /newbot-kommandoen og svarer på spørsmålene. Du må huske på at navnet er navnet på boten som skal vises til brukerne, og brukernavnet er unikt og må slutte med "bot":

    Bot for overvåking av webtjenester på en halvtime: telegram + bash + cron

    Boten vil blant annet utstede et hemmelig token for HTTP API, som må kopieres og lagres i telegram-api-key.txt-filen i msms-mappen.

  • Vi skriver inn navnet på boten vår i telegramsøkefeltet og starter det.
  • Som en prikken over i-en, la oss legge oss selv til listen over mottakere av overvåkingsvarsler:
    sudo chmod +x ./recipients-setup.sh
    torsocks ./recipients-setup.sh

    Skriptet vil vise en liste over nylige anrop til boten; det skal være en linje med vår id og navn i telegram. Vi tar denne ID-en og lagrer den i filen services/google-recipients.txt. Filformat: hver linje er én id. Eksempel:

    123456789
    987654321

For å legge til en ny mottaker, må du be ham starte boten i telegram, kjøre recipients-setup.sh og legge til id-en til filen.

TRINN 2. Sett opp overvåking

Tjenesten beskrives ved å opprette en ini-fil i tjenester-mappen. Du må angi fem parametere:

  1. MSMS_SERVICE_NAME: tjenestenavn - vil bli brukt i varsler og overvåkingslogg.
  2. MSMS_SERVICE_ENDPOINT: endepunkt for tjenesten som vi vil kontakte med curl.
  3. MSMS_CURL_PARAMS: flere krøllealternativer, se eksempel nedenfor.
  4. MSMS_EXPECTED: forventet svar fra tjenesten. Brukes hvis svaret er kort.
  5. MSMS_EXPECTED_FILE: filnavn med forventet tjenestesvar. Hvis spesifisert, overskriver MSMS_EXPECTED.
  6. MSMS_RECIPIENTS: fil med en liste over varslingsmottakere.

En forespørsel til google.com returnerer fast html med en omdirigering, vi vil bruke den som forventet serversvar:

curl google.com > services/google-response.html

La oss lage services/google.ini-filen:

MSMS_SERVICE_NAME='google front page'

# service endpoint
MSMS_SERVICE_ENDPOINT='google.com'

# curl parameters
MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7'

# expected service response
MSMS_EXPECTED_FILE='google-response.html'

# recipients list file
MSMS_RECIPIENTS='google-recipients.txt'

В MSMS_CURL_PARAMS du kan stille inn alt som curl kan gjøre, inkludert:

  1. Deaktiver krøllemeldinger for å unngå rot i konsollen og loggen: -s
  2. Still inn tilkoblingstidsavbrudd med tjenesten som kontrolleres (i sekunder): --connect-timeout 3
  3. Angi tidsavbrudd for svar: -m 7
  4. Deaktiver sertifikatverifisering for SSL (for eksempel hvis du bruker et selvsignert sertifikat): --insecure
  5. Spesifiser http-forespørselstypen: -X POST
  6. Spesifiser overskrifter: -H "Content-Type: application/json"
  7. Spesifiser forespørselsteksten som en streng eller fil. Eksempel for en fil: -d @request.json

Vi har deaktivert varsler og satt tidsavbrudd til 3 sekunder. for å koble til og 7 sek. for å motta et servicesvar.

Oppmerksomhet: Spesifiser parameterverdier i enkle anførselstegn, som i eksemplet. Dessverre er bash ganske skjør i denne forstand, og en tilfeldig sommerfugl med feil anførselstegn kan føre til universets død med vanskelig å diagnostisere feil.

Vi har satt opp overvåking. La oss sjekke at alt er i orden:

sudo chmod +x ./monitoring.sh
torsocks ./monitoring.sh

Skriptet skal vise en melding som:

2020-01-10 12:14:31
health-check "google front page": OK

TRINN 3. Sette opp en tidsplan

La oss sette opp en overvåkingsplan i cron:

sudo crontab -e

La oss legge til en linje for å sjekke google.com hvert minutt:

*/1 * * * * torsocks <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.sh >> <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.log 2>&1

Vi vil legge til et varsel hver dag klokken 11.00:XNUMX, som bekrefter funksjonaliteten til selve overvåkingen. For å gjøre dette, sender vi DAILY-parameteren til skriptet:

0 11 * * * torsocks <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.sh DAILY >> <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.log 2>&1

2>&1 - en standardteknikk som omdirigerer feil til hovedutgangsstrømmen. Som et resultat vil de også havne i overvåkingsloggen.

La oss lagre endringene og plukke dem opp med kommandoen:

 sudo service cron reload

Du kan lese mer om å sette opp cron, for eksempel, her.

Dermed vil det hvert minutt bli lansert et overvåkingsskript, som vil kontakte google.com via curl. Hvis svaret som mottas avviker fra det forventede, vil skriptet sende et telegramvarsel til listen over mottakere. Tilsynsloggen oppbevares i filen monitoring.log

Hvis vi trenger å legge til en annen tjeneste, lager vi ganske enkelt en ny ini-fil for den i tjenester-mappen og lager om nødvendig en egen liste over mottakere. Alt annet vil fungere automatisk.

Hvis tjenesten som sjekkes har blitt utilgjengelig, vil et varsel bli sendt hvert minutt. Hvis du ikke raskt kan gjenopprette tjenesten, kan du midlertidig deaktivere varsler i botens telegramegenskaper.

La oss nå se nærmere på tilleggsfunksjonene og implementeringen av skript.

Meldingsmønstre og emosjonelt engasjement

For å gjøre kommunikasjonen med boten mer livlig, kalte vi den Manechka, la til et passende avatarbilde og hyret inn profesjonelle PR-spesialister for å lage meldingstekster. Du kan bruke vår erfaring eller endre den til din smak.

For eksempel slik:

Bot for overvåking av webtjenester på en halvtime: telegram + bash + cron
eller til og med slik:

Bot for overvåking av webtjenester på en halvtime: telegram + bash + cron
Hvorfor ikke?

Botnavnet og avataren settes via @botfar.
Meldingsmaler er i mappen maler:

  • curl-fail.txt: melding sendt når curl returnerer en feilkode som ikke er null. Vanligvis snakker det om umuligheten av å nå tjenesten.
  • daily.txt: Daglig melding som bekrefter at serviceovervåking fungerer.
  • service-fail.txt: En melding sendt når tjenestesvaret er forskjellig fra det som var forventet.

La oss se på tilpasningsalternativene ved å bruke innebygde meldingsmaler som et eksempel.
Malene bruker emoji. Dessverre viser ikke habr dem.
For å velge emoji er det praktisk å bruke søket på emojipedia.org:

Bot for overvåking av webtjenester på en halvtime: telegram + bash + cron

Du kopierer ganske enkelt og limer inn riktig symbol i malteksten (dette er vanlig unicode).

  1. curl-fail.txt:
    Котёнок,  помоги мне... 
    Не могу достучаться до сервиса "$MSMS_SERVICE_NAME" 
    `CURL EXIT CODE: $EXIT_CODE`

    Vi brukte tjenestenavnet vi spesifiserte (variabel MSMS_SERVICE_NAME) og en intern skriptvariabel med curl exit-kode (EXIT_CODE). Vi har også formatert meldingen ved hjelp av markup telegramavmerking: "`"-tegn omgir tekst med fast bredde. Siden sitater og apostrof er bash-symboler, unnslipper vi dem med "". Variabelnavn innledes med et "$"-tegn.

    Resultat:

    Bot for overvåking av webtjenester på en halvtime: telegram + bash + cron

  2. service-fail.txt:
    Котёнок, помоги мне... 
    Сервис "$MSMS_SERVICE_NAME" меня расстроил
    Он работает неправильно, вот что он мне отвечает:
    `$RESPONSE`

    Resultat:

    Bot for overvåking av webtjenester på en halvtime: telegram + bash + cron

    Her bruker vi en annen skriptvariabel: RESPONSE. Den inneholder tjenestesvaret.

  3. daily.txt:
    Малыш, привет!
    У меня всё хорошо, cлежу за сервисом:
    "$MSMS_SERVICE_NAME" каждую минутку...
    А как у тебя дела?
    

    Resultat:

    Bot for overvåking av webtjenester på en halvtime: telegram + bash + cron

La oss gå videre til implementeringen av skript.

Overvåkingsskript

monitoring.sh gjør en enkel automatisk oppdagelse - den tar alle ini-filene fra tjenester-mappen og kjører hovedskriptet for hver enkelt med logikken for å sjekke og sende varsler:

#!/bin/bash
cd $(dirname "$0")/services

for service_ini  in $(ls *.ini); do
    bash ../msms.sh "$1" "$service_ini"
done

For å generere en daglig melding om overvåkingsstatus, kan du sende parameteren DAILY til skriptet.

Vær oppmerksom på at når skriptet starter, endres gjeldende mappe til tjenester. Dette lar deg spesifisere filstier i forhold til tjenester i ini-filer.

Skript for å sjekke og sende varsler

msms.sh inneholder hovedlogikken for å sjekke tjenesten og sende varsler.

Arbeide med telegram:

# 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
}

Vi genererer en URL for å få tilgang til telegram REST API ved å bruke den hemmelige nøkkelen som er lagret i filen.

Send_message-funksjonen bruker curl for å sende meldinger til denne REST API, og tar mottaker-ID fra filen vi spesifiserte i ini. I dataene vi sender, indikerer vi at vi bruker meldingsoppmerking: parse_mode="Markdown".

La oss vise gjeldende dato og klokkeslett og laste ini-filen.

echo $(date '+%Y-%m-%d %H:%M:%S')

# load variables from .ini file:
. $2

Magisk streng . $2 kjører ini-filen som sendes til inngangen som den andre parameteren som et vanlig skript, og legger inn verdiene spesifisert i den i miljøvariabler.

Last den forventede responsen fra filen hvis parameteren er spesifisert MSMS_EXPECTED_FILE:

if [ -n "$MSMS_EXPECTED_FILE" ]; then
 MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi

Vi vil sjekke tjenesten og sende varsler om nødvendig:

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

Først tilordner vi til variabelen RESPONSE resultatet av å utføre curl-kommandoen for denne tjenesten.

uttrykket EXIT_CODE=$? setter resultatet av den siste kommandoen inn i en variabel, dvs. krølle. Hvis det er nødvendig å sende et varsel, leses malen fra den tilsvarende filen og sendes til mottakere vha send_message.

Den siste blokken behandler parameteren 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"
fi

Den sender en melding som bekrefter funksjonaliteten til selve overvåkingen.

Få en liste over bruker-IDer

recipients-setup.sh kaller opp telegram API for å få de siste meldingene adressert til boten:

curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdates 
| python recipients-setup.py

Dette bruker python-magi for å vise en liste vakkert. Dette er ikke nødvendig, du kan ganske enkelt ta ønsket ID fra json, som kommandoen vil gi ut:

torsocks curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdates

Konklusjon

Dermed kan du bruke ferdige skript og meldingsmaler, og sette opp kun overvåkede tjenester og lister for varsler; du kan lage en ny "personlighet" for boten; eller du kan ta din egen beslutning basert på det som ble foreslått.

Alternativer for videreutvikling foreslår å konfigurere og administrere overvåking i selve boten, men her kan du ikke klare deg uten python. Hvis noen får det før meg, vet du hvor du skal sende inn pull-forespørselen :)

Kilde: www.habr.com

Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Kjøp pålitelig webhotell med DDoS-beskyttelse, VPS VDS-servere | ProHoster