ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

90DaysOfDevOps 实战 Day 67:使用 Ansible 角色(Roles)与 Nginx 部署负载均衡器

2026/10/6 12:12:30 拓冰建站 浏览量
90DaysOfDevOps 实战 Day 67:使用 Ansible 角色(Roles)与 Nginx 部署负载均衡器 文档/教程【免费下载链接】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-galaxy生成的角色Role体系在 Vagrant 搭建的 Ubuntu 环境中为 Web 服务器集群部署一个 Nginx 反向代理负载均衡器。文章以仓库中的ansible-scenario4实战场景为骨架逐层拆解 Common 角色通用工具安装、Nginx 角色安装与配置、playbook4.yml的多主机编排逻辑以及 ad-hoc 命令验证方法读完即可独立复现两台 Apache Web 服务器 一台 Nginx 负载均衡器的完整自动化部署流程。场景回顾从 Day 66 的角色骨架到 Day 67 的负载均衡器在第 66 天中我们使用ansible-galaxy命令初始化了一批角色Role的文件夹结构并将之前零散的配置代码收拢进各自的角色目录使配置仓库变得整洁、职责清晰。当时只有apache2角色投入了实际使用通过playbook3.yaml管理两台 Web 服务器。进入 Day 67目标非常明确新增一台运行 Nginx 的负载均衡器/代理服务器让 Web 服务器与代理服务器都复用通用的common角色为代理主机编写专属的nginx角色安装 Nginx 并配置反向代理运行更新后的playbook4.yml完成一键部署。整套实战文件均可在仓库的 ansible-scenario4 目录 中查看其核心编排入口是 playbook4.yml。拉起负载均衡器虚拟机此前环境只启动了web01与web02两台 Web 服务器现在执行vagrant up loadbalancer即可多出一台作为负载均衡器/代理使用的 Ubuntu 系统。该主机虽然早已写入hosts清单文件但在虚拟机就绪之前 SSH 密钥尚未配置因此首次启动完成后还需要手动执行ssh-copy-id loadbalancer把本机的公钥拷贝到新主机上Ansible 才能通过 SSH 正常连接管理它。深入角色目录结构一次看清三个角色的完整骨架整个场景的目录结构如下详见 ansible-scenario4 目录ansible-scenario4/ ├── playbook4.yml └── roles/ ├── apache2/ # Web 服务器角色 │ ├── defaults/ │ ├── handlers/ │ ├── meta/ │ ├── tasks/ # apache2_install.yml、main.yml │ ├── templates/ # index.html.j2、ports.conf.j2 │ ├── tests/ │ └── vars/ ├── common/ # 所有主机通用角色 │ ├── defaults/ │ ├── handlers/ │ ├── meta/ │ ├── tasks/ # install_tools.yml、main.yml │ ├── tests/ │ └── vars/ └── nginx/ # 负载均衡器角色 ├── defaults/ ├── handlers/ # restart nginx 处理器 ├── meta/ ├── tasks/ # install_packages.yml、configure_nginx.yml、main.yml ├── templates/ # mysite.j2 ├── tests/ └── vars/这是 Ansible 角色的标准布局tasks存放实际执行的任务handlers存放可由任务触发的事件处理器templates存放基于 Jinja2 的可渲染配置模板defaults/vars存放变量meta存放角色依赖等元数据。三个角色共享同一套骨架但各自只关心自己的职责这正是角色化带来的模块化收益。Common 角色为所有服务器统一安装通用工具common角色被设计为所有主机都会引用的基础角色而其他角色则按使用场景按需引入。虽然名为 Common 的安装包neofetch、tree、figlet看起来像玩具但它的意义在于演示公共逻辑抽取 跨主机复用这一角色化的核心目的。用 import_tasks 串联任务文件角色入口 common/tasks/main.yml 非常精简只做一件事——把实际任务文件引入进来--- # tasks file for roles/common - import_tasks: install_tools.yml注意这里使用的是import_tasks而非旧式的include。include是静态/动态混用的旧写法已被官方标记为即将弃用import_tasks在 playbook 解析阶段就会静态展开任务结构清晰、调试时可预测是当前推荐的写法。安装通用包实际任务定义在 install_tools.yml- name: Install Common packages apt: name{{ item }} statelatest with_items: - neofetch - tree - figlet逐项说明apt基于 Debian/Ubuntu 的包管理模块当前仓库场景全部为 Ubuntu 主机name{{ item }}通过with_items循环批量安装多个包statelatest确保软件包升级到最新版本若希望固定版本可改为statepresent或指定版本号安装清单neofetch终端系统信息展示、tree目录树查看、figletASCII 艺术字。在 playbook 中挂载 Common 角色随后在 playbook 的每个主机块中追加common角色- hosts: webservers become: yes vars: http_port: 8000 https_port: 4443 html_welcome_msg: Hello 90DaysOfDevOps - Welcome to Day 66! roles: - common - apache2这里roles列表中的顺序即执行顺序先运行common安装通用工具再运行apache2配置 Web 服务。become: yes表示以提权方式执行apt 安装需要 root 权限vars块中定义了本组主机使用的端口与欢迎语变量。Nginx 角色在代理主机上安装并配置负载均衡器下一步是为负载均衡器虚拟机安装并配置 Nginx。与上一节同理我们同样基于标准角色骨架来组织只是这次nginx角色的任务拆得更细安装与配置分离职责边界更清晰。playbook 新增 proxy 主机块在 playbook4.yml 中原有webservers块保持不变新增proxy块- 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 - nginxproxy主机组同样先执行common再执行nginx实现基础工具 专属服务的组合式管理。任务入口安装与配置两步走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: presentstate: present保证 nginx 已安装不要求升级到最新比latest更稳适合生产环境锁定可预期状态。第二步配置站点并移除默认站点见 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关键点template模块将 Jinja2 模板 mysite.j2 渲染后写入/etc/nginx/sites-enabled/mysitenotify: restart nginx触发同名 handler——只有当模板内容发生变化时handler 才会真正重启 Nginx这是 Ansible 幂等性的典型体现第二条任务删除 Nginx 自带的default站点避免默认配置抢占 80 端口重启动作定义在 nginx/handlers/main.yml--- # handlers file for roles/nginx - name: restart nginx service: namenginx staterestarted负载均衡配置模板mysite.j2模板 mysite.j2 是负载均衡的核心内容如下upstream webservers { server 192.168.169.131:8000; server 192.168.169.132:8000; } server { listen 80; location / { proxy_pass http://webservers; } }配置语义upstream webservers定义一个名为webservers的后端服务器组包含两台 Web 服务器的 IP 与端口web01与web02对应http_port: 8000listen 80Nginx 监听 80 端口对外提供服务location / { proxy_pass http://webservers; }将所有请求反向代理到webservers组由 Nginx 按默认的轮询round-robin策略在两端点间分发流量从而实现负载均衡。注意 IP 地址适配如果按教程执行后页面未按预期出现很可能是环境中的服务器 IP 不同。此时只需编辑该模板把server行更新为你环境中真实的 Web 服务器 IP 地址再重新运行 playbook 即可。运行更新后的 playbook至此我们在昨天的common角色安装通用包基础上又增加了覆盖安装与配置全流程的nginx角色。现在执行ansible-playbook playbook4.ymlplaybook 会依次对webservers执行 common apache2和proxy执行 common nginx两个主机组展开部署。执行过程输出如下部署完成后Web 服务器与负载均衡器均已就绪在浏览器中访问负载均衡器的 IP 地址http://192.168.169.134/即可看到经由 Nginx 代理转发过来的 Web 页面内容如果页面不是预期效果请回到 mysite.j2 核对后端 Web 服务器 IP 是否与实际环境一致。用 ad-hoc 命令验证通用工具安装虽然可以确信刚才的部署一切正常但为了快速验证common角色是否真的在负载均衡器主机上安装了工具我们还可以使用 Ansible 的 ad-hoc临时命令模式直接执行单条命令ansible loadbalancer -m command -a neofetchloadbalancer目标主机对应 hosts 清单中的主机名-m command使用 command 模块执行普通命令-a neofetch实际执行的命令为neofetch。执行后可以看到该主机上neofetch正常输出系统信息从而确认common角色neofetch、tree、figlet确实已被正确安装小结Day 67 完整走通了 Ansible 角色化改造的核心闭环角色复用common角色被webservers与proxy两组主机同时引用一次定义、处处生效任务拆分nginx角色将安装与配置拆成两个任务文件入口main.yml通过import_tasks静态引入配合 handler 实现配置变更才重启的幂等行为负载均衡落地借助 mysite.j2 中的upstreamproxy_pass一台 Nginx 即成为两台 Apache Web 服务器的反向代理入口快速验证ad-hoc 命令ansible loadbalancer -m command -a neofetch无需编写 playbook 即可确认远端状态。所有文件均可在 ansible-scenario4 目录 中对照学习从 playbook4.yml 到三个角色的tasks、handlers、templates就是一套可复制、可运行的完整示例。下一节Day 68将继续深入 Ansible 的配置管理实践。赞分享文档/教程【免费下载链接】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 实战使用 Ansible Roles 部署 Nginx 负载均衡Day 6790DaysOfDevOps 实战使用 Ansible Roles 部署 Nginx 负载均衡Day 67 本篇文章是 90DaysOfDevOps 学习文档/教程90DaysOfDevOps 第 67 天使用 Ansible Roles 部署 Nginx 负载均衡器90DaysOfDevOps 第 67 天使用 Ansible Roles 部署 Nginx 负载均衡器 导读 本文是 90DaysOfDevOps 配置管理文档/教程90DaysOfDevOps 第 67 天Ansible Roles 复用与 nginx 负载均衡部署实战90DaysOfDevOps 第 67 天Ansible Roles 复用与 nginx 负载均衡部署实战 本指南承接上一节的 Ansible Roles 重文档/教程上一篇Nativefier 终极启动指南让你的网站应用随系统自动启动下一篇Gitness敏捷开发实践将Scrum融入开发流程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考