当前位置: 首页 > news >正文

Jenkins运维之路(Jenkins流水线改造Day02-3-容器项目)

上期已经将容器项目的告警补充完成,这期在补充下ansible的相关部署内容,项目我使用的是自建的运维测试项目。

1. Ansible 目录结构

# 代码目录结构
tree -L 3
.
├── Ansible # Ansible部署脚本目录
│   ├── HelloWorld-Pipeline  # 按Jenkins项目名建立playbook文件夹
│   │   ├── deploy.yml  # 部署脚本
│   │   ├── hosts # 主机清单
│   │   └── rollback.yml # 回滚脚本
│   └── Readme.md
├── Jenkinsfile
│   ├── Helloworld-Pipeline-DockerSlave.jenkinsfile
│   ├── HelloWorld-Pipeline.jenkinsfile
│   └── Readme.md
├── Readme.md
├── src
│   └── org
│       └── foo
└── vars└── Readme.md

2. Ansible部署脚本(deploy.yml)

---
- name: Deploy Docker containerhosts: testbecome: yesvars:# 这些变量都会从Jenkins中传入new_image_name: "{{ new_image_name }}"container_name: "{{ container_name }}"docker_registry: "{{ docker_registry }}"  docker_username: "{{ docker_username }}" docker_password: "{{ docker_password }}"tasks:- name: Login to Docker registrydocker_login:registry: "{{ docker_registry }}"username: "{{ docker_username }}"password: "{{ docker_password }}"- name: Pull the latest Docker imagedocker_image:name: "{{ new_image_name }}"tag: latestsource: pull- name: Stop and remove old container if existsdocker_container:name: "{{ container_name }}"state: absentignore_errors: yes  # 忽略错误,确保后续任务继续执行- name: Run new containerdocker_container:name: "{{ container_name }}"image: "{{ new_image_name }}"state: startedrestart_policy: alwayspublished_ports:- "8888:8080"  # 映射主机的8888端口到容器的8080端口- name: Remove unused Docker imagescommand: docker image prune -f --filter "until=24h"  # 清理24小时内未使用的镜像,这个根据自己情况register: prune_result

3. Ansible部署脚本(rollback.yml)

---
- name: Deploy Docker containerhosts: testbecome: yesvars:# 这些变量都会从Jenkins中传入new_image_name: "{{ rel_image_name }}"container_name: "{{ container_name }}"docker_registry: "{{ docker_registry }}"docker_username: "{{ docker_username }}"docker_password: "{{ docker_password }}"ansible_python_interpreter: /usr/bin/python3tasks:- name: Login to Docker registrydocker_login:registry: "{{ docker_registry }}"username: "{{ docker_username }}"password: "{{ docker_password }}"- name: Pull the latest Docker imagedocker_image:name: "{{ rel_image_name }}"tag: latestsource: pull- name: Stop and remove old container if existsdocker_container:name: "{{ container_name }}"state: absentignore_errors: yes- name: Run new containerdocker_container:name: "{{ container_name }}"image: "{{ rel_image_name }}"state: startedrestart_policy: alwayspublished_ports:- "8888:8080"- name: Remove unused Docker imagescommand: docker image prune -f --filter "until=24h"register: prune_result

4. Hosts

[test]
192.168.1.98

5.Jenkins传入变量的代码片段(在前面2片文章有写)

pipeline {//.......省略stages {//.......省略//这里开始传入相关变量stage('Ansible Deploy') {steps {ansiColor('xterm') { // 启用 AnsiColorecho "${PURPLE}Ansible 部署项目${RESET}"}script {sh "git clone ${OPS_SHARE_LIBRARY} ./ops-share-librarya"withCredentials([usernamePassword(credentialsId: 'Harbor', usernameVariable: 'HARBOR_USERNAME', passwordVariable: 'HARBOR_PASSWORD')]) {def extraVars = [container_name: "${CONTAINER_NAME}",docker_registry: "${HARBOR_URL}",docker_username: "${HARBOR_USERNAME}",docker_password: "${HARBOR_PASSWORD}"].collectEntries { [(it.key): it.value] }// 根据 BRANCH_TAG 的值添加特定的参数if (!env.BRANCH_TAG.startsWith('rel-')) {// 正常部署时添加的参数extraVars['new_image_name'] = "${REGISTRY_URL}/${PROJECT_GROUP}/${PROJECT_NAME}:${_tag}"// 执行正常的部署ansiblePlaybook(playbook: "./ops-share-librarya/Ansible/HelloWorld-Pipeline/deploy.yml",inventory: "./ops-share-librarya/Ansible/HelloWorld-Pipeline/hosts",extraVars: extraVars)} else {def branchTag = env.BRANCH_TAGdef extractedValue = branchTag.replaceFirst(/^rel-/, '')  // 去掉前缀 "rel-"println "Extracted Value: ${extractedValue}"  // 输出提取的值// 回滚时添加的参数extraVars['rel_image_name'] = "${REGISTRY_URL}/${PROJECT_GROUP}/${PROJECT_NAME}:${extractedValue}"// 执行回滚ansiblePlaybook(playbook: "./ops-share-librarya/Ansible/HelloWorld-Pipeline/rollback.yml",inventory: "./ops-share-librarya/Ansible/HelloWorld-Pipeline/hosts",extraVars: extraVars)}}}}}//.......省略}
}

