
ChatOps概念在國內(nèi)已經(jīng)有一些文章談過,但是都處于理論范疇。而本文則是一篇ChatOps實踐的文章。
有必要說明我對ChatOps的理解,ChatOps表面上就是在一個聊天窗口中,發(fā)送一個命令給運維機(jī)器人bot,然后bot根據(jù)我們預(yù)定義的操作進(jìn)行執(zhí)行,并返回執(zhí)行結(jié)果。至于更深層次的作用,就是將重復(fù)性的手工的運維工作自動化了,開發(fā)人員、運維人員可以按需執(zhí)行一些運維操作。
另外,我做到了自動化搭建這一套東西(感謝Github上那么多開源項目,讓我少寫很多Ansible腳本)。為什么要自動化搭建呢?因為我懶,我不想每次通過一條條shell手工搭建。
本文主題
在RocketChat的聊天窗口中命令Hubot執(zhí)行一次Jenkins構(gòu)建任務(wù)。
工具介紹
有必要簡單說明一下我們此次實現(xiàn)ChatOps的這幾個工具。
RocketChat
可以把RocketChat想像成一個具有更多功能的IRC或者微信。它依賴于MongoDB,所以,我們還將自動化安裝MongoDB。
如果你了解過Slack的話,它可以作為Slack的開源替代表。
Hubot
Hubot是Github出品的一個運維機(jī)器人。本質(zhì)上就是一個接收命令消息,執(zhí)行預(yù)定義操作的一個程序。而接收命令消息的這個組件在Hubot中被稱為Adapter。比如我們希望Hubot接收來自RocketChat聊天窗口里的消息,我們就必須為Hubot安裝一個RocketChat的Adapter。市面上,已經(jīng)有很多Adapter了,我們很少需要自己實現(xiàn)自定義Adapter。
那么,Hubot接收到命令消息后,怎么知道執(zhí)行哪些操作呢?這部分是需要我們實現(xiàn)了。本質(zhì)上就是通過正則表達(dá)式匹配命令消息,然后操作。實際上通過寫Coffescript腳本實現(xiàn)。比如:
robot.respond /open the (.*) doors/i, (res) ->
doorType = res.match[1]
if doorType is "pod bay"
res.reply "I'm afraid I can't let you do that."
else
res.reply "Opening #{doorType} doors"
Jenkins
就這個就不用多介紹了。值得一提是Github已經(jīng)有不少自動化搭建Jenkins的Ansible腳本了(完全不需要人工干預(yù)),本文使用的是geerlingguy的。
Ansible
能讓開發(fā)人員快速上手的自動化運維工具。我們使用Ansible實現(xiàn)自動化。想簡單了解Anbible,可以看看簡單易懂Ansible系列 —— 解決了什么。
準(zhǔn)備環(huán)境
需要準(zhǔn)備幾臺機(jī)器:
| IP | OS | 安裝 |
|---|---|---|
| 192.168.61.11 | CentOS7 | Jenkins,Openresty(for Jenkins) |
| 192.168.61.14 | CentOS7 | Openresty(for RocketChat) |
| 192.168.61.15 | CentOS7 | RocketChat Server, MongoDB,Hubot |
因為我是在本地做實驗的,所以需要在本機(jī)虛擬化3臺機(jī)器。我使用Vagrant + VirtualBox的方式來實現(xiàn)。具體Vagrant如何使用,不在本文討論范圍。你也可以手工在VirtualBox或Vmware上創(chuàng)建相應(yīng)的虛擬機(jī)。Vagrant只不過是自動化了這個過程。Vagrant會基于一個稱為Vagrantfile的文件來創(chuàng)建機(jī)器。
Vagrantfile部分內(nèi)容如下(想看全文件點這):
Vagrant.configure(2) do |config|
ANSIBLE_RAW_SSH_ARGS = []
VAGRANT_VM_PROVIDER = "virtualbox"
machine_box = "CentOS-7.1.1503-x86_64-netboot"
config.vm.define "p1" do |machine|
machine.vm.box = machine_box
machine.vm.network "private_network", ip: "192.168.61.11"
machine.vm.provider "virtualbox" do |node|
node.name = "p1"
node.memory = 2000
node.cpus = 2
end
end
##### 此處省略其它機(jī)器的配置
end
因為我本地已經(jīng)存在相應(yīng)的Vagrant box了,所以,直接使用命令就可以啟動這幾臺機(jī)器:
vagrant up p1
vagrant up p4
vagrant up p5
搭建環(huán)境
- clone 項目
git clone https://github.com/zacker330/devops-platform.git cd devops-platform - 執(zhí)行Ansible自動化部署所有的應(yīng)用及配置
ansible-playbook -i chatops-inventory chatops-playbook.yml
chatops-inventory 是一個類ini文件,用于描述機(jī)器,其實就是對機(jī)器進(jìn)行分組。
chatops-playbook.yml是一個yaml文件,用于描述如何部署我們的應(yīng)用及配置。
就這樣,我們的Jenkins,RocketChat,Hubot就已經(jīng)搭建完成了。沒錯,就只需要掃行一條命令。是不是很爽~
RocketChat web客戶端:http://192.168.61.14:3000/,初次登錄時,需要先注冊一個超級管理員。
Jenkins: http://192.168.61.11/jenkins,默認(rèn)賬號密碼:admin/admin
至于是如何搭建的,感興趣的同學(xué)可以看Ansible代碼。
以下是集成方法及需要注意的地方:
Hubot與RocketChat集成
-
設(shè)置Hubot運維機(jī)器人
現(xiàn)在需要在RocketChat中添加一個User作為運維機(jī)器人,我們選擇
RocketChat默認(rèn)用戶rocket.cat作為運維機(jī)器人,這里需要注意的是:- rocket.cat必須具有的角色:admin、bot
- rocket.cat必須設(shè)置密碼,我設(shè)置了為123456
-
郵箱必須verified,設(shè)置時只要勾選上就可以了
image1.png
-
啟動時需要指定這幾個環(huán)境變量以便Hubot能登錄上RocketChat:
export ROCKETCHAT_URL="http://192.168.61.15:3000" export ROCKETCHAT_ROOM='' export LISTEN_ON_ALL_PUBLIC=true export ROCKETCHAT_USER=rocket.cat export ROCKETCHAT_PASSWORD=123456 export ROCKETCHAT_AUTH=password -
驗證
因為我們安裝了hubot-friendly腳本,hey一下hubot,它有回應(yīng),就說明我們成功集成了RocketChat和Hubot。rocketchat-hubot.gif
Hubot與Jenkins集成
安裝hubot腳本:hubot-jenkins
-
配置hubot連接Jenkins的環(huán)境變量:
export HUBOT_JENKINS_URL=192.168.61.14/jenkins export HUBOT_JENKINS_AUTH=admin:admin -
在RocketChat中,操作Jenkins的job:
比如列出當(dāng)前Jenkins的job列表:image.png再比如執(zhí)行chatops-demo這個job:
jenkins-hubot.gif
Jenkins與RocketChat集成
Jenkins與RocketChat集成主要用于當(dāng)Jenkins的job發(fā)生變化時主動推送消息到RocketChat中。
在Jenkins中安裝Jenkins插件rocketchatnotifier
-
在系統(tǒng)設(shè)置中,設(shè)置rocketchatnotifier參數(shù):
image.png -
在構(gòu)建job中設(shè)置post build action:
image.png
如果你使用的是Jenkins pipeline,rocketchatnotifier也支持
rocketSend channel: 'general', emoji: ':sob:', message: 'My message', rawMessage: true -
驗證
在Jenkins上手工點擊構(gòu)建按鈕,RocketChat的ci channel應(yīng)該會有消息提醒:
jenkins-rocketchat.gif
小結(jié)
至此,我們簡單的ChatOps框架算是搭好了。剩下的就是根據(jù)你們自己業(yè)務(wù)進(jìn)行改造了。
另外多說一句:思維模式不應(yīng)該被職位所局限。
項目github地址:https://github.com/zacker330/devops-platform/blob/master/chatops-playbook.yml
本文不明之處,歡迎來郵討論咨詢:apl.359 AT 163.com






