0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Ansible代码上线项目实战案例

马哥Linux运维 ? 来源:马哥Linux运维 ? 2025-07-24 14:03 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

从零到一:用Ansible打造企业级自动化部署流水线

在DevOps浪潮中,自动化部署已经成为每个运维工程师的必备技能。今天我将分享一个完整的Ansible代码上线项目实战案例,让你的部署效率提升10倍!

为什么选择Ansible?

在众多自动化工具中,Ansible凭借其无代理架构简单易学强大功能脱颖而出:

?无需安装客户端:只需SSH连接即可管理所有服务器

?YAML语法:人类可读的配置文件,团队协作更高效

?幂等性:多次执行结果一致,避免重复操作带来的问题

?模块丰富:内置2000+模块,覆盖99%的运维场景

项目架构设计

我们将构建一个完整的Web应用部署流水线:

项目结构
├── inventories/     # 环境清单
│  ├── dev/
│  ├── staging/
│  └── production/
├── group_vars/      # 组变量
├── roles/        # 角色目录
│  ├── common/     # 基础环境
│  ├── nginx/      # Web服务器
│  ├── app/       # 应用部署
│  └── monitoring/   # 监控配置
├── playbooks/      # 剧本文件
└── deploy.yml      # 主部署文件

核心组件实现

1. 环境清单配置

inventories/production/hosts.yml

all:
children:
 webservers:
  hosts:
   web-01:
    ansible_host:10.0.1.10
   web-02:
    ansible_host:10.0.1.11
 databases:
  hosts:
   db-01:
    ansible_host:10.0.2.10
 loadbalancers:
  hosts:
   lb-01:
    ansible_host:10.0.3.10

2. 应用部署角色

roles/app/tasks/main.yml

---
-name:"创建应用目录"
file:
 path:"{{ app_path }}"
 state:directory
 owner:"{{ app_user }}"
 group:"{{ app_group }}"
 mode:'0755'

-name:"从Git仓库拉取代码"
git:
 repo:"{{ git_repo }}"
 dest:"{{ app_path }}/releases/{{ deployment_id }}"
 version:"{{ git_branch | default('main') }}"
 force:yes
register:git_result

-name:"安装依赖包"
pip:
 requirements:"{{ app_path }}/releases/{{ deployment_id }}/requirements.txt"
 virtualenv:"{{ app_path }}/venv"
 virtualenv_python:python3
when:git_result.changed

-name:"配置应用参数"
template:
 src:config.j2
 dest:"{{ app_path }}/releases/{{ deployment_id }}/config.py"
 backup:yes
notify:restartapplication

-name:"创建软链接"
file:
 src:"{{ app_path }}/releases/{{ deployment_id }}"
 dest:"{{ app_path }}/current"
 state:link
 force:yes
notify:restartapplication

3. 滚动部署策略

playbooks/rolling_deploy.yml

---
-name:"滚动部署应用"
hosts:webservers
serial:1# 一台一台部署
max_fail_percentage:0

pre_tasks:
 -name:"从负载均衡器移除节点"
  uri:
   url:"http://{{ lb_host }}/remove/{{ inventory_hostname }}"
   method:POST
  delegate_to:localhost
  
 -name:"等待连接断开"
  wait_for:
   port:80
   state:stopped
   timeout:60

tasks:
 -name:"部署应用"
  include_role:
   name:app
   
 -name:"健康检查"
  uri:
   url:"http://{{ inventory_hostname }}/health"
   method:GET
   status_code:200
  retries:10
  delay:5

post_tasks:
 -name:"添加节点到负载均衡器"
  uri:
   url:"http://{{ lb_host }}/add/{{ inventory_hostname }}"
   method:POST
  delegate_to:localhost

4. 回滚机制

roles/app/tasks/rollback.yml

---
-name:"获取历史版本列表"
find:
 paths:"{{ app_path }}/releases"
 file_type:directory
register:releases

-name:"排序版本并获取上一版本"
set_fact:
 previous_release:"{{ (releases.files | sort(attribute='mtime', reverse=true))[1].path | basename }}"
when:releases.files|length>1

-name:"回滚到上一版本"
file:
 src:"{{ app_path }}/releases/{{ previous_release }}"
 dest:"{{ app_path }}/current"
 state:link
 force:yes
when:previous_releaseisdefined
notify:restartapplication

高级特性实现

1. 蓝绿部署

-name:"蓝绿部署切换"
block:
 -name:"部署到绿色环境"
  include_role:
   name:app
  vars:
   app_env:green
   
 -name:"验证绿色环境"
  uri:
   url:"http://{{ inventory_hostname }}:{{ green_port }}/health"
   status_code:200
   
 -name:"切换流量到绿色环境"
  replace:
   path:/etc/nginx/sites-enabled/app.conf
   regexp:'proxy_pass http://blue'
   replace:'proxy_pass http://green'
  notify:reloadnginx
  
rescue:
 -name:"部署失败,保持蓝色环境"
  debug:
   msg:"部署失败,自动保持当前蓝色环境运行"

2. 配置管理与密钥处理

group_vars/all/vault.yml(使用ansible-vault加密)

$ANSIBLE_VAULT;1.1;AES256
66386439653765386464626463653765346464...

解密使用:

ansible-playbook deploy.yml --ask-vault-pass

3. 监控集成

roles/monitoring/tasks/main.yml

-name:"部署Prometheus监控配置"
template:
 src:prometheus.yml.j2
 dest:/etc/prometheus/targets/{{inventory_hostname}}.yml
delegate_to:"{{ monitoring_server }}"
notify:reloadprometheus

-name:"发送部署通知到Slack"
uri:
 url:"{{ slack_webhook_url }}"
 method:POST
 body_format:json
 body:
  text:"{{ inventory_hostname }}部署完成 - 版本:{{ git_branch }}"
delegate_to:localhost

性能优化技巧

1. 并行执行优化

-name:"并行安装软件包"
package:
 name:"{{ item }}"
 state:present
loop:"{{ packages }}"
async:300# 5分钟超时
poll:0  # 立即返回
register:package_install

-name:"等待所有包安装完成"
async_status:
 jid:"{{ item.ansible_job_id }}"
loop:"{{ package_install.results }}"
register:job_result
until:job_result.finished
retries:30

2. 条件执行减少无效操作

-name:"检查应用是否需要更新"
stat:
 path:"{{ app_path }}/current"
register:current_version

-name:"部署新版本"
include_tasks:deploy.yml
when:notcurrent_version.stat.existsor
   git_result.after!=current_version.stat.lnk_target|basename

故障排查与调试

1. 调试模式启用

# 详细输出
ansible-playbook deploy.yml -vvv

# 检查模式(不实际执行)
ansible-playbook deploy.yml --check --diff

# 逐步执行
ansible-playbook deploy.yml --step

2. 日志记录配置

-name:"记录部署日志"
lineinfile:
 path:/var/log/deployment.log
 line:"{{ ansible_date_time.iso8601 }}-{{ inventory_hostname }}-{{ deploy_action }}"
 create:yes

一键部署脚本

deploy.sh

#!/bin/bash
set-e

ENVIRONMENT=${1:-staging}
BRANCH=${2:-main}
DEPLOYMENT_ID=$(date+%Y%m%d_%H%M%S)

echo" 开始部署到$ENVIRONMENT环境"
echo" 分支:$BRANCH"
echo" 部署ID:$DEPLOYMENT_ID"

# 预检查
ansible-playbook -i inventories/$ENVIRONMENTplaybooks/precheck.yml

# 执行部署
ansible-playbook -i inventories/$ENVIRONMENTdeploy.yml 
 -e"git_branch=$BRANCH"
 -e"deployment_id=$DEPLOYMENT_ID"
 --vault-password-file .vault_pass

# 部署后验证
ansible-playbook -i inventories/$ENVIRONMENTplaybooks/verify.yml

echo" 部署完成!"

最佳实践总结

1.版本管理:所有Ansible代码都应纳入Git版本控制

2.环境隔离:不同环境使用独立的配置文件

3.密钥安全:敏感信息使用ansible-vault加密

4.幂等性:确保多次执行结果一致

