90DaysOfDevOps 实战:用 Ansible Role 与 Nginx 为 Web 集群搭建负载均衡器(Day 67)
文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载本篇指南延续 90DaysOfDevOps 第 66 天的配置管理主题聚焦于用 Ansible Role 复用机制改造 Playbook把通用工具安装抽离为commonrole并新建nginxrole 在独立的loadbalancer虚拟机上完成安装、模板配置与反向代理最终让http://192.168.169.134/将流量分发到两台 Apache Web 服务器。读完本文你将掌握import_tasks任务拆分、vagrant up按主机增量拉起、ansible-playbook多主机分组执行以及用ssh-copy-id与 ad-hoc 命令验证环境的方法。场景回顾为什么需要 Loadbalancer 虚拟机在第 66 天我们已经通过ansible-galaxy生成了多个 role 的目录骨架并把 Apache 的配置代码按 role 收进独立目录。当前环境由 Vagrantfile 定义四台 Ubuntu 21.10 虚拟机主机名IPSSH 转发端口角色db01192.168.169.1302210数据库本场景未使用web01192.168.169.1312211Apache Web 服务器web02192.168.169.1322212Apache Web 服务器loadbalancer192.168.169.1342213Nginx 负载均衡/反向代理在此之前我们只通过vagrant up web01 web02启动了两台 Web 服务器并依靠playbook3.yml完成 Apache 安装与页面定制。第 67 天的目标是为集群引入入口代理先启动loadbalancer虚拟机再让它承载 Nginx把请求代理到 web01 与 web02 两台上游服务器上。启动 loadbalancer 虚拟机并打通 SSH由于 loadbalancer 尚未启动它虽然已写进 inventory 但还没有配置 SSH 密钥需要先执行vagrant up loadbalancer该命令会读取 Vagrantfile 中:hostname loadbalancer的定义复用bento/ubuntu-21.10镜像分配公网 IP192.168.169.134与宿主机 2213 端口并沿用 2048MB 内存的 VirtualBox 配置。虚拟机就绪后把本机 SSH 公钥复制过去使 Ansible 后续能免密连接ssh-copy-id loadbalancer确认ssh loadbalancer能直接登录后即可开始改造 Playbook。common role把公共工具安装抽成可复用任务第 66 天创建的commonrole 定位是所有主机都会用到的基础角色。查看 roles/common/tasks/main.yml它不再内联任务而是通过import_tasks引入独立文件--- # tasks file for roles/common - import_tasks: install_tools.yml选择import_tasks而非旧式的include是因为 Ansible 已计划弃用include的静态包含语义import_tasks会在 Playbook 解析阶段静态导入行为更可预期。被导入的 install_tools.yml 使用 apt 模块批量安装三个通用工具- name: Install Common packages apt: name{{ item }} statelatest with_items: - neofetch - tree - figlet要点说明statelatest表示始终升级到最新版本适合通用小工具若希望锁定版本可用statepresentwith_items循环让{{ item }}依次取 neofetch、tree、figlet 三个包名一次任务完成全部安装。这样无论 webservers 还是 proxy 主机组都能在各自的 Playbook 块中复用 common role避免在每个角色里重复编写安装逻辑。更新 Playbook为 webservers 挂上 common role在 Playbook 的 webservers 主机块中把 common role 追加到 roles 列表让 Apache 配置之前先完成通用工具安装- hosts: webservers become: yes vars: http_port: 8000 https_port: 4443 html_welcome_msg: Hello 90DaysOfDevOps - Welcome to Day 66! roles: - common - apache2此处保留了第 66 天的变量定义Apache 监听 8000 端口、HTTPS 端口 4443、首页欢迎语指向 Day 66。完整文件见 playbook4.yml其中 apache2 role 的入口同样采用import_tasks: apache2_install.yml的拆分模式见 roles/apache2/tasks/main.yml保证各角色结构一致。nginx role安装、配置与模板三步走接下来为负载均衡机新建 nginx role。先看它的任务入口 roles/nginx/tasks/main.yml同样用两次import_tasks把安装与配置拆开--- # tasks file for roles/nginx - import_tasks: install_packages.yml - import_tasks: configure_nginx.yml第一步安装 Nginx 软件包见 install_packages.yml- name: Install Nginx packages apt: name: nginx state: present与 common role 的statelatest不同这里用statepresent只要 nginx 已安装即视为满足不强制升级。第二步部署站点配置并触发重启见 configure_nginx.yml- name: Deploy Nginx sites configuration template: src: mysite.j2 dest: /etc/nginx/sites-enabled/mysite notify: restart nginx - name: Remove defaults file: path/etc/nginx/sites-enabled/default stateabsent这里使用了 Ansible 的template模块把 templates/mysite.j2 渲染后写入/etc/nginx/sites-enabled/mysite并通过notify关联 handler同时删除 Nginx 自带的default站点避免默认配置与我们的代理站点冲突。对应的 handler 在 roles/nginx/handlers/main.yml 中定义--- # handlers file for roles/nginx - name: restart nginx service: namenginx staterestartedhandler 只有在 template 任务真正发生变更changed时才会被触发这是 Ansible 保证配置幂等性的典型写法。mysite.j2反向代理核心配置模板内容定义了一个 upstream 组与一个监听 80 端口的 server 块upstream webservers { server 192.168.169.131:8000; server 192.168.169.132:8000; } server { listen 80; location / { proxy_pass http://webservers; } }语义拆解upstream webservers声明后端服务器组web01131与 web02132都监听 8000 端口与 Playbook 中http_port: 8000保持一致listen 80让负载均衡机对外提供 HTTP 服务location /与proxy_pass http://webservers把全部请求转发给 upstream 组由 Nginx 在两组服务器间做默认的轮询round-robin负载均衡。由于仓库中的模板使用的是作者环境的固定 IP如果你的 Vagrant 环境分配了不同地址必须同步修改此文件中的服务器 IP可从vagrant ssh web01/web02后用hostname -I确认。组合 Playbook 与执行把 webservers 与 proxy 两个主机块合并进同一个 Playbook形成 playbook4.yml- hosts: webservers become: yes vars: http_port: 8000 https_port: 4443 html_welcome_msg: Hello 90DaysOfDevOps - Welcome to Day 66! roles: - common - apache2 - hosts: proxy become: yes roles: - common - nginx执行ansible-playbook playbook4.yml运行顺序与效果先在 webservers 组执行 common role安装 neofetch、tree、figlet与 apache2 role再到 proxy 组执行 common role 与 nginx role安装 Nginx、渲染 mysite.j2、删除 default 站点、重启服务。执行结果对应仓库中的运行截图配置完成的输出摘要见 Day67_config1.png其中 apache2 与 nginx 两个主机块的 task 均以 ok 收尾。验证方式在浏览器访问负载均衡机地址http://192.168.169.134/应能看到 Day 66 中定制的欢迎页面运行效果见 Day67_config2.png。由于 Nginx 会在 web01、web02 之间轮询转发刷新多次可观察到请求被分发到不同的后端。若访问结果不符合预期最常见的根因是模板templates\mysite.j2中写死的后端 IP 与本地 Vagrant 分配不一致按上文说明修正后重新执行ansible-playbook playbook4.yml即可。用 ad-hoc 命令快速验证安装不想重跑整个 Playbook 时可以用 ad-hoc 命令针对单台主机执行检查。例如验证 loadbalancer 上是否装好了 common 工具ansible loadbalancer -m command -a neofetch该命令直接在 proxy 主机上运行neofetch命令输出即证明 common role 的安装已生效截图见 Day67_config3.png。同理可把命令换成tree、figlet -f banner hello或nginx -v来验证对应组件。小结与下一步至此我们完成了一次典型的 Ansible Role 重构闭环用import_tasks把安装工具安装 Nginx配置 Nginx拆成独立任务文件职责单一、易于复用common role 挂到每个主机组nginx role 只作用于 proxy 组实现公共逻辑共享、专用逻辑隔离通过templatehandler实现配置即代码与幂等重启删除 default 站点避免配置冲突用vagrant up、ssh-copy-id完成环境搭建用ansible-playbook与 ad-hoc 命令完成部署与验证。最终两台 Apache Web 服务器共享一个 Nginx 入口反向代理与负载均衡生效。第 68 天将继续推进配置管理场景读者可对照 2022/Days/day68.md 衔接学习。赞分享文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载相关推荐如何快速下载电子课本PDF国家智慧教育平台教材下载工具tchMaterial-parser完整指南如何快速下载电子课本PDF国家智慧教育平台教材下载工具tchMaterial parser完整指南 你有没有遇到过这种情况打开国家中小学智慧教育平台上的电子文档/教程90DaysOfDevOps 实战使用 Ansible Roles 部署 Nginx 负载均衡Day 6790DaysOfDevOps 实战使用 Ansible Roles 部署 Nginx 负载均衡Day 67 本篇文章是 90DaysOfDevOps 学习文档/教程90DaysOfDevOps 实战 Day 67使用 Ansible 角色Roles与 Nginx 部署负载均衡器90DaysOfDevOps 实战 Day 67使用 Ansible 角色Roles与 Nginx 部署负载均衡器 本篇指南承接 90DaysOfDevO文档/教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Winform布局缩放辅助类:原理、实现与踩坑指南

