ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

90DaysOfDevOps 实战:用 Ansible Role 与 Nginx 为 Web 集群搭建负载均衡器(Day 67)

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),仅供参考
返回列表