321ed 发表于 2016-1-13 09:06:54

结合docker添加zabbix的skype告警方式

本帖最后由 321ed 于 2016-1-13 09:09 编辑

一 应用场景描述

如果在工作中使用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上拉取镜像


1
#docker pull ubuntu:12.04





2.使用docker run根据ubuntu 12.04的镜像创建一个docker容器,改名为sevabot

1
#docker run -p 5900:5900 -p 5000:5000   --name sevabot    -it ubuntu:12.04 /bin/bash





3.安装Skype和sevabot运行所依赖的软件

1
2
3
4
5
6
7
8
#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 l
iblcms1 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 -ygit curl





4.设置Skype和远程VNC环境
Skype需要在非root账号下运行,同时运行Skype需要配置VNC环境,Windows下可以通过vnc viewer连接到VNC环境。

1
2
3
4
5
6
7
8
9
#adduser--disabled-password --gecos "" skype

#su - skype
#git clone git://github.com/opensourcehacker/sevabot.git


SERVICES="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
$python setup.py develop
$cp settings.py.examplesettings.py

编辑settings.py这个文件,更改几个参数
SHARED_SECRET   设置通过HTTP方式发送消息的密码
HTTP_HOST      sevabot的HTTP接口监听的IP地址,这里填Docker容器的内网IP就行了,应为Docker主机通过端口映射会转发到这个IP
HTTP_PORT      默认的监听端口是5000

然后启动sevabot


1
SERVICES=sevabot ~/sevabot/scripts/start-server.sh start





通过VNC允许Skype4Py连接到Skype



再从新启动所有服务

1
2
3
4
~/sevabot/scripts/start-server.sh restart

然后通过
访问sevabot





1
2
3
4
5
在Shared secret框内输入密码后点击Show chat list按钮会列出每个联系人的Chat id和账号名称
前提是你必须把这些账号添加为好友才行


然后就可以通过页面向好友发送Skype消息了,还可以打电话哟




三 为zabbix添加skype报警
进入到zabbix的自定义报警脚本目录

cd ~/zabbix/share/zabbix/alertscripts
创建一个名为sendskype.sh的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
#
# Example shell script for sending a message into sevabot
#
# Give command line parameters and .
# 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 Zabbix
chat=$1
# Message is the second parameter
msg=${@:2}
# Our Skype bot shared secret
secret="xxxx"
# The Skype bot HTTP msg interface
msgaddress="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
    break
done
curl $msgaddress -d "chat=$chat&msg=$msg&md5=$m"





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$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




脚本测试

1
# sh sendskype.sh 35257268e691e0cc458976e9bab83a9ethis 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接收后显示成为一行,最好是能够分行显示。






参考文档:
https://github.com/Skype4Py/Skype4Py
https://github.com/opensourcehacker/sevabot
https://sevabot-skype-bot.readthedocs.org/en/latest/ubuntu.html

页: [1]
查看完整版本: 结合docker添加zabbix的skype告警方式