Ansible 自动化部署 Nginx 集群需践行“配置即代码”:通过角色划分(LB/后端)、分层变量、Jinja2 模板动态生成 upstream、幂等任务与 handlers 自动 reload,并用 uri 模块闭环验证代理可用性。

用 Ansible 自动化部署 Nginx 集群,关键是把“配置即代码”真正落地:不是写一堆命令,而是通过清晰的角色划分、分层变量管理、Jinja2 模板驱动和幂等任务编排,让一次定义就能批量、一致、可验证地交付整个集群。
明确集群角色与主机清单结构
集群不是单台 Nginx,而是有分工的协作体。至少需区分两类节点:
- 负载均衡器(LB):运行 Nginx,负责反向代理、健康检查和流量分发
- 后端 Web 服务器(Web Server):实际提供服务,如静态页或 API 接口
在 inventory 文件(如 inventory.ini)中按角色分组,并设置层级变量:
-
[load_balancers]下定义 LB 节点,如lb01 ansible_host=192.168.10.100 -
[web_servers]下定义后端节点,如web01 ansible_host=192.168.10.101 -
[all:vars]统一设ansible_user=deploy和ansible_python_interpreter=/usr/bin/python3 -
[web_servers:vars]设internal_ip=10.0.0.101,供模板动态引用
用 Jinja2 模板动态生成 Nginx 配置
硬编码 upstream 列表会卡死扩展性。应在 templates/nginx.conf.j2 中用循环自动生成:
- upstream 块里写:
{% for host in groups['web_servers'] %}server {{ hostvars[host].internal_ip }}:80;{% endfor %} - 用变量控制行为,如
{{ nginx_port | default(80) }}或{{ health_check_path | default('/health') }} - Playbook 中只用一条
template:任务推送渲染后的配置到 LB 节点
确保服务启动可靠并闭环验证
部署完成 ≠ 服务可用。必须包含状态确认环节:
- 用
service:模块启用并启动 nginx,设enabled: yes - 配置
handlers:实现配置变更后自动reload,而非粗暴restart - 加
uri:模块探测 LB 是否能成功代理到某台 Web 服务器的/health接口 - 可选加
debug:输出upstream_servers渲染结果,便于排查模板逻辑
按角色组织 Playbook 提升复用性
避免把所有逻辑堆在一个 YAML 文件里。推荐标准目录结构:
-
roles/nginx/下分tasks/install.yml、config.yml、handlers/main.yml -
templates/存放nginx.conf.j2等模板文件 -
vars/main.yml定义该角色默认变量,如nginx_worker_processes: "{{ ansible_processor_vcpus }}" - 主 Playbook(如
site.yml)通过roles: - nginx引入,再按需传入环境变量


















