ansible在linux自动化部署流水线中定位为“环境执行层”,承接ci/cd输出,负责拉取制品、准备环境、部署服务及健康验证,实现状态精准、一致、可复现;不参与代码构建或镜像推送,而是连接构建产物与运行环境的关键粘合剂。

Linux 自动化部署流水线结合 Ansible,核心在于用声明式配置驱动整个交付过程:Ansible 不负责构建代码或推送镜像,而是作为“环境执行层”,承接 CI/CD 流水线的输出,确保目标服务器状态精准、一致、可复现。
明确 Ansible 在流水线中的定位
它不是 CI(如 Jenkins/GitLab CI)本身,也不是容器运行时(如 Docker),而是连接“构建产物”与“运行环境”的关键粘合剂。典型分工如下:
- CI 阶段:编译代码、运行测试、打包应用(如生成 .jar、.whl 或 Docker 镜像)
- CD 触发点:Git tag 推送、合并到 main 分支、或人工审批通过后,触发部署流程
- Ansible 承担:拉取制品(如从 Nexus 下载二进制包 / 从私有 Registry 拉取镜像)、准备运行环境(用户、目录、权限、防火墙)、部署服务(启动 systemd unit / 运行容器 / 配置 Nginx 反向代理)、验证健康状态(curl 接口、检查端口、执行 smoke test 脚本)
最小可行流水线结构(以 Web 应用为例)
无需复杂平台,一个 shell + Ansible 就能跑通:
-
代码仓库:含源码 +
deploy/production.yml(主 playbook)+deploy/inventory/prod(主机清单)+templates/nginx.conf.j2(Jinja2 模板) -
CI 工具(如 GitLab CI):在
.gitlab-ci.yml中定义 stage:deploy:
stage: deploy
script:
- ansible-playbook deploy/production.yml -i deploy/inventory/prod --limit $DEPLOY_TARGET - Ansible 控制机:需预装 ansible-core、SSH 密钥已分发、能访问目标服务器和制品仓库(如 Harbor/Nexus)
关键实践要点
避免踩坑,聚焦实效:
-
Inventory 必须环境隔离:不要共用
/etc/ansible/hosts;按环境建目录(inventories/staging/、inventories/prod/),每个含hosts.yml和group_vars/all.yml(存通用变量,如app_version: "v1.2.3") -
敏感信息必须加密:用
ansible-vault encrypt_string 'mydbpass'生成密文,写入vault/secrets.yml,再在 playbook 中vars_files: [vault/secrets.yml] -
Playbook 要幂等且带验证:安装软件用
state: present,启动服务加enabled: yes;部署后务必加 task:uri: url=http://localhost:8080/health status_code=200 -
跳过“手动改配置”陷阱:所有配置文件必须由
template:模块生成,禁止copy:静态文件;变量统一收口在group_vars或 CI 的环境变量中(如APP_ENV: "{{ lookup('env', 'CI_ENV') }}")
与 Docker 协同更进一步
若应用已容器化,Ansible 不直接构建镜像,而是做三件事:
- 在目标节点上安装并配置 Docker 引擎(用
docker_iorole 或package模块) - 拉取指定 tag 的镜像:
docker_image: name: myapp:{{ app_version }} source: pull - 运行容器并挂载配置卷:
docker_container: name: myapp image: myapp:{{ app_version }} volumes: ["/opt/myapp/conf:/app/conf"]
这样既保留了容器的隔离性,又用 Ansible 管控了宿主机层面的依赖、网络策略和生命周期,真正实现“基础设施即代码”。