6.部署测试

image-20250916184452063

image-20250916184452063

容器项目的相关流水线到这里基本都已经搞完了,目前完成了落项目部署和容器项目部署的流水线,但是这些也只是作为模板,后面还要优化迭代。


文章转载自:

http://Xx895swg.pjxtq.cn
http://FwpUdBYV.pjxtq.cn
http://tH2vKWjh.pjxtq.cn
http://zfgmgNSW.pjxtq.cn
http://Ig7aOKEt.pjxtq.cn
http://x4Xl1ODf.pjxtq.cn
http://rIer0Xro.pjxtq.cn
http://gtf7MyX4.pjxtq.cn
http://cToeQZXa.pjxtq.cn
http://wsBqurB3.pjxtq.cn
http://cc5WRPXG.pjxtq.cn
http://lr5FfoMu.pjxtq.cn
http://2QmWtdmg.pjxtq.cn
http://dcwFDvXy.pjxtq.cn
http://cglXptDI.pjxtq.cn
http://eQNsLhKH.pjxtq.cn
http://96Ma72xt.pjxtq.cn
http://YVCQcNL4.pjxtq.cn
http://YDlXVWwm.pjxtq.cn
http://UYKDDtNw.pjxtq.cn
http://49P7LHWB.pjxtq.cn
http://YXgOUq7p.pjxtq.cn
http://XZmiQH4N.pjxtq.cn
http://5PEAZ1kN.pjxtq.cn
http://MRleCyjQ.pjxtq.cn
http://7gHBOMHf.pjxtq.cn
http://YPbonYEG.pjxtq.cn
http://1eY9LsB9.pjxtq.cn
http://ldx62E8i.pjxtq.cn
http://XxyfLthp.pjxtq.cn
http://www.dtcms.com/a/386036.html

相关文章:

  • 【代码讲解】SO-ARM100 双场景演示:手柄驱动 Mujoco 仿真 + 实机控制
  • 进阶OpenCV --视频物体跟踪
  • ASP.NET 实战:用 DataReader 秒级读取用户数据并导出 CSV
  • 如何使用 Python 程序把 PDF 文件转换成长图 PNG 格式输出图片?
  • 从Dubbo到SpringCloud Alibaba:大型项目迁移的实战手册(含成本分析与踩坑全记录)(二)
  • vue3 + ts + uniappX 封装上传文件(image pdf)、预览文件功能
  • PDF/图像/音视频一体化处理方案
  • 【数据结构】 深入理解 LinkedList 与链表
  • Hadoop HDFS-高可用集群部署
  • 深入汇编底层与操作系统系统调用接口:彻底掰开揉碎c语言简单的一行代码-打印helloworld是如何从C语言点击运行到显示在屏幕上的
  • ARM3.(汇编函数和c语言相互调用及ARM裸机开发环境搭建)
  • LeetCode 380 - O(1) 时间插入、删除和获取随机元素
  • 9 基于机器学习进行遥感影像参数反演-以随机森林为例
  • DB Hitek宣布推出650V GaN HEMT工艺
  • 机器学习简单数据分析案例
  • [特殊字符] 欢迎使用 C++ Arrow 函数 - 革命性的新特性!
  • 外网访问分布式跟踪系统 zipkin
  • Base 发币在即:L2 代币能否撬动生态增长?
  • DRDR生态Token正式上线BitMart,开启全球化新篇章
  • Spring Boot 3 + EasyExcel 文件导入导出实现
  • 9.16总结
  • Android开机时间查看
  • 探针水平的表达矩阵转换为基因水平的表达矩阵是芯片数据分析中关键的一步
  • PHP基础-语法初步(第七天)
  • 奥威BI与ChatBI:自然语言交互赋能企业数据分析新体验
  • Vue: 组件基础
  • 亚马逊云科技 EC2 服务终端节点:安全高效访问云服务的利器
  • 2026届计算机毕业设计选题 大数据毕业设计选题推荐 题目新颖 数据分析 可视化大屏 通过率高
  • html实现文字横向对齐以及margin的解释
  • 如何轻松找到并畅玩Edge浏览器隐藏的冲浪小游戏