chatops

一  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

原文地址:https://www.cnblogs.com/fengzhihai/p/10330683.html