5.错误处理:为关键任务添加rescue块

6.监控告警:集成监控系统,及时发现问题

7.文档维护:保持详细的操作文档

结语

通过这个完整的Ansible部署项目,我们实现了:

? 零宕机时间的滚动部署

? 一键回滚能力

? 多环境配置管理

? 自动化监控集成

? 安全的密钥管理

这套方案已在我们的生产环境稳定运行2年,支撑了日均千万级访问量的业务系统。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 自动化
    +关注

    关注

    29

    文章

    5789

    浏览量

    85247
  • 代码
    +关注

    关注

    30

    文章

    4905

    浏览量

    70982

原文标题:从零到一:用Ansible打造企业级自动化部署流水线

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【全新课程资料】正点原子《ESP32物联网项目实战》培训课程资料上线

    正点原子《ESP32物联网项目实战》全新培训课程上线啦!正点原子工程师手把手教你学!通过多个项目实战,掌握ESP32物联网
    发表于 09-24 17:05

    【全新课程资料】正点原子《ESP32基础及项目实战入门》培训课程资料上线

    正点原子《ESP32基础及项目实战入门》全新课程资料上线啦!正点原子工程师手把手教你学!熟练掌握ESP-IDF开发,突破ESP32入门难题! 一、课程介绍 本课程针对ESP32的入门和基础外设进行
    发表于 09-24 17:59

    【全新课程资料】正点原子《基于GD32 ARM32单片机项目实战入门》培训课程资料上线

    正点原子《基于GD32 ARM32单片机项目实战入门》全新课程资料上线啦!彻底解决ARM32单片机项目入门难的问题! 一、课程介绍 本课程专为ARM32单片机的入门学习者设计,涵盖了
    发表于 09-24 18:06

    ansible核心程序批量部署

    ansible批量部署
    发表于 07-26 15:30

    ansible的工作原理和安装

    ansible安装(一)
    发表于 03-25 11:19

    项目实战

    项目实战篇,VHDL资料,又需要的下来看看
    发表于 08-08 17:03 ?92次下载

    《Arduino与LabVIEW开发实战》配套代码

    《Arduino与LabVIEW开发实战》配套代码
    发表于 03-23 16:00 ?31次下载

    Python项目开发实战1-50

    Python项目开发实战
    发表于 03-27 09:02 ?55次下载

    Ansible入门教程如何快速了解Ansible

    顶级大牛带你20分钟玩转Ansible
    的头像 发表于 05-12 11:49 ?5422次阅读

    一文详解Ansible的自动化运维

    CMDB:CMDB 存储和管理者企业IT架构中的各项配置信息,是构建 ITIL 项目的核心工具,运维人员可以组合 CMDB 和 Ansible,通过 CMDB 直接下发指令调用Ansible 工具集完成操作者所希望达到的目标;
    的头像 发表于 05-19 17:06 ?4806次阅读
    一文详解<b class='flag-5'>Ansible</b>的自动化运维

    机器学习实战的源代码资料合集

    本文档机器学习实战的源代码资料合集
    发表于 03-01 09:28 ?52次下载
    机器学习<b class='flag-5'>实战</b>的源<b class='flag-5'>代码</b>资料合集

    Python项目开发实战

    Python项目开发实战
    发表于 06-13 14:51 ?2次下载

    使用Ansible的OpenStack自动化

    通过将 Ansible Tower 与 OpenStack 集成到 Cyber Range 软件中,我们能够构建一个应用程序,为全球客户提供按需培训和真实场景。将 Ansible REST API 与行动手册集成,极大地利用了配置到更系统化的自动化流程所需的许多
    的头像 发表于 12-21 14:12 ?1496次阅读
    使用<b class='flag-5'>Ansible</b>的OpenStack自动化

    什么是Ansible

    Ansible是一种运维自动化工具软件,用来批量配置服务器或网络设备(目标主机)。
    的头像 发表于 02-15 14:06 ?1965次阅读

    Python编程实战(源代码)

    [源代码]Python编程实战 妙趣横生的项目之旅
    发表于 06-06 17:49 ?3次下载