持续集成交付CICD:Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前后端应用

news/2024/12/22 20:19:37/

目录

一、实验

1.部署Ansible自动化运维工具

2.K8S 节点安装nginx

3.Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前后端应用

二、问题

1.ansible安装报错

2.ansible远程ping失败

3. Jenkins流水线通过ansible命令直接ping多台机器的网络状态报错


一、实验

1.部署Ansible自动化运维工具

(1)环境

表1 主机

管理端192.168.204.8gitlab
被管理端192.168.204.180K8S master1
被管理端192.168.204.181K8S node1
被管理端192.168.204.182K8S node2

(2)  管理端安装ansible

#安装epel-release
yum install  -y epel-release #安装ansible
yum install -y  ansible#hosts文件位置:/etc/ansible/hosts
vim /etc/ansible/hosts# 主机hosts文件
vim /etc/hosts

(3)ansible远程ping

# ansible all -m ping

2.K8S 节点安装nginx

(1)K8S查看节点状态

# kubectl get node

(2) 节点安装nginx

1)添加 nginx 到 yum 源中
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm2)安装 nginx (在把nginx添加到 yum 源之后,就可以使用 yum 安装了)
sudo yum install -y nginx3)稍等一会,即可安装完成4)启动 nginx
sudo systemctl start nginx.service5)设置 nginx 开机自启动
sudo systemctl enable nginx.service

(3)nginx 配置信息

 
1)网站文件存放默认位置(Welcome to nginx 页面)
/usr/share/nginx/html2)网站默认站点配置
/etc/nginx/conf.d/default.conf3)自定义 nginx 站点配置文件存放目录
/etc/nginx/conf.d/4)nginx 全局配置文件
/etc/nginx/nginx.conf5)启动 nginx
service nginx start6)关闭 nginx
service nginx stop7)重启 nginx
service nginx restart
service nginx reload8) 加成nginx
nginx -t

(4)修改nginx配置文件

# /etc/nginx/nginx.confuser  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;tcp_nopush      on;tcp_nodelay     on;types_hash_max_size 2048;keepalive_timeout  65;#gzip  on;include /etc/nginx/conf.d/*.conf;server {listen 8099;server_name _;root /usr/share/nginx/html/devops03-devops-ui;# Load configuration files for the default server block.include /etc/nginx/default.d/*.conf;location / {}error_page 404 /404.html;location = /40x.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}}}

master1节点:

node1节点:

node2节点:

3.Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前后端应用

(1)修改GitLab共享库目录

(2) 修改部署类 Deploy.groovy

package org.devops//SaltStackdef DeployBySalt(){targetHosts = "${env.saltHosts}"localDeployDir = "/srv/salt/${env.projectName}"sh """[ -d ${localDeployDir} ] || mkdir -p ${localDeployDir}mv ${env.pkgName} ${localDeployDir}# 清理发布目录salt -L "${targetHosts}" cmd.run  "rm -fr ${targetDir}/${env.projectName}/* &&  mkdir -p ${targetDir}/${env.projectName} || echo file is exists"# 发布应用salt -L "${targetHosts}" cp.get_file salt://${env.projectName}/${env.pkgName} ${targetDir}/${env.projectName}"""if ("${env.projectType}" == "npm") {sh """# 解压salt -L "${targetHosts}" cmd.run  "cd ${targetDir}/${env.projectName} ;tar zxf ${env.pkgName}""""}if ("${env.projectType}" == "maven") {// 文件内容写到本地gitlab = new Gitlab()response = gitlab.GetRepoFile(21, "service.sh", "master")writeFile file: 'service.sh', text: "${response}"sh "ls -a "sh """mv service.sh  ${localDeployDir}# 发布启动脚本salt -L "${targetHosts}" cp.get_file salt://${env.projectName}/service.sh ${targetDir}/${env.projectName}# 启动服务salt -L "${targetHosts}" cmd.run  "cd ${targetDir}/${env.projectName} ;source /etc/profile  && sh service.sh ${env.projectName} ${env.releaseVersion} ${env.port} start"# 检查服务sleep 5salt -L "${targetHosts}" cmd.run  "cd ${targetDir}/${env.projectName} ;source /etc/profile  && sh service.sh ${env.projectName} ${env.releaseVersion} ${env.port} check""""}
}//ansible
def DeployByAnsible(){//将主机写入清单文件sh "rm -fr hosts"for (host in "${env.ansibleHosts}".split(',')){sh " echo ${host} >> hosts"}// sh " cat hosts"// ansible 发布sh """# 主机连通性检测ansible "${env.ansibleHosts}" -m ping -i hosts # 清理和创建发布目录ansible "${env.ansibleHosts}" -m shell -a "rm -fr ${env.targetDir}/${env.projectName}/* &&  mkdir -p ${env.targetDir}/${env.projectName} || echo file is exists" # 复制appansible "${env.ansibleHosts}" -m copy -a "src=${env.pkgName}  dest=${env.targetDir}/${env.projectName}/${env.pkgName}" """if ("${env.projectType}" == "npm"){sh """ ansible "${env.ansibleHosts}" -m shell -a "cd ${env.targetDir}/${env.projectName} ; tar zxf ${env.pkgName} " -u root """}if ("${env.projectType}" == "maven"){// 文件内容写到本地gitlab = new Gitlab()response = gitlab.GetRepoFile(21,"service.sh", "master")writeFile file: 'service.sh', text: "${response}"sh "ls -a "sh """# 复制脚本ansible "${env.ansibleHosts}" -m copy -a "src=service.sh  dest=${env.targetDir}/${env.projectName}/service.sh" # 启动服务ansible "${env.ansibleHosts}" -m shell -a "cd ${env.targetDir}/${env.projectName} ;source /etc/profile  && sh service.sh ${env.projectName} ${env.releaseVersion} ${env.port} start" -u root# 检查服务 sleep 10ansible "${env.ansibleHosts}" -m shell -a "cd ${env.targetDir}/${env.projectName} ;source /etc/profile  && sh service.sh ${env.projectName} ${env.releaseVersion} ${env.port} check" -u root"""}
}

(3) 修改流水线 cd.jenkinsfile

@Library("mylib@master") _
import org.devops.*def artifacts = new Artifacts()
def gitlabutil = new Gitlab()
def deployer = new Deploy()pipeline {agent { label "build" }options {skipDefaultCheckout true}stages{stage("PullArtifacts"){steps{script{repoName = "${JOB_NAME}".split("/")[0]env.projectName ="${JOB_NAME}".split("/")[-1].split("_")[0]if ("${env.projectType}" == "maven"){type="jar"}if ("${env.projectType}" == "npm"){type="tar.gz"}artifacts.PullArtifacts("${env.releaseVersion}","${env.projectName}",repoName,type)env.pkgName="${env.projectName}-${env.releaseVersion}.${type}"}}}stage("DeployHost"){steps{script{print("DeployHost")if ("${env.deployTool}" == "saltstack"){deployer.DeployBySalt()               }if ("${env.deployTool}" == "ansible"){deployer.DeployByAnsible()           }}}}}
}

(4) Jenkins修改前后端项目流水线参数

 

(5)手动构建前端流水线

(6)Blue Ocean查看

成功

(7)手动构建后端流水线

(8)Blue Ocean查看

二、问题

1.ansible安装报错

(1)报错

(2)原因分析

yum源

(3)解决方法

# vim /etc/resolv.conf
nameserver 8.8.8.8
nameserver 114.114.114.114

成功:

2.ansible远程ping失败

(1) 报错

(2)原因分析

从输出提示上基本可以了解到由于在本机的~/.ssh/known_hosts文件中并有fingerprint key串,ssh第一次连接的时候一般会提示输入yes 进行确认为将key字符串加入到 ~/.ssh/known_hosts 文件中

