March 2013

修改 keepalived 的 healthcheck 邮件

keepalived 在检测到 realserver 有问题的时候,是会发邮件通知管理员的,具体的邮件如下:

标题:

[LVS] Realserver [192.168.100.101]:8080 – DOWN

 

正文:

=> TCP CHECK failed on service <=

其实这个邮件的告警作用有限,在机器太多的时候,192.168.100.101 这个机器是什么呢?没人知道,实在有点不清晰。如果要 keepalived 代码里面实现呢,每一次都去查 DNS ,可是很费性能的。于是我决定从邮件入手。

 

我找到一个软件,proxsmtp ,它可以代理我们的邮件,并篡改其中的内容!

下载最新版 1.10,configure, make, make install 三步走。如果报错缺少 libcap2 的话,CentOS 下安装:sudo yum install libcap-devel 。其它系统懒得去测试了。

安装是不会帮你把配置文件也加上去的,自己 copy 一下,在源码目录里,doc/proxsmtpd.conf 。我就配置了三行:

OutAddress: mail.momo.com:25
FilterCommand: sed ‘s/192.168.100.101/test-001/’
Listen: 0.0.0.0:25

而 keepalived 的配置也改改,其中:

smtp_server 指向 proxsmtp 的服务器。

完成,刚才那个邮件再次发出的话,那么 192.168.100.101 就会替换为 test-001 的了(当然,这个看你的 FilterCommand 怎么写)

Done, enjoy !

利用微信公众平台实现手机命令行运维

前几天玩了一下微信公众平台, 取名: 我的公司名, 哈哈, 单凭这个名字竟然每天吸引了数十人的关注.

公众平台的规定是, 关注人数达到 500 人就可以申请认证. 我觉得我可能不需要发一句话, 就可以达到这个认证标准了, 哈哈.

公众平台有两种模式, 一种是编辑模式, 只能实现有限的几种对话模式, 定义好一些关键字, 如果用户发了这些关键字, 就回复事先指定好的回复.

一种是开发模式, 你发一句话给公众帐号, 微信服务器就帮你把相关的内容发送到你定义好的服务器, 然后你的服务器处理完, 就可以返回相应的信息给你了.

选择开发模式.

好了, 我的玩法是, 我用我自己的普通帐号发一个命令行的命令给公众帐号, 然后微信把这个命令发送给我之前定义好的服务器, 然后我的服务器就执行完这个命令, 把结果按照微信规定的格式返回, 然后公众帐号就返回那个结果给我了.

首先, 所谓的网址接入, 文档在这里: http://mp.weixin.qq.com/wiki/index.php?title=消息接口指南 . 照着做吧.

然后, 请准备好服务器程序, 我花了几十分钟用 tornado 写了个简单的接收 POST 请求的接口, 关键处理逻辑部分如下:

def post(self):
  dom = parseString(self.request.body)
  root = dom.documentElement
 
  toUserName = root.getElementsByTagName("ToUserName")[0].firstChild.nodeValue
  fromUserName = root.getElementsByTagName("FromUserName")[0].firstChild.nodeValue
  createTime = root.getElementsByTagName("CreateTime")[0].firstChild.nodeValue
  msgType = root.getElementsByTagName("MsgType")[0].firstChild.nodeValue
  content = root.getElementsByTagName("Content")[0].firstChild.nodeValue
  msgId = root.getElementsByTagName("MsgId")[0].firstChild.nodeValue
 
  print toUserName, fromUserName, createTime, msgType, content, msgId
  cmd = os.popen(content).readlines()[0]
 
response = """
 <xml>
 <ToUserName><![CDATA[%s]]></ToUserName>
 <FromUserName><![CDATA[%s]]></FromUserName>
 <CreateTime>%s</CreateTime>
 <MsgType><![CDATA[text]]></MsgType>
 <Content><![CDATA[%s]]></Content>
 <FuncFlag>0</FuncFlag>
 </xml>
  """ % (fromUserName, toUserName, createTime, cmd)
  self.write(response)

再然后, 就向公众帐号发命令试试吧. 如图:

2013-03-05 17.42.52

 

发挥想象还可以玩出很多不同的花样呢. 例如, ssh 到别的机器来完成某种命令再返回.

我玩什么都是三分钟热度, 这个也就玩玩, 不打算深入研究. 就这样了.