我们知道, 之前的运维告警多通过 mail 等方式通知到相应的人员, 难以实现随时随地的查看. 随着手机 App 的发展, 很多告警开始发送到 IM 软件上去. 目前比较常用的是发送到微信和钉钉上, 今天我们将重点放在钉钉上. 群机器人是钉钉群的高级扩展功能, 群机器人可以将第三方服务的信息聚合到群聊中, 实现自动化的信息同步. 借助钉钉机器人, 通过官方提供的 API, 可以很方便的 post 数据到相应的接收人 . 群机器人支持 webhook 协议的自定义接入, 支持更多可能性, 例如: 你可将运维报警通过自定义机器人聚合到钉钉群实现提醒功能.
Shell 脚本语言是实现 Linux 系统管理及自动化所必须的重要工具. 熟练地编写 Shell 语言可以提升运维人员的工作效率, 适应复杂的工作环境.
在本文, 我们聚焦通过 shell 脚本语言实现借助钉钉机器人发送告警信息.
1: 了解更多群机器人的信息, 大家可登入官网学习
2. 给自己的机器人起个好听的名字
操作如下:
3. 使用命令行工具 curl
curl 是一个命令行工具, 通过指定的 URL 来上传或下载数据, 并将数据展示出来. curl 中的 c 表示 client, 而 URL, 就是 URL.
3.1 与 curl 一起使用的协议, 最多的还是 HTTP
在每一个 HTTP 请求中, 都有一个对应的方法, 常用的方法有: GET,POST,HEAD 和 PUT. 如果在一个 curl 命令中不指定具体的方法, 那么默认的就是使用 GET 方法. 对于其它的方法, 可以在 curl 命令中指定:
method | option |
---|---|
POST | -d 或 - F |
HEAD | -I |
PUT | -T |
POST 是 HTTP 中向服务端提交数据的一种方法. 在浏览器中, 可以在表单中填写完数据后, 浏览器就会默认将填写的数据使用 key=value 串的形式进行转化. 在 curl 中, 我们可以使用 - d 或 --data 选项来指定具体的数据.
3.2 钉钉使用 curl 工具主要相关的两个参数
参数(短形式) | 参数(长形式) | 解释 | 具体描述 |
-d | --data | HTTP POST data (H) | 把指定的数据发送到服务器上. |
-H | --header | Custom header to pass to server (H) | 当使用 POST 方法提交数据时,对于提交的数据主要有如下四种形式:
Content-Type 是一个 Header,如果不指定的话,默认使用 application/x-www-form-urlencoded 形式传输数据,当需要使用别的形式进行数据传输的话,需要指定 Header。 |
3.3 调用格式 (案例)
- curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx' \
- -H 'Content-Type: application/json' \
- -d '{"msgtype":"text",
- "text": {
- "content": "我就是我, 是不一样的烟火"
- }
- }'
测试过程中, 请将上面命令直接复制到命令行, 再将 xxxxxxxx 替换为真实 access_token.
4. 不一样的 Markdown 类型
官网中除 Markdown 类型, 其它的消息类型的 测试例子 (脚本) 都可以直接在 shell 中演示
官网 Markdown 类型的测试案例
- {
- "msgtype": "markdown",
- "markdown": {
- "title":"杭州天气",
- "text": "#### 杭州天气 @156xxxx8827\n" +
- "> 9 度, 西北风 1 级, 空气良 89, 相对温度 73%\n\n" +
- "> ![screenshot](https://gw.alicdn.com/tfs/TB1ut3xxbsrBKNjSZFpXXcXhFXa-846-786.png)\n" +
- "> ###### 10 点 20 分发布 [天气](http://www.thinkpage.cn/) \n"
- },
- "at": {
- "atMobiles": [
- "156xxxx8827",
- "189xxxx8325"
- ],
- "isAtAll": false
- }
- }
在 shell 中执行报错信息, 错误信息为:
{"errcode":40035,"errmsg":"缺少参数 json"}
报错原因是 "text" 栏位对应的 value 值中的 "+" 运算符导致, 将中间的
"+"
删除.
即可执行代码更新为:
- {
- "msgtype": "markdown",
- "markdown": {
- "title":"杭州天气",
- "text": "#### 杭州天气 @156xxxx8827\n> 9 度, 西北风 1 级, 空气良 89, 相对温度 73%\n\n> ![screenshot](https://gw.alicdn.com/tfs/TB1ut3xxbsrBKNjSZFpXXcXhFXa-846-786.png)\n> ###### 10 点 20 分发布 [天气](http://www.thinkpage.cn/) \n"
- },
- "at": {
- "atMobiles": [
- "156xxxx8827",
- "189xxxx8325"
- ],
- "isAtAll": false
- }
- }
执行 OK, 错误消失.
执行情况如下:
成功收到的信息, 内容截图如下:
5. 将钉钉机器人代码放到文件中, 方便调用
例如: 创建用于监控当 QQOrder_ERP 集群的 VIP 漂移时, 调用用来发送钉钉告警的可执行文件 ddalarm.sh.
其主要代码如下:
- #!/bin/bash
- webhook='https://oapi.dingtalk.com/robot/send?access_token=34XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
- cluster='QQOrder_ERP'
- host=`hostname -I | awk '{print $1}'`
- vip=$1
- function SendMsgToDingding() {
- curl $webhook -H 'Content-Type: application/json' -d "
- {
- 'msgtype': 'text',
- 'text': {
- 'content': '集群名称:$cluster\n 告警信息: 虚拟 IP<$vip > 已漂移至节点 <$host>, 请注意 \ n'
- },
- 'at': {
- 'isAtAll': true
- }
- }"
- }
- SendMsgToDingding
此测试文件, 调用执行时需要传入一个参数 (VIP).
触发执行, 案例如下:
手机钉钉收到的告警信息
参考资料:
1. 钉钉群机器人
https://ding-doc.dingtalk.com/doc#/serverapi2/krgddi
2.curl 使用指南
https://www.jianshu.com/p/fc0eb6c60816
来源: https://www.cnblogs.com/xuliuzai/p/11469039.html