Bot在半小时内监控Web服务:电报+ bash + cron



有时您需要快速监视新服务,但是手头没有现成的基础架构/专业知识。 在本指南中,我们将在半小时内实现一个工具,该工具仅使用内置的ubuntu工具(bash,cron和curl)监视所有Web服务。 我们将使用电报发送警报。

“蛋糕上的樱桃”将成为用户的情感参与。 经过人检查-有效。

当我们在Doctor Near远程医疗服务中创建聊天机器人以确定用户压力水平时,我们需要进行监控。 在几个小时内,完成了一个小型项目,该项目不仅效果很好,而且还增加了积极的反馈。

首先,获取包含脚本的存储库:

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

转到msms文件夹,然后在其中工作。

如果电报被阻止,请使用代理。 最简单,最可靠的选择是:

 sudo apt install tor sudo apt install torsocks 

举例来说,我们将分三步配置google.com初始页监控。

步骤1.用电报创建一个机器人并获取用户ID


  • 在电报中的联系人搜索字符串中,查找@botfather


  • 我们使用“开始”按钮启动它,输入/ newbot命令并回答问题。 您需要记住,名称是将显示给用户的机器人名称,用户名是唯一的,并且必须以“机器人”结尾:



    除其他外,该漫游器将为HTTP API发行一个秘密令牌,您需要将其复制并保存到msms文件夹中的telegram-api-key.txt文件中。
  • 我们在电报搜索行中输入机器人的名称,然后运行它。
  • 最后,将自己添加到监视警报收件人列表中:

     sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.sh 

    该脚本将显示最近对该机器人的调用列表,应该在电报中包含一行带有我们的ID和名称的行。 我们获取此ID,并将其保存在services / google-recipients.txt文件中。 文件格式:每一行是一个id。 一个例子:

     123456789 987654321 

要添加新收件人,您需要让他以电报方式启动漫游器,运行收件人-setup.sh并向文件添加ID。

步骤2.配置监视


通过在servies文件夹中创建一个ini文件来进行服务描述。 需要设置五个参数:

  1. MSMS_SERVICE_NAME :服务名称-将用于警报和监视日志
  2. MSMS_SERVICE_ENDPOINT :我们将联系curl的服务的端点。
  3. MSMS_CURL_PARAMS :其他curl参数,请参见下面的示例。
  4. MSMS_EXPECTED :预期的服务响应。 如果答案很短时使用。
  5. MSMS_EXPECTED_FILE :具有预期服务响应的文件名。 如果指定,则覆盖MSMS_EXPECTED。
  6. MSMS_RECIPIENTS :带有通知收件人列表的文件。

google.com上的请求返回带有重定向的固定html,我们将其用作预期的服务器响应:

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

创建服务/ google.ini文件:

 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您可以指定curl可以做的所有事情,包括:

  1. 禁用curl消息,以免阻塞控制台并记录: -s
  2. 设置连接超时并检查服务(以秒为单位):-- --connect-timeout 3
  3. 设置响应超时: -m 7
  4. 禁用SSL的证书验证(例如,如果使用了自签名证书):-- --insecure
  5. 指定http请求的类型: -X POST
  6. 指定标题: -H "Content-Type: application/json"
  7. 将请求主体指定为字符串或文件。 文件示例: -d @request.json

我们关闭了通知,并将超时设置为3秒。 在连接和7秒。 接收服务的响应。

注意 :如示例中那样,用单引号指定参数值。 不幸的是,从这个意义上讲,bash相当脆弱,一只蝴蝶意外地飞到错误的位置可能导致宇宙死亡,并带有难以诊断的错误。

我们设置了监控。 检查一切正常:

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

该脚本应显示以下形式的消息:

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

步骤3.调整时间表


在cron中设置监视计划:

 sudo crontab -e 

添加一行以每分钟检查google.com:

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

每天在11.00添加警报,以确认监视本身。 为此,请将DAILY参数传递给脚本:

 0 11 * * * torsocks <   >/monitoring.sh DAILY >> <   >/monitoring.log 2>&1 

2>&1将错误重定向到主输出流的标准技术。 结果,它们也将包含在监视日志中。

保存更改并使用以下命令捕获更改:

  sudo service cron reload 

例如,您可以在此处阅读有关配置cron的更多信息。

因此,每分钟都会启动一个监视脚本,该脚本将通过google.com上的gol进行访问。 如果收到的答案与预期的答案不同,脚本将以电报形式将通知发送给收件人列表。 审核日志保存在monitoring.log文件中

如果您需要添加其他服务,我们只需在services文件夹中为其创建一个新的ini文件,并在必要时创建一个单独的收件人列表。 其他所有内容将自动运行。

如果已检查的服务不可用,将每分钟发送一次警报。 如果您无法快速恢复该服务,则可以临时关闭电报中漫游器属性中的通知。

现在,让我们仔细看看脚本的其他功能和实现。

信息模板和情感参与


为了使与该机器人的通信更加生动,我们将其称为Manechka,添加了相应的图片头像,并聘请了专业的PR专家来创建消息文本。 您可以使用我们的成就或改变自己的品味。

例如,像这样:


甚至是这样:


为什么不呢

机器人名称和头像是通过@botfather设置的。
消息模板位于模板文件夹中:

  • curl-fail.txt :curl返回非零错误代码时发送的消息。 通常说不上服务的可能性。
  • daily.txt :确认服务监视正在运行的每日消息。
  • service-fail.txt :服务响应与预期的不同时发送的消息。

让我们使用内置消息模板的示例检查自定义的可能性。
模板使用表情符号。 不幸的是,哈伯没有显示它们。
要选择表情符号,使用emojipedia.org上的搜索很方便:



您只需将适当的字符复制并粘贴到模板的文本中(这是通常的unicode)。
  1. curl-fail.txt:

     ,  ...      \"$MSMS_SERVICE_NAME\" \`CURL EXIT CODE: $EXIT_CODE\` 

    我们使用了我们指定的服务名称( MSMS_SERVICE_NAME变量)和内部脚本变量以及curl终止代码( EXIT_CODE )。 我们还使用电报降价标记来格式化消息:字符``''将固定宽度的框架文本。 由于引号和撇号是正式的bash字符,因此我们使用“ \”字符对其进行转义。 变量名前面带有“ $”符号。

    结果:


  2. service-fail.txt:

     ,  ...  \"$MSMS_SERVICE_NAME\"     ,     : \`$RESPONSE\` 

    结果:



    在这里,我们使用另一个脚本变量: RESPONSE 。 它包含服务的响应。
  3. daily.txt:

     , !    , c  : \"$MSMS_SERVICE_NAME\"  ...     ? 

    结果:



让我们继续执行脚本。

监控脚本


monitoring.sh使自动发现变得简单-从services文件夹中获取所有ini文件,并对每个ini文件执行带有检查和发送警报逻辑的主脚本:

 #!/bin/bash cd $(dirname "$0")/services for service_ini in $(ls *.ini); do bash ../msms.sh "$1" "$service_ini" done 

要生成有关监视状态的每日消息,可以向脚本传递DAILY参数。

请注意,脚本启动时,当前文件夹将更改为服务。 这允许ini文件指定相对于服务的文件路径。

用于检查和发送警报的脚本


msms.sh包含检查服务和发送警报的基本逻辑。

使用电报:

 # 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以访问电报REST API。

send_message函数使用curl将消息发送到此REST API,并从ini中指定的文件中获取接收者ID。 在我们发送的数据中,我们指示我们使用消息标记: parse_mode="Markdown"

打印当前日期时间并加载ini文件。

 echo $(date '+%Y-%m-%d %H:%M:%S') # load variables from .ini file: . $2 

魔术线. $2 . $2将作为第二个参数传入的ini文件作为普通脚本执行,将其中指定的值输入到环境变量中。

如果MSMS_EXPECTED_FILEMSMS_EXPECTED_FILE参数, MSMS_EXPECTED_FILE文件下载预期的响应:

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

如有必要,通过发送警报执行服务检查:

 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 

首先,我们将此服务的RESPONSE变量分配给curl命令的结果。

表达式EXIT_CODE=$? 放置最后一条命令的结果,即 卷曲。 如果您需要发送警报,则从相应的文件中读取模板,并使用send_message邮件发送给收件人。

最后一块处理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 

它发送一条消息,确认监视本身的运行状况。

获取用户ID列表


receives-setup.sh调用电报API以获取发送给该机器人的最新消息:

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

它使用python magic很好地列出了输出。 这是可选的,您可以简单地从json中获取所需的ID,该命令将输出:

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

结论


因此,您可以使用现成的脚本和消息模板,仅设置可观察的服务和通知列表。 您可以为机器人创建一个新的“身份”。 您可以根据建议做出决定。

作为进一步开发的选项,僵尸程序本身的监视配置和管理会提示自己,但是在这里您不能没有python。 如果有人在我之前举手-您知道在哪里上传拉取请求:-)

Source: https://habr.com/ru/post/zh-CN483318/


All Articles