相关文章推荐
逼格高的蛋挞  ·  c语言延时100ms - CSDN文库·  1 年前    · 
会开车的铁板烧  ·  正则表达式 - 朴素贝叶斯 - 博客园·  1 年前    · 
体贴的灯泡  ·  %E5%BD%A9%E7%A5%A8%E6% ...·  2 年前    · 
霸气的沙滩裤  ·  以Java的视角来聊聊SQL注入-阿里云开发者社区·  2 年前    · 
鬼畜的甜瓜  ·  java 如何重写equal ...·  2 年前    · 
Code  ›  Jenkins结合ansible实现虚机部署开发者社区
root ansible jenkins jenkins使用
https://cloud.tencent.com/developer/article/1671882
曾经爱过的刺猬
2 年前
dogfei
0 篇文章

Jenkins结合ansible实现虚机部署

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
dogfei
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > devops探索 > Jenkins结合ansible实现虚机部署

Jenkins结合ansible实现虚机部署

作者头像
dogfei
发布 于 2020-07-31 15:43:39
2.1K 0
发布 于 2020-07-31 15:43:39
举报

以重庆的用户管理项目为例

由于使用虚机部署,跟结合k8s和docker有一些区别,且此部署是针对私有化部署,例如本例中的重庆项目,外面是无法访问到服务器的,像这种场景的部署,需要具备以下条件:

  • 提供一台局域网内的代理机,能通过公网IP进行SSH方式连接
  • 该代理机需能免密或者使用同一密码进行连接到各业务服务器
  • 该代理机连接各业务服务器时使用的SSH端口保持一致

当然,后面两点不是必须的!但要知道每台机器的密码和SSH端口,否则无法实现部署

Jenkins配置

由于我已经实现准备好了针对虚机的Jenkins配置,所以只需要改下配置即可,以user-manage为例:

1)点击配置

img_5de8c81dd0cac-2c0de3e9-d9ea-47c2-b2fd-f93021c09ad8
img_5de8c81dd0cac-2c0de3e9-d9ea-47c2-b2fd-f93021c09ad8

2)修改用于回滚时的前缀名

img_5de8c8669a93b-9ebc2828-c112-4be5-9b6a-6fa4e7cd73ce
img_5de8c8669a93b-9ebc2828-c112-4be5-9b6a-6fa4e7cd73ce

这里的前缀就是每一个任务名的前缀,例如:chongqing-user-manage,shanxi-user-manage

3)修改pipeline脚本

node {
   def ip_addr = "47.95.131.241"     //代理机的IP地址
   def ip_port = "2222"              //代理机的SSH端口
   def bk_script = "/data/jenkins/workspace/scripts/backupjar.sh"     //用于本地备份jar包的脚本
   def git_address = "git@codehub.devcloud.huaweicloud.com:yhgl_liuxin00001/cloud-userAPI.git"     //代码仓库地址
   def git_auth = "d5941eda-4cd0-4dfd-9d37-13dbad31e766"     //用于拉取代码时进行认证
   def apps_name = "user-manager"    //服务名称,supervisor启动时会启动此名称
   def dst_dir = "/usr/local/user-manager"    //存放jar包的路径
   def dst_user = "root"    //默认都是root用户启动的程序
   if (env.Action == "Deploy") {
       stage('代码拉取') {
           deleteDir()    //构建前先清空目录
           checkout([$class: 'GitSCM', branches: [[name: '${Branch}']], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])    //拉取代码
           script {
               git_cm_id = sh(script: "git rev-parse --short HEAD", returnStdout: true).trim()    //获取commit id
               date_time = sh(script: "date +%Y%m%d%H%M", returnStdout: true).trim()    //获取当前时间
               pom = readMavenPom file: 'pom.xml'    //读取pom.xml文件
               project_version = "${pom.version}"    
               pkg_name = "${pom.artifactId}-${pom.version}"
               project_name = "${pom.artifactId}"
               jar_name = "${pkg_name}-${date_time}-${git_cm_id}.jar"
               pkg_dirs = "target"    //有的项目在打包后,生成的jar包在父目录的target下,有的是在其他路径下,指定此变量可以获取到jar包
               //start_cmd_java = "'/usr/local/jdk1.8.0_191/bin/java -jar ${pkg_name}-${date_time}-${git_cm_id}.jar --spring.cloud.nacos.config.server-addr=${nacos_url} --spring.cloud.nacos.config.namespace=${nacos_namespace} --spring.cloud.nacos.config.group=${nacos_group} --spring.profiles.active=${EnvName}'"
       stage('代码构建及分析') {
           sh "mvn clean package -Dmaven.test.skip=true"    //maven打包
       stage('清理旧文件') {
           sh "ssh root@${ip_addr} -p ${ip_port} 'mkdir -p /ansible-deploy/pkg/${apps_name}'"    //远程执行创建存放jar包的目录,不同的项目放在不同目录下,以项目名区分
           sh "ssh root@${ip_addr} -p ${ip_port} 'rm -rf /ansible-deploy/pkg/${apps_name}/${pkg_name}-*.jar'"    //删除远程目录下的所有jar包,不删除也可,因为jar包加了时间戳,所以不会重复,但不删会导致磁盘空间愈发的大
           sh "ssh root@${ip_addr} -p ${ip_port} 'rm -rf /ansible-deploy/roles/deploy-server/files/${pkg_name}-*.jar'"    //删除ansible-playbook中files目录下的所有jar包,原因同上
       stage('传包至电视台') {
           sh "scp -P ${ip_port} -r target/${pkg_name}.jar root@${ip_addr}:/ansible-deploy/pkg/${apps_name}/${jar_name}"    //将本地打好的jar包发送到远程代理机上,并加上时间戳和commit id和版本
       stage('代码发布') {
          sh """
          ssh root@${ip_addr} -p ${ip_port} "bash /ansible-deploy/main.sh --action_name=Deploy --app_name=${apps_name} --jar_file=${jar_name} --deploy_dir=${dst_dir} --cur_user=${dst_user} --group_name=${ClusterName}"    //执行此脚本实际上就是执行的ansible-playbook,作用就是将jar包发送到目标服务器上,并使用supervisor启动,然后清理旧的jar包
       stage('备份文件') {
           sh "bash ${bk_script} --jar_file=${pkg_name} --commit_id=${git_cm_id} --date_time=${date_time} --pkg_dir=${pkg_dirs}"    //备份此次打包好的jar包,放在这个位置执行,是为了当前面整个构建操作完成后再去备份jar包,否则就会每构建一次就备份一次,不管成功与否
 
推荐文章
逼格高的蛋挞  ·  c语言延时100ms - CSDN文库
1 年前
会开车的铁板烧  ·  正则表达式 - 朴素贝叶斯 - 博客园
1 年前
体贴的灯泡  ·  %E5%BD%A9%E7%A5%A8%E6%BA%90%E7%A0%81%E8%B5%84%E6%BA%90%E7%BD%91%E4%B8%8B%E8%BD%BD%E6%9C%80%E6%96%B0%E7%89%88%E5%AE%89%E行业资讯 - X-MO
2 年前
霸气的沙滩裤  ·  以Java的视角来聊聊SQL注入-阿里云开发者社区
2 年前
鬼畜的甜瓜  ·  java 如何重写equal 和hashcode方法(最佳实践) - myseries - 博客园
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号