ops自动化

2021-07-09 17:51:52 浏览数 (1)

四.jenkins化

有了监控后,我们就可以进行下一步操作:将所有项目的打包工作交给jenkins。当然,现实中是逐步实现的,并不是一步到位的。

首先要有Jenkins。搭建Jenkins同样有现成的Ansible playbook :ansible-role-jenkins ( https : llgithub.com/geerlingguylansible-role-jenkins )。注意,网上的大多文章告诉你的都是Jenkins需要手动安装插件,而我们使用的ansible-role-jenkins实现了自动安装插件,只需要增加一个配置变量jenkins plugins就可以了。官方例子如下:

代码语言:javascript复制
---
- hosts: all
  vars:
    jenkins_plugins:
      - blueocean
      - ghprb
      - greenballs
      - workflow-aggregator
    jenkins_plugins_timeout: 120

pre_tasks:
  - include_tasks: java-8.yml

roles:
  - geerlingguy.java
  - ansible-role-jenkins

搭建好Jenkins后,就要集成Gitlab了。我们原来就有GitLab,所以不需要重新搭建。

现在我们需要告诉Jenkins如何对业务代码进行编译打包。我们逐步在每个业务系统的根目录中加入相应的Jenkinsfile。在为每个业务系统写Jenkinsfile的过程中,注意这些业务系统的Jenkinsfile的共性,及时进行抽象,避免大量重复。

提示:如果这些业务系统能标准化目录结构,那么Jenkinsfile及部署脚本将会简化很多。所以,笔者在实施自动化过程中,逐渐对所有业务系统的目录结构进行标准化。

采用Jenkins进行自动化编译打包后,我们遇到的第一个问题就是将打包出来的制品放在哪里。所以,在搭建好Jenkins后,就需要搭建Nexus了。

之前我们是在程序员的电脑中执行Ansible的,现在要把这项工作交给Jenkins。具体操作在第12章中详细介绍过,这里就不重复了。

不过,这里有一个问题需要考虑:是将Ansible脚本和业务系统放在同一个代码仓库中,还是分别放在不同的仓库中?

笔者推荐将部署脚本与业务系统放在同一个代码仓库中,结构如下:

这样做的好处是︰

  • 职责清晰。Jenkinsfile负责构建逻辑,deploy目录负责部署逻辑。
  • 标准化。所有需要部署的业务系统都可以使用此目录结构,而不论是Go项目还是Node.js项目。
  • 有助于推行DevOps。开发人员对构建逻辑和部署逻辑负责。虽然推行DevOps只是手段,不是目的。

四.ChatOps

2013年,ChatOps 由GitHub工程师Jesse Newland提出。表面上,ChatOps就是在一个聊天窗口中发送一个命令给运维机器人bot,然后bot执行预定义的操作,并返回执行结果。

笔者认为,ChatOps更深层次的意义在于将重复性的手动运维工作自动化了,开发人员、运维人员可以自助实施一些简单的运维。

ChatOps并不是由一个系统实现的,而是多个系统的集成。我们选择Rocket.Chat作为聊天窗口的实现、Hubot作为运维机器人、Jenkins实现任务的执行

我们通过Rocket.Chat客户端向Rocket.Chat服务端发送消息。

Rocket.Chat

Rocket.Chat ( https : llgithub.com/RocketChat/Rocket.Chat )是一个开源的即时聊天平台,是Slack的开源替代解决方案。它的客户端是跨平台的,可以满足团队里不同人群的需要。

关于搭建Rocket.Chat的过程,官方文档写得非常详细,这里不再叙述。搭建完成Rocket.Chat后,首先需要添加一个机器人用户

Hubot

Hubot ( https : l/hubot.github.com/)是GitHub出品的一个运维机器人程序。其本质上就是一个接收命令消息,执行预定义操作的程序。接收命令消息的组件在Hubot中被称为adapter。

我们希望Hubot接收来自Rocket.Chat聊天窗口中的消息,所以就需要为Hubot安装一个Rocket.Chat的adapter。

在Hubot官方网站中还有很多其他adapter ( https : llhubot.github.com/docsladapters/ ),在开发自己的adapter前,可以先查一下看是否已经有人实现了。

那么,当Hubot接收到命令消息后,怎么知道执行哪些操作呢?这部分就是我们的工作了。实际上就是通过写Coffescript脚本匹配adapter组件传过来的消息,然后执行操作的。这些脚本在Hubot中被称为scripts。

实际上scripts就是通过正则表达式匹配命令消息,然后执行业务逻辑的。以下是一段scripts。

代码语言:javascript复制
robot.respond /open the (.*) doors/i, (res) ->
    doorType = res.match[1]
    if doorType is "pod bay"
        res.reply "im afraid i can't let you do that."
    else
        res.reply "Opening #{doorType} doors"

安装完成Hubot后,再设置Rocket.Chat adapter所需的一些环境变量。

代码语言:javascript复制
export ROCKETCHAT_URL=http://1.1.1.1:3000
export ROCKETCHAT_USER=jenkinsbot
export ROCKETCHAT_PASSWRD=123456
# Hubot将要加入的房间
export ROCKETCHAT_ROOM=general
export ROCKETCHAT_USE_SSL=false

接下来,运行bin/hubot-a rocketchat命令启动Hubot 当Hubot启动后,Rocket.Chat的general房间就会显示jenkinsbot加入房间的消息。

Hubot与Jenkins集成

Rocket.Chat与Hubot集成成功后,我们就可以在聊天窗口中@机器人,Hubot机器人就会收到消息内容。

希望收到后执行Jenkins任务。查一查是否已经有人实现了。如果有人,则通过npm search hubot-scripts jenkins搜索与Jenkins相关的scripts。 从列表中选择最近更新过的hubot-jenkins-enhanced 安装方式很简单,在Hubot所在机器上执行npm install–save hubot-jenkins-enhanced命令即可。

接下来,设置hubot-jenkins-enhanced所需的环境变量。

代码语言:javascript复制
export HUBOT_JENKINS_URL=http://1.1.1.1:8667
export HUBOT_JENKINS_AUTH=admin:23424242asdaada

HUBOT_JENKINS_AUTH变量值的格式为“username : access-token”。其中access-token可以在Jenkins的个人设置页面( /user/configure )中找到

重启Hubot后,我们向Hubot发送一个help指令,看看它支持哪些命令。 hubot-jenkins-enhanced scripts支持很多Jenkins命令。由于篇幅有限,这里只以发起一次构建为例。

命令列表

发起一次构建

Jenkins推送消息到Rocket.Chat

当Jenkins pipeline完成时,可以将结果推送到Rocket.Chat中。rocketchatnotifier插件。提供了此功能。

安装插件后,进入Manage Jenkins-》Configure System页面,找到Global RocketChat Notifier Settings部分。

配置项非常简单,这里就不一一介绍了。 我们尝试在pipeline中发送一条消息

代码语言:javascript复制
rocketSend channel: 'general',emoji: ':sob:', message: "Build Started - ${env.JOB_NAME} ${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)"

在Rocket.Chat的general房间可以看到消息

0 人点赞