授之以渔-运维平台发布模块一(Jenkins篇)

发布时间:2024-06-07 点击:113
建站服务器
本着步子迈得太大容易扯蛋的原则,平台设计初衷就是能调用开源产品肯定不自己做,这样平台只作为一个综合调度中心使用,无需考虑后面具体的功能实现逻辑。
使用jenkins还是要追溯到很久很久之前认知的一家公司,当时的技术总监张晓峰让我学到了持续集成引擎hudson,也就是后来的jenkins。以前公司是jenkins结合maven,ant做敏捷式开发,而我只是取巧,用了其中的一些最基本的功能来实现系统发布更新。
传统的运维发布
svn迁出代码-本地打成tar包(rar包)- sftp上传到服务器
jenkins建立发布项目-svn迁出代码-通过sftp插件直接分发到服务器
优点:粗暴简单
缺点:
效率: 发布方式一单一服务器上线没问题,多服务器分发效率下降。如果网内是统一入口登录(即堡垒机为单一入口时),发布工作将变得极为困难。
安全风险:发布方式二的ssh账号密码必须存在jenkins上,虽然不是明文,但…..同样也面临这服务器的22口要对jenkins开放,安全是问题。
采用系统方案:yum
我当时的思路:公司是等保三级的单位,在当初我制定内网规则的时候,强烈建议ssh登录范围必须限定,统一的入口可以极大的减少被*跳板式*的可能,所以我想到了是用yum更新的方式:
发布:把代码从svn上迁出后,打成rpm包(强烈推介fpm)
更新:通过yum的特性,更新的程序包每次保持版本号 1,例如test-519-1.x86_64(519就是jenkins的发布版本号),服务器每次只需要执行以下2条命令即可。
bash
yum clean all
yum install test
批量操作:通过saltstack去通知每台服务器去进行yum的动作啦。。。
回退: 就更简单了,粗暴点在yum服务器直接 mv test-518-1.x86_64 test-520-1.x86_64即可,斯文点当然还是回调jenkins的接口,使用tag回滚。
具体逻辑及实施
那么下面先来解决打rpm包,更新yum源的问题(我的jenkins就是我们内网的yum源):
配置jenkins
首先我们需要打开jenkins中的batch tasks(批处理,其实就是脚本),不会用jenkins自己百度吧。
点击add post-build action-选择invoke batch tasks
在batch tasks里填入脚本
bashmkdir-p/home/release/$job_name&&\\\\fpm-sdir-trpm-n$job_name-v$build_number--prefix/home/www/bbs-c/var/lib/jenkins/workspace/$job_name-p/home/release/$job_name./&&\\\\createrepo--update/home/release/$job_name/&&\\\\curl-djob_id=$job_namehttp://saltmasterip/cmdb/salt_jenkins_post/
这段jenkins脚本的大体意思:
创建/home/release/$job_name目录
然后把/var/lib/jenkins/workspace/$job_name(jenkins项目工作区)的代码打成一个以$job_name命名,版本号为$job_name的rpm包,其存放在/home/release/$job_name这个目录里,其解压后会解压到/home/www/bbs目录。
然后createrepo --update /home/release/$job_name/ 通知更新更新yum源.
最后就是回调我的salt接口(此接口的作用其实就是根据这个项目反查对应的哪几台发布主机,然后在这些主机上执行yum install命令,是不是很无脑~)
saltstack接口(saltjenkinspost)
由于我的平台和salt master是同一台(主要是省事),省去了调用api,直接调用了本地saltstack已经封装的一些yum install 之类的命令。
upgradeavailable 验证yum源是否更新
install 安装
modrepo 创建yum源
getrepo 验证yum源是否存在
intro 执行更新后的一些命令
我在接口处理的每一步后都会验证返回的主机是否跟数据库预设的项目主机一样,只有一样了才会进行下一步(比如接口只返回了一台服务器通过salt执行的结果,而数据库里该项目是两台服务器,我会认为这个发布有问题,而进行中断)这样也是为了避免有的主机更新成功了,有的主机没更新成功,导致线上用户体验不好(目前已经成功从深信服公司要到了负载均衡的api)后面要做的就是采用灰度发布,从负载上摘除一个然后就更新一个,更新完毕再加回负载。
importjsonfromdjango.httpimporthttpresponsefromdjango.views.decorators.csrfimportcsrf_exempttry:importsalt.clientexcept:passfromcmdb.modelsimport*classsalt_jenkins:def__init__(self,host_list,job):self.client=salt.client.localclient()self.host_list=host_listself.type=typeself.job=jobdefupgradeavailable(self):检测目标主机组项目在yum上是否有新版本更新,返回可以更新的主机ret=self.client.cmd(\\\'%s\\\'%self.host_list,\\\'pkg.upgrade_available\\\',[\\\'%s\\\'%self.job],expr_form=\\\'list\\\',ret=\\\'return_redis\\\')true_hostlist=[]forhostinret.keys():ifret[\\\'%s\\\'%host]:true_hostlist.append(host)else:passreturntrue_hostlistdefinstall(self):yum安装项目rpm包ret=self.client.cmd(\\\'%s\\\'%self.host_list,\\\'pkg.install\\\',[\\\'%s\\\'%self.job],expr_form=\\\'list\\\',ret=\\\'return_redis\\\')true_hostlist=[]forhostinret.keys():ifret[\\\'%s\\\'%host]!={}:install_ret=ret[\\\'%s\\\'%host][\\\'%s\\\'%self.job]ifinstall_ret!=\\\'\\\':true_hostlist.append(host)else:passelse:passreturntrue_hostlistdefmodrepo(self):创建项目yum源ret=self.client.cmd(\\\'%s\\\'%self.host_list,\\\'pkg.mod_repo\\\',[\\\'repo=%s\\\'%self.job,\\\'baseurl=http://172.18.11.98/release/%s\\\'%self.job,\\\'enabled=1\\\',\\\'gpgcheck=0\\\',\\\'name=%s\\\'%self.job,\\\'priority=10\\\'],expr_form=\\\'list\\\',ret=\\\'return_redis\\\')true_hostlist=[]forhostinret.keys():iftype(ret[\\\'%s\\\'%host])==dict:true_hostlist.append(host)else:passreturntrue_hostlistdefgetrepo(self):验证项目yum源是否存在ret=self.client.cmd(\\\'%s\\\'%self.host_list,\\\'pkg.get_repo\\\',[\\\'repo=%s\\\'%self.job],expr_form=\\\'list\\\',ret=\\\'return_redis\\\')true_hostlist=[]forhostinret.keys():ifret[\\\'%s\\\'%host]!={}:true_hostlist.append(host)else:passreturntrue_hostlistdefintro(self):执行svn_intro内命令command=svn.objects.get(svn_name=self.job).svn_introret=self.client.cmd(\\\'%s\\\'%self.host_

电脑开机提示无法验证TsFltmgr.sys文件的数字签名如何解决
郑叶来:云是服务化的基础设施,实时更新将持续赋能客户
远程下载有问题-虚拟主机/数据库问题
租用的云服务器可以吗
好域名的品牌价值究竟有多大?解析域名品牌的魅力
foxmail接收密码错误怎么办_foxmail接收密码错误的解决方法
Ubuntu18.04 一键升级Python所有第三方包 及安装python包的方法
腾讯企业邮箱一些相关信息