zabbix docker配置openmas云平台短信接口

1、系统环境

  • CentOS Linux release 7.2.1511 x86_64(Core)
  • Docker version 17.03.0-ce, build 3a232c8
  • zabbix:alpine-5.0-latest

zabbix采用docker容器方式部署

openmas云平台是移动公司提供的一个云上短信发送平台,支持http接口,接受post方式提交请求。原本打算用python写短信发送脚本,后来发现alpine镜像中配置python环境比较麻烦,查阅多方资料后,决定用shell编写脚本。

2、镜像改造

1、修改/bin/sh链接以支持数组处理,以下引用A0小何

通过alpine作为基础镜像构建容器镜像已经成为默许的标准,因为它体积小,而且有非常好用的保管理工具,当然,在alpine下也有许多坑需要填,最近在制作镜像时,又遇到了新问题,在脚本中使用数组a=(1,2,3)时提示如下错误:syntax error: unexpected “(”

导致出现如上提示错误是alpine下的sh脚本不支持(1,2,3)格式的数组表达方式(还有其他的问题,会在后续文章中分享),而bash版shell支持,因此不能直接使用。前面也提到了alpine的优势,最好是能够改造一下,使其也支持1,2,3)格式的数组表达方式

在网上查找了些资料,有了一些眉目,只给了报错的原因,没说怎么解决,下面将给出原因以及解决的办法

首先登录到容器内,查看sh的版本,(通常有ash、bash、sh等),

bash-4.3# ls -l /bin/*sh lrwxrwxrwx 1 root root 12 Jun 17 2017 /bin/ash ->/bin/busybox -rwxr-xr-x 1 root root 682128 Apr 20 2017 /bin/bash lrwxrwxrwx 1 root root 12 Jun 17 2017 /bin/fdflush->/bin/busybox lrwxrwxrwx 1 root root 12 Jun 17 2017 /bin/sh ->/bin/busybox

发现alpine中的sh使用的是bin/busybox(命令展示结果最后一行),因此需要将sh切换到/bin/bash下

下面给出解决思路:

1.删除原有链接;

2.新建一个软链接指向/bin/bash,

脚本实现如下:

cd /bin && rm -f sh && ln -s /bin/bash sh

最后再执行脚本,能正常运行,问题解决,当然可以将其写入到容器构建中,做成新的镜像,以后使用该镜像创建出来的容器都不会再出现这类问题了。

2、安装curl以支持http方式调用

原生alpine镜像中没有安装curl,需要手动安装。离线安装方式:
1)查看镜像系统版本

docker exec -it zabbix-server-mysql /bin/sh

sh-5.0$ cat /etc/issue
Welcome to Alpine Linux 3.12
Kernel \r on an \m (\l)

2)下载对应的curl包并安装

下载地址: http://mirrors.ustc.edu.cn/alpine/v3.12/main/x86_64/curl-7.69.1-r1.apk
上传到镜像绑定的任意宿主机路径下,例如/usr/lib/zabbix/alertscripts/
用root用户登陆镜像执行安装

docker exec -it -u root zabbix-server-mysql /bin/sh
sh-5.0# apk add --no-cache /usr/lib/zabbix/alertscripts/curl-7.69.1-r1.apk
sh-5.0# curl --version
curl 7.69.1 (x86_64-alpine-linux-musl) libcurl/7.69.1 OpenSSL/1.1.1g zlib/1.2.11 nghttp2/1.41.0
Release-Date: 2020-03-11

3、短信接口脚本

将脚本上传至alertscripts文件夹内,添加执行权限
chmod +x sms.py

#!/bin/sh

timestr=$(date "+%Y%m%d%H%M%S")
# split phonenumber,seperated by ","
arr=(${1//,/ })
# translate arr into a json list string like ["1234","1232",]
lst="["
for var in ${arr[@]}
do
   lst="${lst}\"${var}\","
done
lst="${lst%?}]"
content=$2

send_result=$(curl -H "Content-Type: application/json; charset=utf-8" -s -X POST -d '{"applicationId":"APP_KEY","password":"APP_SECRET","requestTime":"'"${timestr}"'","funCode":"1002","mobiles":'${lst}',"content":"'"${content}"'"}' http://112.13.167.146/yunmas_api/smsApi/batchSendMessage)
cat >> /usr/lib/zabbix/alertscripts/sms.log <<EOF
`date`   sendto: $lst
result: $send_result
----------------------------------------------------
EOF

参考:shell调用curl使用post方式提交json参数含变量的写法

4、zabbix配置报警媒介(略)

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