gitlab+jenkins實現nginx配置管理平臺

一、照例先描述需求:

目前有十多組nginx組,每組機器數量不等,多的20+臺,少的2,3臺。想改一個域名配置的時候就很煩躁,先找到域名對應到哪個nginx組裏,把其中一臺配置同步到ansible機器上,修改後通過playbook或者腳本再推送到同組nginx機器,然後nginx -t && nginx -s reload。
其實有了ansible後,也能緩解一些煩躁,但是一堆命令行腳本操作起來還是感覺很low,於是要平臺化~

二、確定一波方案:

網上看了很多nginx配置管理的方案是通過consul做的,consul-template,和kv的方式感覺實現起來都太麻煩了,需要在nginx機器上部署agent,部署了agent又要找監控方案。而且網上大部分consul-template的方案是沒有版本控制的。有一個gonsul的方案是git+consul實現的,能夠實現版本控制,不過後來也因爲麻煩廢棄了。
於是一波腦洞,想到了通過jenkins自動拉取git配置推送到nginx機器上實現。然後網上一頓找,驚訝居然沒人這麼玩orz。於是就自己折騰~

三、開始折騰

大概流程就是,/etc/nginx/ 整個目錄丟到gitlab上,同一組的nginx配置必須保證一致。然後操作的運維大佬直接在gitlab頁面上對配置文件進行編輯(gitlab的Web IDE還挺好用的233),修改後提交。jenkins檢測到項目變化後,就執行pipeline進行推送,以及reload

1、gitlab配置
  1. 在git 上創建一個項目組,裏面項目對應的就是每個nginx組的配置。(項目組的命名可以根據不同nginx組的作用,方便人區分。或者用同組首個nginxIP,方便其它的自動化配置修改腳本調用。這裏根據自己需要)涉及項目,打個重馬hhh
    在這裏插入圖片描述
    2.打開其中一個項目,裏面對應有這3個玩意。
    在這裏插入圖片描述
    nginx-conf 裏面放的就是 /etc/nginx/ 目錄裏的所有文件,包含nginx.conf,conf.d/*.conf 等各種配置文件
    Jenkinsfile 就是觸發Jenkins的pipeline,下一步會說到
    nginxip 文件裏把同組nginx IP 寫進去,方便後續添加或踢除nginx機器
2、Jenkins配置

1.先把說一下上面git裏要放的Jenkinsfile,pipeline內容:

pipeline {
	agent any
	triggers {
	    pollSCM ('* * * * *')   //這裏沒有用git的webhook去觸發,而是採用了Jenkins的SCM,每分鐘去檢測一次
	}
	environment {
		BRANCH_NAME = "master"
		NGINXIP_FILE = "nginxip"
		SRCPATH = "nginx-conf"
		DESPATH = "/etc/nginx"
		RSA_KEY = "/root/.ssh/id_rsa"
	}

	stages {
		stage('推送nginx配置') {
			steps {    //推送配置採用了rsync命令,讀取git目錄下的nginxip文件逐個推送,--delete參數實現刪除文件功能
			    sh "for ip in `cat ${env.WORKSPACE}/${NGINXIP_FILE}`;\
			    do \
			    rsync -avP --delete -e \"ssh -o 'StrictHostKeyChecking no' -i ${RSA_KEY}\" ${env.WORKSPACE}/${SRCPATH}/ \$ip:${DESPATH}/;\
			    done;"
			}
		}

		stage('nginx reload') {
			steps {
			    sh "for ip in `cat ${env.WORKSPACE}/${NGINXIP_FILE}`;\
			    do \
			    ssh -o 'StrictHostKeyChecking no' -i ${RSA_KEY} \$ip 'nginx -t && nginx -s reload';\
			    done;"
			}
		}
	}
}

pipeline整個流程也很簡單,把gitlab配置拉到jenkins機器工作目錄裏,然後rsync腳本進行推送配置,最後再挨個reload一遍。有兩個地方感覺不太滿意,
1是觸發條件我用了Jenkins的SCM而沒有用git的webhook,因爲我懶得一個個去到頁面配webhook。。。
2是推送配置用了rsync腳本,Jenkins本身是有自帶的sshput模塊進行推送文件的,但是sshput模塊用的不熟,沒寫出來orz。如果有更好的方案求分享 😃

2.接着到jenkins頁面上配置
Jenkins我用了Blue Ocean插件,好不好用先不說,反正很好看。。。
到藍海頁面後點右上角創建流水線,把git地址填上來,如果是首次創建會提示在gitlab上做ssh密鑰認證。創建流水線後會自動觸發一次Jenkinsfile,這時會把/etc/nginx/ 整個目錄rsync同步一次(建議點擊創建流水線之前先做好備份!)
在這裏插入圖片描述
創建完成後點擊到剛創建好的項目裏,就可以看到最近的流水線執行狀態,再點到對應的執行條目裏就能看到詳細的執行日誌
在這裏插入圖片描述
最後全部項目添加完成後,搞出來之後界面長這樣,每個nginx組對應一條項目流水線
在這裏插入圖片描述

四、結束

後續在gitlab頁面上修改配置,就會自動推送到同組的全部nginx了。
在git頁面修改nginxip 或者 Jenkinsfile 也會造成pipeline的執行,會導致配置雖然沒更新但是也會nginx reload
講的很不詳細==!主要是提供個實現的方案和思路~ 有好的想法,或者優雅的方案求分享~~ 😃

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章