Winform布局缩放辅助类:原理、实现与踩坑指南

简介:这是一份面向C# Winform开发者的窗体与控件布局缩放自适应辅助类资源,适用于窗口尺寸变化或分辨率切换后界面控件需要按原布局自动缩放、字体跟随调节的桌面应用场景。压缩包共134个文件,以84个cs源码文件为核心,配套38个res…

2026/10/13 17:56:00 阅读更多 →
Java开发实践MCP:用Spring Boot把Function Call接进LLM工作流

Java开发实践MCP:用Spring Boot把Function Call接进LLM工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 19:12:27 阅读更多 →
MCU跑RTOS还是SoC跑Linux?嵌入式选型核心逻辑与实战经验

MCU跑RTOS还是SoC跑Linux?嵌入式选型核心逻辑与实战经验

1. 从一块控制板和一块开发板的选型分歧说起如果你在嵌入式行业待过几年,一定遇到过这样的场景:团队要做一个新项目,硬件工程师画完框图,软件负责人看了一眼主控型号,脱口而出——“这颗MCU跑RTOS就行”,或…

2026/10/12 16:47:02 阅读更多 →

最新新闻

Service层命名规范:从见名知意到代码可维护性

Service层命名规范:从见名知意到代码可维护性

接手一个业务系统,我最怕看到的不是复杂算法,而是那种一打开就让人头晕的 Service 实现类。2000 行起步,方法名字从 process 到 handle 再到 doSomething,翻遍整个类也猜不出某个方法是干嘛的。命名这种事,看起来不影响…

