jenkins结合ansible实现老旧非容器化业务批量部署,关键在于绕过容器依赖、适配异构环境、保障幂等性与可追溯性;通过动态inventory管理混合云主机、定制python解释器与模块、分阶段pipeline(校验、同步、启停、探针)及安全审计强化,支撑物理机/vm/私有云等老旧系统自动化部署。

Jenkins 结合 Ansible 插件实现混合云下老旧非容器化业务的批量自动化部署,关键在于绕过容器依赖、适配异构环境、保障幂等性与可追溯性。老旧系统通常运行在物理机、VM 或私有云(如 OpenStack、VMware)上,操作系统版本陈旧、SSH 服务受限、无 systemd 或 Python 版本偏低——Ansible 的无代理特性与 Jenkins 的调度能力正好互补。
环境适配:让 Ansible 在老旧节点上“跑起来”
老旧服务器常见问题包括:Python 2.6/2.4、无 pip、无 sudo 权限、SSH 禁用密码登录但又不支持密钥免密。需针对性处理:
- 使用 ansible_python_interpreter 指向兼容解释器(如
/usr/bin/python2.6),避免模块执行失败 - 在 Playbook 开头添加
gather_facts: false和fact_path: /dev/null,跳过对老旧系统不友好的 fact 收集 - 若目标机无 SSH 密钥认证能力,改用 sshpass + password-based auth(仅限内网可信环境),并在 Jenkins 凭据中安全存储密码
- 对 CentOS 5/RHEL 5 类系统,禁用
systemd相关模块,改用service模块配合init.d脚本控制服务启停
混合云主机清单统一管理
不同云环境(阿里云 ECS、AWS EC2、本地 VMware、IDC 物理机)IP 动态变化大,不能硬编码 /etc/ansible/hosts。推荐方案:
- 使用 动态 Inventory 脚本:为各云平台编写 Python 脚本(如
aliyun.py、vmware_inventory.py),通过 API 拉取实时资产,输出 JSON 格式主机列表 - Jenkins Pipeline 中通过
inventory: './inventory/aliyun.py'直接调用,支持传参过滤标签(如--host-type=legacy-web) - 对静态老旧节点,用 分组+变量文件 隔离差异:
group_vars/legacy-rhel5.yml定义专属路径、用户、启动命令;host_vars/10.1.2.3.yml补充单机配置
Jenkins 流水线设计:面向非容器化业务的关键阶段
老旧业务常为 Java WAR、PHP 单体、Shell 启动的 C++ 服务,部署逻辑重在文件替换、权限修复、进程守护。Pipeline 应聚焦以下环节:
-
Stage: Validate Legacy Env —— 执行 ad-hoc 命令校验目标机基础状态(如
free -m | awk '$1=="Mem:" {print $2}'> 512)、端口占用、目录可写性 -
Stage: Sync Binaries & Configs —— 使用
copy模块传输 WAR/JAR/INI 文件;用template模块渲染配置(如将db.host替换为当前环境对应地址) -
Stage: Graceful Stop & Start —— 避免 kill -9:先发自定义 stop.sh,等待 30 秒后检查进程消失;再用
shell模块启动,配合nohup+cronolog日志轮转 -
Stage: Smoke Test —— 调用简单 HTTP 探针(
curl -f http://localhost:8080/health)或 Telnet 端口连通性,失败则自动回滚前一版文件
安全与审计强化(针对老旧系统风险)
老旧环境往往缺乏日志集中、权限收敛和变更审计能力,Jenkins+Ansible 可补位:
- 所有 Playbook 执行强制启用
log_path: /var/log/ansible-legacy-deploy.log,并由 Jenkins 归档到 ELK 或 S3 - 在 Jenkinsfile 中注入
extra_vars: "deploy_user=${env.BUILD_USER_ID} deploy_time=${env.BUILD_TIMESTAMP}",确保每次部署带人、带时间戳 - 敏感操作(如数据库脚本执行、配置覆盖)加
when: ansible_env.USER == 'jenkins'锁定执行上下文,防止本地误运行 - 对金融、政务类老旧系统,启用 Ansible 的
--diff和--check模式做预演,并在 Jenkins 控制台输出变更预览(如哪些配置行将被修改)










