
有时您需要快速监视新服务,但是手头没有现成的基础架构/专业知识。 在本指南中,我们将在半小时内实现一个工具,该工具仅使用内置的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
要添加新收件人,您需要让他以电报方式启动漫游器,运行收件人-setup.sh并向文件添加ID。
步骤2.配置监视
通过在servies文件夹中创建一个ini文件来进行服务描述。 需要设置五个参数:
- MSMS_SERVICE_NAME :服务名称-将用于警报和监视日志 。
- MSMS_SERVICE_ENDPOINT :我们将联系curl的服务的端点。
- MSMS_CURL_PARAMS :其他curl参数,请参见下面的示例。
- MSMS_EXPECTED :预期的服务响应。 如果答案很短时使用。
- MSMS_EXPECTED_FILE :具有预期服务响应的文件名。 如果指定,则覆盖MSMS_EXPECTED。
- MSMS_RECIPIENTS :带有通知收件人列表的文件。
google.com上的请求返回带有重定向的固定html,我们将其用作预期的服务器响应:
curl google.com > services/google-response.html
创建服务/ google.ini文件:
MSMS_SERVICE_NAME='google front page'
在
MSMS_CURL_PARAMS
您可以指定curl可以做的所有事情,包括:
- 禁用curl消息,以免阻塞控制台并记录:
-s
- 设置连接超时并检查服务(以秒为单位):--
--connect-timeout 3
- 设置响应超时:
-m 7
- 禁用SSL的证书验证(例如,如果使用了自签名证书):--
--insecure
- 指定http请求的类型:
-X POST
- 指定标题:
-H "Content-Type: application/json"
- 将请求主体指定为字符串或文件。 文件示例:
-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)。
- curl-fail.txt:
, ... \"$MSMS_SERVICE_NAME\" \`CURL EXIT CODE: $EXIT_CODE\`
我们使用了我们指定的服务名称( MSMS_SERVICE_NAME
变量)和内部脚本变量以及curl终止代码( EXIT_CODE
)。 我们还使用电报降价标记来格式化消息:字符``''将固定宽度的框架文本。 由于引号和撇号是正式的bash字符,因此我们使用“ \”字符对其进行转义。 变量名前面带有“ $”符号。
结果:

- service-fail.txt:
, ... \"$MSMS_SERVICE_NAME\" , : \`$RESPONSE\`
结果:

在这里,我们使用另一个脚本变量: RESPONSE
。 它包含服务的响应。
- daily.txt:
, ! , c : \"$MSMS_SERVICE_NAME\" ... ?
结果:

让我们继续执行脚本。
监控脚本
monitoring.sh使自动发现变得简单-从services文件夹中获取所有ini文件,并对每个ini文件执行带有检查和发送警报逻辑的主脚本:
要生成有关监视状态的每日消息,可以向脚本传递DAILY参数。
请注意,脚本启动时,当前文件夹将更改为服务。 这允许ini文件指定相对于服务的文件路径。
用于检查和发送警报的脚本
msms.sh包含检查服务和发送警报的基本逻辑。
使用电报:
我们使用存储在文件中的私钥创建一个URL以访问电报REST API。
send_message函数使用curl将消息发送到此REST API,并从ini中指定的文件中获取接收者ID。 在我们发送的数据中,我们指示我们使用消息标记:
parse_mode="Markdown"
。
打印当前日期时间并加载ini文件。
echo $(date '+%Y-%m-%d %H:%M:%S')
魔术线
. $2
. $2
将作为第二个参数传入的ini文件作为普通脚本执行,将其中指定的值输入到环境变量中。
如果
MSMS_EXPECTED_FILE
了
MSMS_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。 如果有人在我之前举手-您知道在哪里上传拉取请求:-)