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