(3)解决方法

第一种:在本地先SSH登录一下对方设备,下次ansible 就可以正常操作了,但是比较麻烦

第二种:设置参数为不检查key

vim /etc/ansible/ansible.cfghost_key_checking = False           #71行取消注释

如继续操作出现如下报错,需要修改被管理端/etc/hosts

注释被管理端域名

如继续操作出现如下报错,修改 /etc/ansible/hosts

修改后

192.168.204.180 ansible_port=22 ansible_user=root ansible_password=123123
192.168.204.181 ansible_port=22 ansible_user=root ansible_password=123123
192.168.204.182 ansible_port=22 ansible_user=root ansible_password=123123

成功:

3. Jenkins流水线通过ansible命令直接ping多台机器的网络状态报错

(1) 报错

(2)原因分析

单向的ssh验证

(3)解决方法

ssh-keygen一路回车,主要是用来免密通信的

ssh-copy-id 被控端IP 需要输入对应主节的root密码

# ssh-copy-id root@192.168.204.180# ssh-copy-id root@192.168.204.181# ssh-copy-id root@192.168.204.182

成功:


http://www.ppmy.cn/news/1272317.html

相关文章

43 贪心算法 -第K个排列

题 目 描 述 n 个 字 共 有 n ! 种 排 列 。 给 定 参 数 n , 从 1 到 n 会 有 n 个 整 数 : 123 按 大 小 顺 升 序 列 出 所 有 排 列 的 情 况 , 并 己 当 n 3 时 , 所 有 排 列 如 下 : “ 123 …

Spring容器中scope为prototype类型Bean的回收机制

文章目录 一、背景二、AutowireCapableBeanFactory 方法 autowireBean 分析三、Spring 容器中 scope 为 prototype 类型 Bean 的回收机制四、总结 一、背景 最近做 DDD 实践时,遇到业务对象需要交给 Spring 管理才能做一些职责内事情。假设账号注册邮箱应用层代码流…

C++之io学习

01.C类型转换(了解) 静态转换: 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换 用于基本数据类型之间的转换,如把int转换成char,把char转换成int。这种转换的安全性也要开发…

什么是Composer的自动加载?

Composer的自动加载(Composer autoloading)是Composer工具的一个重要功能,用于自动加载PHP类和文件,以简化PHP应用程序的依赖管理和代码组织。自动加载允许您按需加载类,而无需手动包含文件或编写大量的require或inclu…

【ArcGIS Pro微课1000例】0055:Pro中如何处理个人数据库(.mdb)

文章目录 原因分析解决方案使用ArcGIS Pro的用户应该已经发现个人地理数据库(.mdb)不能使用了。随着ESRI的软件技术革新,在ArcGIS Pro中不再支持且将来也不会支持个人地理数据库(.mdb)。这个确实很烦人,很多项目还是在使用mdb数据库的。不过ESRI也给出了一些解决办法,不…

应用程序映射的 5 个安全优势

现代企业依靠无数的软件应用程序来执行日常运营。这些应用程序相互连接并协同工作以提供所需的服务。了解这些应用程序如何相互交互以及底层基础设施对于任何组织都至关重要。这就是应用程序映射概念的用武之地。 顾名思义,应用程序映射是创建应用程序架构&#xf…

flutter学习-day12-可滚动组件和监听

📚 目录 简介可滚动组件 SingleChildScrollViewListView separated分割线无限加载列表带标题列表 滚动监听和控制 ScrollController滚动监听NotificationListener滚动监听 AnimatedList动画列表滚动网格布局GridView 横轴子元素为固定数量横轴子元素为固定最大长度…

计算机网络 第四章(网络层)【上】

参考教程:4.1 网络层概述_哔哩哔哩_bilibili 一、网络层概述 1、网络层的任务 (1)网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输。 (2)如下图所示,这些异构型网络如果只…