一 应用场景描述
如果在工作中使用Skype即时聊天通讯软件作为沟通工具,那么利用Skype来接收zabbix报警信息就有必要。
二 部署Skype环境
在部署Skype环境的时候也折腾了不少时间,刚开始是想通过zabbix本机的CentOS6.4上安装Skype环境,但是CentOS6.4上安装Skype确实非常不容易,参考国外的资料都是在Ubuntu上面部署Skype。我们平时也不使用Ubuntu系统,清一色的CentOS。怎么办,怎么办?突然想起可以使用Docker创建一个Ubuntu server容器,再到这个容器里面去部署Skype环境,还可以将操作过程写成Dockerfile供以后直接使用。
利用Skype发送消息的思路是通过Skype的python api连接本地Linux上的Skype然后发送消息。这里选择使用一个基于Skype4Py的工具sevabot,它的好处就是可以通过HTTP方式来连接Skype发送消息。这样Skype就不需要和zabbix部署在一起了。
1.从docker hub上拉取镜像
#docker pull ubuntu:12.04
2.使用docker run根据ubuntu 12.04的镜像创建一个docker容器,改名为sevabot
#docker run -p 5900:5900 -p 5000:5000 --name sevabot -it ubuntu:12.04 /bin/bash
3.安装Skype和sevabot运行所依赖的软件
#apt-get install net-tools ping -y#apt-get update#apt-get install -y xvfb fluxbox x11vnc dbus libasound2 libqt4-dbus libqt4-network libqtcore4 libqtgui4 libxss1 libpython2.7 libqt4-xml libaudio2 libmng1 fontconfig liblcms1 lib32stdc++6 lib32asound2 ia32-libs libc6-i386 lib32gcc1 nano python-virtualenv#wget http://www.skype.com/go/getskype-linux-beta-ubuntu-64 -O skype-linux-beta.deb#dpkg -i skype-linux-beta.deb#apt-get install -y python-gobject-2#apt-get install -y git curl
4.设置Skype和远程VNC环境
Skype需要在非root账号下运行,同时运行Skype需要配置VNC环境,Windows下可以通过vnc viewer连接到VNC环境。
#adduser --disabled-password --gecos "" skype#su - skype#git clone git://github.com/opensourcehacker/sevabot.gitSERVICES="xvfb fluxbox skype" ~/sevabot/scripts/start-server.sh start~/sevabot/scripts/start-vnc.sh start
在本地Windows下通过Real VNC Viewer连接到VNC,IP应该是Docker主机的IP
5.安装Sevabot
在切换到skype用户后
$cd sevabot/
$virtualenv venv
$ . venv/bin/activate
$python setup.py develop
$cp settings.py.example settings.py
编辑settings.py这个文件,更改几个参数
SHARED_SECRET 设置通过HTTP方式发送消息的密码
HTTP_HOST sevabot的HTTP接口监听的IP地址,这里填Docker容器的内网IP就行了,应为Docker主机通过端口映射会转发到这个IP
HTTP_PORT 默认的监听端口是5000
然后启动sevabot
SERVICES=sevabot ~/sevabot/scripts/start-server.sh start
通过VNC允许Skype4Py连接到Skype
再从新启动所有服务
~/sevabot/scripts/start-server.sh restart然后通过 访问sevabot
在Shared secret框内输入密码后点击Show chat list按钮会列出每个联系人的Chat id和账号名称前提是你必须把这些账号添加为好友才行然后就可以通过页面向好友发送Skype消息了,还可以打电话哟
三 为zabbix添加skype报警
进入到zabbix的自定义报警脚本目录
cd ~/zabbix/share/zabbix/alertscripts
创建一个名为sendskype.sh的文件
#!/bin/bash## Example shell script for sending a message into sevabot## Give command line parameters [chat id] and [message].# The message is md5 signed with a shared secret specified in settings.py# Then we use curl do to the request to sevabot HTTP interface.### Chat id comes as Send To parameter from Zabbixchat=$1# Message is the second parametermsg=${@:2}# Our Skype bot shared secretsecret="xxxx"# The Skype bot HTTP msg interfacemsgaddress="http://172.xxx.xxx.xxx:5000/msg/"md5=`echo -n "$chat$msg$secret" | md5sum`#md5sum prints a '-' to the end. Let's get rid of that.for m in $md5; do breakdonecurl $msgaddress -d "chat=$chat&msg=$msg&md5=$m"
$1是需要发送消息的接收方和这个skype机器人建立聊天时生成的ID,这个ID是唯一的,并且sevabot还通过MD5对ID进行了加密处理.可以通过sevabot的代码进行了解def get_chat_id(chat): """ Get unique internal persistent id of the chat object. All ids are URL safe. This is the same id as in the web interface. :param chat: Skype4Py.chat.Chat instance """ m = hashlib.md5() m.update(chat.Name) return m.hexdigest()这里顺便提一下,干运维虽然不一定要求像开发那样熟悉业务开发,但是常规的工具开发能力和看各种代码的能力还是需要具备的,特别是涉及到一些自己看文档不是太清楚的时候,就可以直接看代码帮助自己理解.脚本中${@:2}使用的是shell的高级变量,表示脚本运行的第2个参数到后面的参数,既是需要通过这个脚本发送的内容# chmod a+x sendskype.sh
脚本测试
# sh sendskype.sh 35257268e691e0cc458976e9bab83a9e this is a test message from sevabot
这时就可以在这个ID对应的接收方那端收到以下消息:
this is a test message from sevabot
脚本测试通过后就可以在zabbix的主页面配置skype报警功能了
选择Administrator-->Media types-->Create media type
Name填skype
Type选择Script
Script name填sendskype.sh
Enabled 打勾
再选择Configuration-->Actions-->Triggers
然后把Report problems to Zabbix administrators via Email这个克隆一下,把Email相关的换成改由skype发送就行了
好,大功告成。现在就可以通过skype接收zabbix报警消息了
四 扩展问题
有两个可以扩展的问题需要解决,一个就是把sevabot的部署过程写成Dockerfile,另外一个问题就是通过shell脚本发送消息给skype的时候,skype接收后显示成为一行,最好是能够分行显示。
参考文档: