实战:实现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 ,此时说明代码拉取成功