實戰:實現Jenkins在Gitlab免秘鑰登錄拉取代碼並傳遞到后端服務器上
框架圖:
環境准備:
角色 | IP地址 | 備注 |
Gitlab | 192.168.7.100 | 存放代碼 |
Jenkins | 192.168.7.101 | 拉取代碼 |
Tomcat-app1 | 192.168.7.104 | 提供服務 |
tomcat-app2 | 192.168.7.105 | 提供服務 |
haproxy | 192.168.7.102/192.168.7.103 | 反向代理及高可用 |
keepalived | 192.168.7.102/192.168.7.103(VIP:192.168.7.248) | 反向代理及高可用 |
安裝並配置tomcat服務
官方下載JDK地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
(1)從官網下載tomcat二進制安裝包 http://tomcat.apache.org/
下載路徑:https://archive.apache.org/dist/tomcat/
1、在兩台后端服務器上安裝JDK包
1、下載JDK包,使用8版本的即可,並將下載的包解壓,創建軟鏈接
[root@tomcat-web1 src]# tar xvf jdk-8u212-linux-x64.tar.gz [root@tomcat-web1 src]# ln -sv /usr/local/src/jdk1.8.0_212/ /usr/local/jdk ‘/usr/local/jdk’ -> ‘/usr/local/src/jdk1.8.0_212/’
2、設置JDK環境變量,並生效
[root@tomcat-web1 src]# vim /etc/profile # 配置環境變量 export HISTTIMEFORMAT="%F %T `whoami`" export export LANG="en_US.utf-8" export JAVA_HOME=/usr/local/jdk export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin [root@tomcat-web1 src]# . /etc/profile # 生效環境變量
3、對JDK的可執行程序創建軟鏈接
[root@tomcat-web1 src]# ln -sv /usr/local/jdk/bin/java /usr/bin/ ‘/usr/bin/java’ -> ‘/usr/local/jdk/bin/java’
4、查看此時解壓后的JDK版本
[root@tomcat-web1 src]# java -version java version "1.8.0_212" Java(TM) SE Runtime Environment (build 1.8.0_212-b10) Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)
2、在兩台后端服務器上安裝tomcat服務
1、在官網上下載tomcat軟件、解壓、並創建用戶賬號
[root@tomcat-web1 apps]#mkdir /apps [root@tomcat-web1 apps]# tar xvf apache-tomcat-8.5.42.tar.gz #解壓tomcat包 [root@tomcat-web1 apps]# ln -sv /apps/apache-tomcat-8.5.42 /apps/tomcat # 創建tomcat軟鏈接,方便后期升級tomcat版本。 ‘/apps/tomcat’ -> ‘/apps/apache-tomcat-8.5.42’ [root@tomcat-web1 apps]# useradd -m www -u 2020 -s /bin/bash # 創建一個www賬號,指定用戶的家目錄,以及指定shell類型,使其可以登錄
2、創建兩個存放app和web的目錄
[root@tomcat-web1 home]# mkdir /data/tomcat/tomcat_appdir -p [root@tomcat-web1 home]# mkdir /data/tomcat/tomcat_webdir/myapp -p
3、修改tomcat配置文件
# vim /apps/tomcat/conf/server.xml <Host name="localhost" appBase="/apps/tomcat/tomcat_webdir" # 指定訪問網頁的路徑
4、在之前創建的myapp目錄下創建一個測試頁面,用來測試訪問網站是否正常,第一台后端服務器訪問的IP地址:
# vim /data/tomcat/tomcat_webdir/myapp/index.html 192.168.7.104 web1
第二台后端服務器訪問的網頁測試
# vim /data/tomcat/tomcat_webdir/myapp/index.html 192.168.7.105 web2
5、配置完tomcat服務之后,修改tomcat的屬主與數組權限,啟動tomcat服務
[root@tomcat-web1 ~]# chown www.www /data/tomcat/ /apps/tomcat/ /apps/apache-tomcat-8.5.42 -R # 將tomcat相關的目錄屬主和屬組權限進行修改 [root@tomcat-web1 ~]# su - www [www@tomcat-web1 ~]$ /apps/tomcat/bin/catalina.sh start Using CATALINA_BASE: /apps/tomcat Using CATALINA_HOME: /apps/tomcat Using CATALINA_TMPDIR: /apps/tomcat/temp Using JRE_HOME: /usr/local/jdk Using CLASSPATH: /apps/tomcat/bin/bootstrap.jar:/apps/tomcat/bin/tomcat-juli.jar Tomcat started. [root@tomcat-web1 ~]# su - www -c /apps/tomcat/bin/startup.sh # 或者直接在root權限下切換至www用戶啟動tomcat服務
6、此時可以看到tomcat服務是以www用戶啟動的服務
7、查看訪問網頁地址
3、在兩台主機上安裝keepalived和haproxy
1、在兩台主機分別安裝keepalived和haproxy,keepalived做高可用(主從VIP漂移),haproxy做反向代理,分擔后端服務器的壓力。
# yum install keepalived haproxy -y
2、修改主keepalived配置文件,添加VIP地址,/etc/keepalived/keepalived.conf ,監聽的端口號是:5000
注意要刪除vrrp_strict選項,此選項需要嚴格遵守VRRP協議,不允許狀況,不刪除會導致web頁面無法訪問:
1、沒有VIP地址
2、單播鄰居
3、在VRRP版本2中有IPv6地址
global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.7.248 dev eth0 label eth0:1 } }
3、修改從keepalived配置文件/etc/keepalived/keepalived.conf,監聽的端口號是5000
global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state SLAVE interface eth0 virtual_router_id 51 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.7.248 dev eth0 label eth0:1 } }
4、修改兩個haproxy主機的配置文件/etc/haproxy/haproxy.cfg,監聽VIP地址,將訪問的VIP地址調度到后端的服務器上
listen myapp mode http # 修改為http模式就會進行輪詢調度,采用七層代理,如果使用tcp調度,只會一直調度一個服務器,采用四層代理,只有一個haproxy代理連接數達到上限之后,才會調度到另一個服務器上 bind 192.168.7.248:80 server 192.168.7.104 192.168.7.104:8080 check server 192.168.7.105 192.168.7.105:8080 check
5、啟動haproxy和keepalived服務
# systemctl start keepalived haproxy
注意,如果haproxy啟動不起來,就需要修改/etc/sysctl.conf配置文件
[root@node1 src]# sysctl -a | grep bind net.ipv4.ip_nonlocal_bind = 0 # 查詢到此內核參數開關為0時,需要在/etc/sysctl.conf配置文件中改為1
修改/etc/sysctl.conf配置文件
# /etc/sysctl.conf net.ipv4.ip_nonlocal_bind = 1 # sysctl -p #內核參數修改完之后,將配置文件生效
6、配置好keepalived服務,需要將主的停掉,看VIP地址是否能夠漂移到從服務器上,如果可以,就啟動主從的keepalived服務,查看此時的haproxy和keepalived監聽的端口號,keepalived監聽的是5000端口。
7、此時可以訪問網頁測試效果,后端的兩個服務器可以進行輪詢調度訪問,此時haproxy和keepalived配置完成。
4、安裝配置jenkins
Jenkins官方下載地址:https://jenkins.io/zh/
官方下載JDK地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
1、下載JDK包,解壓並創建軟鏈接、修改環境變量
[root@jenkins src]# tar xvf jdk-8u212-linux-x64.tar.gz #解壓下載的jdk包 [root@jenkins src]# ln -sv /usr/local/src/jdk1.8.0_212/ /usr/local/jdk #創建軟鏈接 ‘/usr/local/jdk’ -> ‘/usr/local/src/jdk1.8.0_212/’ [root@jenkins src]# ln -sv /usr/local/jdk/bin/java /usr/bin # JAVA命令的軟鏈接 ‘/usr/bin/java’ -> ‘/usr/local/jdk/bin/java’
定義JDK環境變量,並使環境變量生效
# vim /etc/profile export HISTTIMEFORMAT="%F %T `whoami`" export export LANG="en_US.utf-8" export JAVA_HOME=/usr/local/jdk export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin # . /etc/profile
2、查看此時JAVA版本,如果能查看到JAVA版本號,說明安裝配置沒問題
[root@jenkins src]# java -version java version "1.8.0_212" Java(TM) SE Runtime Environment (build 1.8.0_212-b10) Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)
3、修改jenkins配置文件:/etc/sysconfig/jenkins
JENKINS_USER="root" #由於jenkins賬號可能存在權限過低問題,使用root用戶啟動 #添加啟動參數 JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -server -Xms2g -Xmx2g -Xss512k -Xmn1g \ #最大內存是2G,最小內存也是2G,如果主機內存夠大,也可以再調整大點 -XX:CMSInitiatingOccupancyFraction=65 \ -XX:+UseFastAccessorMethods \ -XX:+AggressiveOpts -XX:+UseBiasedLocking \ -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=10 \ -XX:NewSize=2048M -XX:MaxNewSize=2048M -XX:NewRatio=2 \ -XX:PermSize=128m -XX:MaxPermSize=512m -XX:CMSFullGCsBeforeCompaction=5 \ -XX:+ExplicitGCInvokesConcurrent -XX:+UseConcMarkSweepGC -XX:+UseParNewGC \ -XX:+CMSParallelRemarkEnabled -Djava.awt.headless=true \ -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=12345 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false \ -Djava.rmi.server.hostname="192.168.7.101"" #添加本地的IP地址
4、啟動jenkins服務,並查看監聽的端口號,此時的端口號是:8080
[root@jenkins default]# systemctl start jenkins
1、登錄jenkins網頁並配置
1、在網頁上進行訪問,訪問本地的IP地址並添加端口號:192.168.7.101:8080
2、查看此時的目錄密碼,用來進行登錄jenkins,進行初始化安裝jenkins
[root@jenkins default]# cat /var/lib/jenkins/secrets/initialAdminPassword 437752021fe446709c748be22c653427
3、登錄網頁后,然后選擇推薦的安裝
4、默認會安裝以下的包
5、設置管理員賬號和密碼
6、訪問的URL路徑不要動,直接下一步即可
7、登錄jenkins管理員賬號
8、登錄Jenkins后,去首頁安裝指定的gitlab和Blue Ocean插件,點擊左下角的直接安裝
9、安裝gitlab之后,選擇安裝完成后進行重啟jenkins服務
10、安裝Blue Ocean插件
2、在jenkins網頁上創建用戶並授權
1、創建一個testuser用戶賬號,先點擊jenkins頭像--->系統管理--->管理用戶---->創建用戶
2、創建一個testuser用戶賬號
3、登陸管理員賬號jenkinsadmin,安裝role base插件對普通用戶(testuser)授權
4、在jenkins--->系統管理--->全局安全配置---->選擇Role-Base Strategy認證
5、在系統管理--->Manage and Assign Roles 創建一個角色
6、添加角色並分配角色權限,應用並保存。
7、分配角色,將新建的testuser和創建的Linux-role角色進行關聯
8、登陸testuser賬號,此時的testuser賬號就沒有系統管理權限,只能執行被授過權的job,但是沒有了管理員的權限。
3、配置管理員郵箱
1、在系統管理--->系統設置,修改郵箱地址
2、配置發送郵箱地址,使用qq郵箱的smtp加密協議發送到公司內部郵箱
在jenkins基於ssh key拉取代碼
1、在jenkins主機上生成公私鑰對
[root@jenkins rules.d]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:SMNVEeqraNSfjX1ce4WFCb9VrrDA8V1zgS371fT5yg8 root@jenkins The key's randomart image is: +---[RSA 2048]----+ | ..+o o..| | . . .. .o o=| | + .. o +o*B| | . + o o.=.B| | .. S . o.*o| | . . . . =.o| | . ..= . oEo.| | .. .+ o o +..| | .. . . o.| +----[SHA256]-----+
查看此時生成的私鑰文件信息,將私鑰信息復制到jenkins網頁上
[root@jenkins rules.d]# cat /root/.ssh/id_rsa -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAr1DvqvhzdBGV0zObuxCg/sseK5VWLwyS3O55ncw+0BvUFuU8 AD+UDugI0LFILzkz1T2oUgEx2bNYuMyu1ZjhnPEz+ebqNulONBVA84HTI4Xwm5Hb JZoUIaumCi9wI+kxD5aKY3E1sCnRDwE4uM18XSpwDSZYTHR155sVw08XPOC4uX0u 9GgUEuy7OSuLhvMnISOpBhGNCt/aT23Dq2aBhM0UeaGMUIWRylspSJ9mWIYds36M 6byinNgfIom0FpbGq2p88zgKGE8LJ8KxwGCz5GRlnbAACsAml4iOjQQfTvnFTKSi gN6nEU47LUci2yW3NxKllmUGY3CddHEToww0/QIDAQABAoIBAGXladd6XkhI7Eb8 CPiZ+qj8z4VPX+8qpLWKWd9QVfXJJuVDyTLvwRNE49LAJ49i9PBszMcU8K9yoQ+P z9JP8Fmyi54lC15tDcoRzFV70IcmEymohbH+MtM7G99xoQEOSTihK8AOjcDdHShW cmxe6niP8N6DufB+BAVgSy7gakYz9Ek36P8AdMwz9Tn7icvKThGWk0QAvoSMtTEY UQgnk3fnzrZOWrmF+JR3HlMGMc9SIVykXfv6NUI29Arfmwtb5sngfrx6riC7vof6 GeHMgb297oYSA4kuMC9WlHOdmk0vD4BUMtaCrYMCm20DA4ysnGnl0cKuP+CipPRy +dWJ92ECgYEA3ViZaKql7NU/ZF5qbLsMAlXVViGAHSvenljLNSPKf2GsErMR98T2 k6VceFTEvsE8aag93DYeK1WofHuEAMMh3abZSxPnq2xXZPOldRTm+Gw6T1WfY5Mt 5cHpiLldB3GQ881wsIWjmdTTQKO4Cy05494WtSPlWPt0tHfjARGb7DUCgYEAysN9 D1fecvBiKHmbiFtpDM1Dmu28MpbgUVfrzipSQ50+OX8gJmm/n5ZehF28a0uxfnKQ 25rFZ4PcDDWsKRgJ9kQTiiLVoaXfXYpsrVt2YAFL9uwnsWF390kovTAHbdFlpDyb 6gF79eWuXom0L+/Ij6xHjoJYoEZNh5UFtp/07qkCgYANm43K1nre5XlBNWC7kIA7 gIVeBy82G+VSvMi5WprvW9TVTXb0UYKLLyZRK3zw8TZClJpA+H7AUULLbFiAJ37k foZrTCz45+8zgJsSaJeOfDDVgcELwReYQWSXCDZE5+Fua5na8ExPf7sBBU+iOESP 0q54sl0+LC9PjPNCtI9uZQKBgQDC4i37Z0spUh4mJOv2nVVUtp159XHjddxYkpbU axzyW9oIzUULZqyFKLPjqWyF/BS3IkpUqGd/3N7M5XF5dd9tUXUuWdjXK2SKtZdK 8BPQpq5qwAROmw4BIdIENHuPc6mrt41r1s1cRMvZlaUYRfGRFdcZA/NG6Qtvey4o n4l9MQKBgQCO3NqgLCeqeq5r/lu5TTzOxaD+tyxJZWJDGMowE/MVqXY88pA66hvy oMHmdnRKnMmakWmv+/YYfuhYDaqYV+Wj88J9mWPUscimEQylDTmcZCeJyR7slOfT OgslT9H+LtNX77B8vaYsICl0g8InaA/EDU5Pqawfph2lKEzrgVQ0ng== -----END RSA PRIVATE KEY-----
2、在jenkins首頁--->憑據--->jenkins---->全局憑據---->添加憑據上添加一個jenkins服務器的證書憑證
3、創建linux-jobs項目(jenkins首頁---->NEW任務 來創建新的項目)
4、創建一個測試的執行shell命令
5、選擇剛創建的linux-jobs項目,配置git項目地址和用戶,添加完成的證書沒有報錯表示認證通過
6、然后將gitlab服務里創建的linux_gitlab組里的web1項目的URL進行克隆,web1項目的創建,詳情見gitlab之一,需要對gitlab配置免密拉取gitlab上面的文件,詳情見此鏈接:https://www.cnblogs.com/struggle-1216/p/12386887.html
7、將gitlab服務器web1項目的URL地址復制后,粘貼到jenkins服務的源碼位置,確保jenkins安裝了git命令。
8、點擊立即構建,顯示藍色說明克隆正常。
9、點擊控制台,查看具體的執行信息,可以看到此時克隆的文件在 /var/lib/jenkins/workspace/linux-jobs此目錄下
10、在jenkins主機上查看克隆的結果,此時可以看到,克隆的文件果然在此目錄下:/var/lib/jenkins/workspace/linux-jobs/
[root@jenkins ~]# cat /var/lib/jenkins/workspace/linux-jobs/index.html linux web v1 linux web v2[root@jenkins ~]#
在gitlab主機上獲取的代碼復制到后端服務器上
1、將jenkins主機的公鑰復制到后端服務器上www賬號上,實現遠程登錄www時,免秘鑰登錄
[root@jenkins ~]# ssh-copy-id www@192.168.7.104 # 將jenkins公鑰復制到后端服務器上 [root@jenkins ~]# ssh-copy-id www@192.168.7.105 [root@jenkins ~]# ssh www@192.168.7.104 # 測試可以免秘鑰遠程登錄后端服務器的www賬號 Last login: Fri Mar 6 08:41:26 2020 from 192.168.7.101 [www@tomcat-web1 ~]$ [root@jenkins ~]# ssh www@192.168.7.105 # 測試遠程登錄后端服務器 Last login: Wed Mar 4 09:12:31 2020
2、此時沖jenkins主機傳遞到后端服務器的公鑰文件在/home/www/.ssh/authorized_keys文件內,我們也可以在后端服務器切換至www賬號上創建一個/home/www/.ssh/authorized_keys文件,將jenkins主機的公鑰直接復制到后端服務器的authorized_keys文件中,並將權限改為600:chmod 600 authorized_keys,兩種方法都可以。
[root@tomcat-web2 ~]# cat /home/www/.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvUO+q+HN0EZXTM5u7EKD+yx4rlVYvDJLc7nmdzD7QG9QW5TwAP5QO6AjQsUgvOTPVPahSATHZs1i4zK7VmOGc8TP55uo26U40FUDzgdMjhfCbkdslmhQhq6YKL3Aj6TEPlopjcTWwKdEPATi4zXxdKnANJlhMdHXnmxXDTxc84Li5fS70aBQS7Ls5K4uG8ychI6kGEY0K39pPbcOrZoGEzRR5oYxQhZHKWylIn2ZYhh2zfozpvKKc2B8iibQWlsaranzzOAoYTwsnwrHAYLPkZGWdsAAKwCaXiI6NBB9O+cVMpKKA3qcRTjstRyLbJbc3EqWWZQZjcJ10cROjDDT9 root@jenkins
3、在jenkins網頁上添加執行shell的命令,進行自動化在gitlab主機上拉取代碼,並將代碼直接復制到后端服務器上,/data/tomcat/tomcat_webdir/myapp目錄下是存放代碼位置,/data/tomcat/tomcat_appdir目錄下是存放壓縮文件位置。
cd /var/lib/jenkins/workspace/linux-jobs tar cf code.tar.gz index.html scp code.tar.gz www@192.168.7.104:/data/tomcat/tomcat_appdir/ scp code.tar.gz www@192.168.7.105:/data/tomcat/tomcat_appdir/ ssh www@192.168.7.104 "/apps/tomcat/bin/shutdown.sh && rm -rf /data/tomcat/tomcat_webdir/myapp/* && cd /data/tomcat/tomcat_appdir/ && tar xf code.tar.gz -C /data/tomcat/tomcat_webdir/myapp/" # 其中的/data/tomcat/tomcat_webdir/myapp目錄下是存放代碼位置 ssh www@192.168.7.105 "/apps/tomcat/bin/shutdown.sh && rm -rf /data/tomcat/tomcat_webdir/myapp/* && cd /data/tomcat/tomcat_appdir/ && tar xf code.tar.gz -C /data/tomcat/tomcat_webdir/myapp/" ssh www@192.168.7.104 "/apps/tomcat/bin/startup.sh" ssh www@192.168.7.105 "/apps/tomcat/bin/startup.sh"
4、對添加的shell腳本進行立即構建
5、可以詳細的查看構建執行的結果,最后的腳本執行成功會顯示SUCCESS
6、最后訪問keepalived配置VIP地址192.168.7.248:/myapp ,此時說明代碼拉取成功