一 chatops的概念在国内虽然有一部分的文章谈过,但不是很普遍,这里牛刀小试,做一个有关chatops的功能。
二 什么是chatops?
chatops表面上就是在一个聊天工具中,发送一条命令给运维机器人bot,然后bot根据我们预定义的操作进行执行,并返回执行结果。至于更深层次的作用,就是将重复性的手工的运维工作自动化了,开发人员、运维人员可以按需执行一些运维操作。说完这些,我们看看今天实验的一些工具和介绍。
2.1 RocketChat:可以把它想象成微信,它依赖于MongoDB。
2.2 hubot:hubot是github出品的一个运维机器人。本质就是一个接收命令消息,执行预定义操作的一个程序。而接收命令消息的这个组件在hubot中被称为adapter,eg:rocketChat的adapter:hubot。市面上已经有很多了。hubot接收命令后如何执行就需要我们来实现了。
2.3 jenkins:不多讲,应该都知道,CICD的神器。
三 本文主题
在RocketChat的聊天窗口命令hubot执行一次jenkins构建任务。
四 安装
我的环境
10.10.0.171 MongoDB、RocketChat Server、Hubot
10.10.0.144 jenkins
4.1 MongoDB:
docker run --name db -d mongo:3.0 --smallfiles
4.2 RocketChat Server:
docker run --name rocketchat -p 80:3000 --env ROOT_URL=http://10.10.0.171 --link db -d rocket.chat
(参考链接:https://hub.docker.com/_/rocket-chat)
4.3 RocketChat web端访问:http://10.10.0.171
(同时可以借助客户端连接工具ROCKET.CHAT工具,该工具可以直接下载。)
首次登陆,我这里创建了一个超级用户fzh42353:
用fzh42353这个用户登陆,重新打开终端注册一个新用户:bot,密码:bot123(此用户便于hubot连接到rocketchat使用),角色权限如下:
五 jenkins安装
docker run --name chat-jenkins -p 8080:8080 -p 50000:50000 -v /data/jenkins_workspaces/:/var/jenkins_home jenkins
六 hubot-rocketchat adapter安装
docker run -it -e ROCKETCHAT_URL=http://10.10.0.171:80 -e ROCKETCHAT_ROOM='general' -e LISTEN_ON_ALL_PUBLIC=true -e ROCKETCHAT_USER=bot -e ROCKETCHAT_PASSWORD=bot123 -e ROCKETCHAT_AUTH=password -e BOT_NAME=bot -e HUBOT_JENKINS_URL=http://10.10.0.144:8080 -e HUBOT_JENKINS_AUTH=jfsor:c1ee2b0b -e EXTERNAL_SCRIPTS=hubot-pugme,hubot-help,hubot-script-shellcmd,hubot-jenkins -v /opt/scripts:/home/hubot/scripts -d rocketchat/hubot-rocketchat
我这里添加了hubot-script-shellcmd,hubot-jenkins两个插件,也可以不加上,跑起来后进入容器npm进行安装。
参数解释:
ROCKETCHAT_URL: server地址
ROCKETCHAT_ROOM: 默认加入的channel(房间),可以不填
ROCKETCHAT_USER: robot名字,我上面的bot
ROCKETCHAT_PASSWORD: bot的密码:bot123
ROCKETCHAT_AUTH:认证的方式:password
HUBOT_JENKINS_URL:jenkins地址,hubot-jenkins插件会用到
HUBOT_JENKINS_AUTH:登录jenkins的用户名和密码,user:password,hubot-jenkins插件会用到
/opt/scripts:/home/hubot/scripts: 本地scripts脚本映射到容器内,hubot-script-shellcmd插件会用到
六 以上过程后,整个搭建工作就算是完成了,接下来看下怎么实践。
[root@k8s-master-02 ~]# grep -v "^#| #|^$" /opt/scripts/example.coffee module.exports = (robot) -> robot.hear /hi/i, (res) -> res.reply "hello" robot.hear /吃饭了吗/, (res) -> res.send '只有你们这些愚蠢的人类才吃饭'
hubot@759f2a19692f:~$ cat external-scripts.json ["hubot-pugme","hubot-help","hubot-script-shellcmd","hubot-jenkins"] hubot@759f2a19692f:~$ cd - /home/hubot/node_modules/hubot-script-shellcmd/bash/handlers hubot@759f2a19692f:~/node_modules/hubot-script-shellcmd/bash/handlers$ ls helloworld update hubot@759f2a19692f:~/node_modules/hubot-script-shellcmd/bash/handlers$ cat helloworld #!/bin/bash echo "Hello.." sleep 1s; echo "Sleepy World!"
(上面的example.coffee为自带的测试脚本,此处我进行了适当修改。~/node_modules/hubot-script-shellcmd/bash/handlers下面我们可以自定义可执行的shell脚本。然后shellcmd command即可。)
hubot-jenkins的用法见下面链接:
https://www.npmjs.com/package/hubot-jenkins-enhanced
七 上诉我们能实现通过rocketchat server发送命令给hubot adapter进而触发jenkins构建工作,但如果想得到jenkins的返回结果,还少了一部。
这样我们就拿到结果了,可以看出构建结果是成功的,同时会返回构建时间和构建版本号。
八 我们可以使用七的方式,通过jenkins插件来完成这件事,同时也可以通过rocketchat的webhook来实现,看下列截图:
最后保存修改,你可以得到一个webhook url,一个token,一个发送通知的url,eg:
curl -X POST -H 'Content-Type: application/json' --data '{"text":"Example message","attachments":[{"title":"Rocket.Chat","title_link":"https://rocket.chat","text":"Rocket.Chat, the best open source chat","image_url":"/images/integration-attachment-example.png","color":"#764FA5"}]}' http://10.10.0.171/hooks/wDLZ2y4jsR8rP7gMP/TmirXF8tEbAGo9gNxbvitf5tuBEmWKHGAinxHzB8zMjwXNmp
修改传输接口即可达到发送通知的目的。url可以在jenkins中设定。
备注:
参考链接:https://www.jianshu.com/p/76d547fa23ac