ChatOps實戰(zhàn)

image.png

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)境

  1. clone 項目
      git clone https://github.com/zacker330/devops-platform.git
      cd devops-platform
    
  2. 執(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集成

  1. 設(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
  2. 安裝hubot-rocketchat adapter

  3. 啟動時需要指定這幾個環(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
    
  4. 驗證
    因為我們安裝了hubot-friendly腳本,hey一下hubot,它有回應(yīng),就說明我們成功集成了RocketChat和Hubot。

    rocketchat-hubot.gif

Hubot與Jenkins集成

  1. 安裝hubot腳本:hubot-jenkins

  2. 配置hubot連接Jenkins的環(huán)境變量:

    export HUBOT_JENKINS_URL=192.168.61.14/jenkins
    export HUBOT_JENKINS_AUTH=admin:admin
    
  3. 在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中。

  1. 在Jenkins中安裝Jenkins插件rocketchatnotifier

  2. 在系統(tǒng)設(shè)置中,設(shè)置rocketchatnotifier參數(shù):


    image.png
  3. 在構(gòu)建job中設(shè)置post build action:


    image.png

    如果你使用的是Jenkins pipeline,rocketchatnotifier也支持

    rocketSend channel: 'general', emoji: ':sob:', message: 'My message', rawMessage: true
    
  4. 驗證
    在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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容