建站服務器
本著步子邁得太大容易扯蛋的原則,平臺設計初衷就是能調用開源產(chǎn)品肯定不自己做,這樣平臺只作為一個綜合調度中心使用,無需考慮后面具體的功能實現(xiàn)邏輯。
使用jenkins還是要追溯到很久很久之前認知的一家公司,當時的技術總監(jiān)張曉峰讓我學到了持續(xù)集成引擎hudson,也就是后來的jenkins。以前公司是jenkins結合maven,ant做敏捷式開發(fā),而我只是取巧,用了其中的一些最基本的功能來實現(xiàn)系統(tǒng)發(fā)布更新。
傳統(tǒng)的運維發(fā)布
svn遷出代碼-本地打成tar包(rar包)- sftp上傳到服務器
jenkins建立發(fā)布項目-svn遷出代碼-通過sftp插件直接分發(fā)到服務器
優(yōu)點:粗暴簡單
缺點:
效率: 發(fā)布方式一單一服務器上線沒問題,多服務器分發(fā)效率下降。如果網(wǎng)內是統(tǒng)一入口登錄(即堡壘機為單一入口時),發(fā)布工作將變得極為困難。
安全風險:發(fā)布方式二的ssh賬號密碼必須存在jenkins上,雖然不是明文,但…..同樣也面臨這服務器的22口要對jenkins開放,安全是問題。
采用系統(tǒng)方案:yum
我當時的思路:公司是等保三級的單位,在當初我制定內網(wǎng)規(guī)則的時候,強烈建議ssh登錄范圍必須限定,統(tǒng)一的入口可以極大的減少被*跳板式*的可能,所以我想到了是用yum更新的方式:
發(fā)布:把代碼從svn上遷出后,打成rpm包(強烈推介fpm)
更新:通過yum的特性,更新的程序包每次保持版本號 1,例如test-519-1.x86_64(519就是jenkins的發(fā)布版本號),服務器每次只需要執(zhí)行以下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就是我們內網(wǎng)的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腳本的大體意思:
創(chuàng)建/home/release/$job_name目錄
然后把/var/lib/jenkins/workspace/$job_name(jenkins項目工作區(qū))的代碼打成一個以$job_name命名,版本號為$job_name的rpm包,其存放在/home/release/$job_name這個目錄里,其解壓后會解壓到/home/www/bbs目錄。
然后createrepo --update /home/release/$job_name/ 通知更新更新yum源.
最后就是回調我的salt接口(此接口的作用其實就是根據(jù)這個項目反查對應的哪幾臺發(fā)布主機,然后在這些主機上執(zhí)行yum install命令,是不是很無腦~)
saltstack接口(saltjenkinspost)
由于我的平臺和salt master是同一臺(主要是省事),省去了調用api,直接調用了本地saltstack已經(jīng)封裝的一些yum install 之類的命令。
upgradeavailable 驗證yum源是否更新
install 安裝
modrepo 創(chuàng)建yum源
getrepo 驗證yum源是否存在
intro 執(zhí)行更新后的一些命令
我在接口處理的每一步后都會驗證返回的主機是否跟數(shù)據(jù)庫預設的項目主機一樣,只有一樣了才會進行下一步(比如接口只返回了一臺服務器通過salt執(zhí)行的結果,而數(shù)據(jù)庫里該項目是兩臺服務器,我會認為這個發(fā)布有問題,而進行中斷)這樣也是為了避免有的主機更新成功了,有的主機沒更新成功,導致線上用戶體驗不好(目前已經(jīng)成功從深信服公司要到了負載均衡的api)后面要做的就是采用灰度發(fā)布,從負載上摘除一個然后就更新一個,更新完畢再加回負載。
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):創(chuàng)建項目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):執(zhí)行svn_intro內命令command=svn.objects.get(svn_name=self.job).svn_introret=self.client.cmd(\\\'%s\\\'%self.host_
電腦開機提示無法驗證TsFltmgr.sys文件的數(shù)字簽名如何解決鄭葉來:云是服務化的基礎設施,實時更新將持續(xù)賦能客戶遠程下載有問題-虛擬主機/數(shù)據(jù)庫問題租用的云服務器可以嗎好域名的品牌價值究竟有多大?解析域名品牌的魅力foxmail接收密碼錯誤怎么辦_foxmail接收密碼錯誤的解決方法Ubuntu18.04 一鍵升級Python所有第三方包 及安裝python包的方法騰訊企業(yè)郵箱一些相關信息