2026/10/13 17:55:28 阅读更多 →
Windows内核模块枚举与隐藏原理深度解析

Windows内核模块枚举与隐藏原理深度解析

1. 这不是“找模块”,而是在内核内存里做一次精准外科手术“枚举和隐藏内核模块”——这八个字在安全研究、驱动开发或系统调试场景中,绝不是一句轻飘飘的技术术语。它背后是一整套对Windows内核运行时状态的深度观测与主动干预能力。我第一次在某高校实…

2026/10/13 17:55:28 阅读更多 →
Hibernate二级缓存Provider详解:从原理到选型与排坑

Hibernate二级缓存Provider详解:从原理到选型与排坑

被人突然问起“Hibernate的caching provider是什么”,我第一反应是:能问出这个词的人,多半已经看到配置文件里那一堆以hibernate.cache开头的键,但又没搞懂这些键到底在切换什么。这篇文章就把这个词拆开讲清楚,重点解…

2026/10/13 17:55:28 阅读更多 →
电能质量复合扰动识别:混沌集成决策树实战解析

电能质量复合扰动识别:混沌集成决策树实战解析

简介:这是一份面向电能质量复合扰动识别研究的MATLAB完整源程序包,对应知网论文《基于混沌集成决策树的电能质量复合扰动识别》,可作为电气工程、信号处理及机器学习方向的毕业设计或课题研究参考,帮助复现算法并开展对比实验。程…

2026/10/13 17:55:28 阅读更多 →
CentOS局域网DNS搭建:BIND9多域名权威解析实战

CentOS局域网DNS搭建:BIND9多域名权威解析实战

1. 为什么在CentOS上自建局域网DNS不是“多此一举”,而是刚需落地的第一步很多人看到“CentOS搭建局域网DNS”第一反应是:不就是改个/etc/resolv.conf?内网查个主机名用/etc/hosts不就完事了?我试过——在某高校实验室的物联网教学…

2026/10/13 17:55:28 阅读更多 →
ActiveMQ consumerCount精准获取与实战调优指南

ActiveMQ consumerCount精准获取与实战调优指南

1. 项目概述:为什么“获取消费者数量”是 ActiveMQ 运维与调优的黄金指标在某公司消息中间件团队的实际运维中,我接手的第一个紧急故障就和consumerCount直接相关——一个订单履约服务突然延迟飙升,下游库存扣减平均耗时从200ms暴涨到8秒。排…

2026/10/13 17:54:25 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →