以jenkins为核心的自动化运维搭建实战(一)——简易自动化解决方案

前言

过去的一年里,由于公司业务不稳定,基本上都在和需求以及支撑上较劲了,jenkins一直都有在用,也在用jenkins做发版等操作的管理,但是不成体系。每一个动作,都需要复制以前的脚本,再改一改,用进去。这种东西,研发应该都能想到,复制粘贴是万恶之源。虽然都能用,但是一旦有内容发生变更,这样搭建起来的运维体系是很脆弱的。果然,后来我们有大版本升级,过渡阶段两个大版本都需要发布,等等操作,这套体系现在就有些废了,没人搞得清楚哪些能用,哪些不能用,不能用的又是什么原因,哪些脚本里都需要调整什么东西。这碰见了疫情,公司业务慢下来了,我也有时间来调整这里了。
其实jenkins我也不是很熟,也就是借着这次好好学了一下。首先,1.x和2.x从理念上是有很大差异的,而我们之前的用法基本都是以1.x的理念为基础的。2.x是以管道为核心的,学了下,感觉,简单了。另外,2.x有个Blue Ocean的新界面,挺好看的。不过,我摸索的时候还是以老界面为主的,所以,有些操作我还是会以老界面为主去介绍,本文以介绍一个简易的自动化解决方案为内容,该解决方案既是解决我燃眉之急的内容,也是后续研究的前提吧。总得能把东西跑通了,才能验证高阶的使用是否正确吧。

简述

之所以先出这个简易解决方案,是因为我现在就需要用它解决问题。我们有个服务不是很稳定,产线隔三差五的就停止服务,但是进程又不挂,所以我们做了个探活的请求来探索。但是,最近挂得有点频繁,如果晚上挂了,最早得等我醒了才能重启服务,让服务可用。这就有些蛋疼了。所以,我的基本思路,就是在原来的探活基础上,做一个jenkins的任务,当发现服务不可用,调用这个jenkins任务,进行重启服务。要解决的问题主要如下:

  • 重启指定进程
  • 编写可以完成任务的jenkins任务
  • 让jenkins任务可以被远程调用
  • 让探活服务可以触发jenkins任务

重启指定进程

这个问题以前其实挺麻烦的,因为需要通过ps命令筛选出来准确的进程。后来,同事使用了根据监听端口查询的思路,我觉得很有见地,也更容易查询到准确的进程。不过呢,我的所有环境都是用了supervisor进行了进程守护,所以,我只需要使用superviorctl restart命令就可以了。前面提到的两个,都需要使用shell命令查到准确的进程号,再用到kill命令里面去

编写可以完成任务的jenknins任务

这里我们还是使用传统的界面,在Blue Ocean里面要创建就必须指明仓库,而我们这里不需要拉取代码,所以还是传统界面吧,创建一个流水线任务。
这个任务里,我们只需要填写流水线脚本就好了,其它的都不需要设置。但是吧,没有流水线脚本的图形化配置界面,就是要我们写代码嘛。这个脚本本质上是groovy的代码,所以,就是写代码。不过,jenkins为了方便我们使用,它提供了两个机制帮助我们写代码。首先就是,可以选几个样例代码,在脚本编辑框的右上角,我们选择“Hello World”,可以看到插入了如下的代码:

pipeline {
   agent any

   stages {
      stage('Hello') {
         steps {
            echo 'Hello World'
         }
      }
   }
}

这个,被称为声明式pipeline脚本,最外层是固定的pipeline,大括号代码了代码域,我们写的所有的都是一个pipeline。agent是用来说明指定谁执行这个脚本的,我们这里没有限制,就用any。stages,就是步骤了,样例里面给了一个stage,steps这些代码,我们改一改就是我们的了。
stage,就是它英文单词的含义,阶段。step是步骤,就是两层嵌套关系来管理流程。我们这个任务只有一个stage,里面重启我的两个进程就可以了。先改一改,如下:

pipeline {
   agent any

   stages {
      stage('reboot') {
         steps {
            //重启第一个进程
            //重启第二个进程
         }
      }
   }
}

现在,基本代码结构有了,那么,重启的代码怎么写呢?别急,还有另一个帮我们写代码的。在脚本编辑框下面可以找到一个链接“流水线语法”,点击进去,可以看到片段生成器。片段生成器,是帮助我们生成我们需要的代码片段的。在示例步骤出,选择sshPublisher,就可以看到其完整的配置界面(不知道怎么用这个插件的,可以看下我另一篇博客的内容https://www.jianshu.com/p/bddfab76acf2)。这是一个推送文件并执行脚本的插件,我们不推送文件,就变成了只执行脚本的插件了(记得选择凭证)。选好后,点击生成流水线脚本即可,然后粘贴到脚本里就可以了。结果如下:

pipeline {
   agent any

   stages {
      stage('reboot') {
         steps {
            sshPublisher(publishers: [sshPublisherDesc(configName: 'release', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''/usr/bin/supervisorctl restart iot-server-13000
/usr/bin/supervisorctl restart iot-server-14000''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
         }
      }
   }
}

这个时候执行,就可以看到脚本执行成功了。

让jenkins任务可以被远程调用

这个任务很简单,但是如果每次只能手动触发,那不就又变成了醒过来以后看到报警再执行了吗。我们需要让它可以被系统调用。jenkins支持url调用,只需要简单的配置即可。
首先,我们在任务的构建触发器中找到“触发远程构建”的选项,勾选它,输入一个身份令牌。你可以把它看成可以执行该任务的凭证,简单点说就是密码(涉及保密,本文我就用123456了)。 这一个输入框下面,你可以看到几行英文字,里面有请求用的url,看不懂就查单词翻译吧。
其实吧,还有个地方要设置,在全局安全配置中,把“跨站请求伪造保护”关掉,就不会告诉你403错误了。然后,你根据提供的url请求,无论get和post,都可以看到请求被执行了。
最后,我这个jenkins是内网的,需要在网关做端口映射,透给公网调用。这部分我就不说了哈,自己根据自己的网络环境配就行了。
还有个注意事项,就是,在url中需要加入用户的凭证信息,之前加入的是项目的token,我们还需要用户的。简单来说,就是在你的域名和http://之间,加入username:password@的内容,这个password可以是用户的登录密码。不过这样很不安全,也可以在用户的凭证中添加凭证,将凭证的内容放在这个部分,完整的url看起来像是这样:

http://username:password@domain:port/job/job_name/build?token=your_token

后来我发现,似乎token也是可以不加的。

让探活服务可以触发jenkins任务

之前,我觉得只需要让探活服务回调jenkins的url就可以了,结果证明,是不行的。而且,它的回调方法是由数据的。所以,需要专门写个回调方法,然后在自己调用jenkins。然后,我又以为直接调用url就可以了,其实也是不行的,因为前面的username:password没有被正确处理,所以,java 的调用代码需要向下面这个样子:

        URL url = new URL("http://domain:port/job/job_name/build?token=your_token");
        HttpURLConnection c= (HttpURLConnection) url.openConnection();
        c.setRequestMethod("POST");
        c.setRequestProperty("Authorization", "Basic " + Base64.getEncoder().encodeToString(("username:password").getBytes()));
        c.getInputStream().close();

好了,拿去不谢。

细节补充

报错No valid crumb was included in the request

接口调用jenkins时可能报403,错误信息是。这可能是由于你是跨站请求导致的。需要在全局安全设置里面去除跨站请求保护。但是,这个东西在2.2以上的版本中无法关闭,需要在启动的jvm参数中添加如下配置:

-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容