马上要过年了, 各位运维们除了因为买不到回家的火车票而嚎嚎大哭之外也开始扩容服务器和提前调整监控值, 目的就是为了过一个消停的春节可是这毕竟十天左右不在公司, 要是模块真出了什么意外肯定没法第一找到日志分析问题, 毕竟这几天都在串门拜年和醉生梦死中度过, 走到哪都要再背一个笔记本实在太不方便了
那么这个时候, 我就琢磨使用手机端来启动服务器里脚本, 让这个脚本可以去获取当前的日志, 然后再把结果返回到手机端这样就不用到哪里都带那个一看就很扫兴的公司笔记本电脑了
使用手机端启动服务器里脚本? 我又不会开发 android 和 ios, 那么肯定就要使用第三方工具, 我条件反射的想到了 jenkins, 因为 jenkins 是用手机可以登录的, 那么在手机端得到结果用什么呢? 在微信公众号和钉钉机器人里, 我选择了钉钉机器人
创造钉钉机器人
我的钉钉版本是 4.2.6.37, 首先在左上角头像的三角菜单有一个机器人管理, 如图:
然后选择自定义机器人, 给它起个名又换一个图标之后, 添加到一个群聊里, 如图:
添加的时候, 这个机器人会生成一个 webhook, 它的结构应该是:
https://oapi.dingtalk.com/robot/send?access_token=XXX
, 后面的 XXX 是标识符, 不同的标识符代表不同的机器人, 这个标识符如果丢了, 可以在机器人头像点击一下然后选择机器人设置重新看到
编写机器人脚本
机器人的官方说明网址就是
https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.zZIvnt&treeId=257&articleId=105735&docType=1
, 这里面已经把使用方法写的够清楚了我这里的这个 python 脚本是用 json 的格式, 如下:
- #!/bin/python
- #coding: utf-8
- import json,urllib2
- #这里是机器人对应的 Webhook 地址
url = "https://oapi.dingtalk.com/robot/send?access_token = 这里输入你机器人的标识符
- #这里是头, 原样复制就好
- header = {
- "Content-Type": "application/json",
- "charset": "utf-8"
- }
- #这里是传送的消息
- data = {
- "msgtype": "text",
- "text": {
- "content": "这里是消息正文!"
- },
- "at": {
- "atMobiles": [
- "A 的手机号",
- "B 的手机号"
- ],
- "isAtAll":False #这里 True 代表要发给所有人, False 的话, 要代表消息只发给 A 和 B 这两个人
- }
- }
- sendData = json.dumps(data)
- request = urllib2.Request(url,data = sendData,headers = header)
- urlopen = urllib2.urlopen(request)
- print urlopen.read()
直接执行这个脚本, 就会看到我刚新建的钉钉机器人在群聊里说话了
机器人搭配 nginx
上面那个脚本已经可以初步实现我们的目的, 但是有一个缺点, 就是正文内容不能过长但是我想多打印一点日志, 至少 50 行, 怎么办? 我想了想, 可以把日志放进 nginx 的一个网页里, 然后用钉钉机器人反馈这个网页地址啊, 这样内容想写多少就可以写多少了
假设我现在获取到的日志的文件写进一个叫 chairmanmao.html 里, 在浏览器打开看是这样的:
那么上面那个机器人的 python 脚本就要改成这样:
- # ! /bin/python#coding: utf - 8 import json,
- urllib2,
- commands
commands.getstatusoutput(echo -e "THIS IS TEST MESSAGE! \n" > / 路径 / chairmantail.html) #这里可以给网页加一个标题
commands.getstatusoutput(cat / 路径 / chairmanmao.txt >> / 路径 / chairmanmao.html) #这里就是把诗词写进 html 文件里
- #这里是机器人的 webhook 地址
- url = "https://oapi.dingtalk.com/robot/send?access_token = 这里输入你机器人的标识符"
- header = {
- "Content-Type": "application/json",
- "charset": "utf-8"
- }
- data = {
- "msgtype": "link",
- "link": {
- "text": "点击网址就可获取到本次日志查询的结果",
- "title": "日志查询结果已经生成!",
- "picUrl": "http://p1x3hd2at.bkt.clouddn.com/nanshen.jpg", #这里可以加一个缩略图片
- "messageUrl": "http:// 服务器外网 IP 地址 / chairmanmao.html"
- },
- "at": {
- "isAtAll":True # at 为非必须
- }
- }
- sendData = json.dumps(data)
- request = urllib2.Request(url,data = sendData,headers = header)
- urlopen = urllib2.urlopen(request)
- print urlopen.read()
执行这个脚本可以看到机器人发送的信息如下:
然后打开这个网址, 就看到完整的网页信息:
到时候把毛主席诗词换成实际的日志文件就好了, 不用一口气打印所有的日志出来,
tail - n 50 日志文件名
,50 行足够用了
配置 Jenkins
脚本写完了, 机器人也写完了, 这个时候就要添加启动端安装 Jenkins 的步骤我这里就不写了, 直接可以去看
https://rorschachchan.github.io/2018/02/05/Jenkins 安装与创建简单任务 /
现在去登录 Jenkins 的网页, 去添加一个新的 Job, 比如我这个 Job 就叫获取模块日志, 如图:
如果是要在 Jenkins 上去读取其他服务器的日志, 就可以在构建 project 的时候选择
参数化构建过程
, 然后配置参数 ip, 到时候把这些 ip 传递给目标脚本如果觉得这样 hold 不住, 可以不用 jenkins 的这个功能, 把 ip 写到脚本里去, 一了百了:
在构建那一步, 选择 Execute Shell, 然后里面写上具体的 shell 命令, 如果在上面使用了参数, 那么参数就可以在这里使用, 我的脚本里是没有 ip 这个参数的, 在图里写 $ip 就是做一个例子讲解一下用法而已:
在构建后操作这一步可以选择 E-mail Notification, 这样如果失败了会发送邮件通知如果用不着就什么都不用选然后就是保存好这个 project, 点击左侧菜单栏的立即构建, 就会看到下面 Build History 会多一个 #1 出来, 同时钉钉机器人也在群里发消息, 这个 #1 就是构建的记录, 这个纪录多了的话, 新纪录会覆盖掉老的记录
点击这个 #1, 选择控制台输出, 就能看到具体的操作结果了, 跟在 shell 界面里执行的效果差不多的可见操作成功, 目的已经达到了!
以后需要调用脚本, 就在手机端浏览器里登陆 jenkins, 然后构建一下这个 project, 同时就可以看到钉钉里机器人有反馈了
参考资料
https://xu3352.github.io/linux/2017/05/01/jenkins-restart-remote-server-tomcat
来源: http://www.bubuko.com/infodetail-2490298.html