Ansible模板生成Nginx配置

当你有十几台甚至上百台服务器需要部署Nginx站点时,逐台登录修改配置既慢又容易出错。
使用Ansible的模板功能,可以把Nginx配置里变化的IP、端口、域名等部分抽成变量,一次性为所有服务器生成专属配置并自动加载。
下面从零开始走一遍完整流程。

环境准备与节点连通

在控制机(安装Ansible的机器)上确认版本:

ansible --version

如果未安装,
常用包管理器直接装即可,
例如Ubuntu/Debian执行sudo apt install ansible -y,
CentOS/RHEL可执行sudo yum install ansible -y。

准备被管理的服务器清单,编辑/etc/ansible/hosts或项目目录下的inventory.ini:

[web]
192.168.1.10 ansible_user=root
192.168.1.11 ansible_user=root
192.168.1.12 ansible_user=root

建议先配置SSH免密登录,并用以下命令测试连通性:

ansible web -i inventory.ini -m ping

返回SUCCESS或pong说明控制机能正常连接目标机。
这一步不通过,后续所有操作都会失败。

编写Jinja2模板与变量文件

在项目目录下创建templates/nginx_site.conf.j2,内容如下:

server {
    listen {{ nginx_port }};
    server_name {{ server_name }};

    root {{ web_root }};
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

这里{{ }}包裹的部分就是运行时替换的变量。
接着创建变量文件vars/websites.yml,为每台主机定义不同参数:

nginx_port: 80
server_name: "{{ inventory_hostname }}"
web_root: "/var/www/html"

如果不同服务器需要不同域名或端口,可以改用host_vars/目录,按主机名建文件,例如host_vars/192.168.1.10.yml,单独覆盖变量值。

编写Playbook并执行批量部署

新建deploy_nginx.yml:

- hosts: web
  become: yes
  vars_files:
    - vars/websites.yml
  tasks:
    - name: 确保Nginx已安装
      package:
        name: nginx
        state: present

    - name: 生成站点配置文件
      template:
        src: templates/nginx_site.conf.j2
        dest: /etc/nginx/conf.d/site.conf
        owner: root
        group: root
        mode: '0644'
      notify: reload nginx

    - name: 创建网站根目录
      file:
        path: "{{ web_root }}"
        state: directory
        mode: '0755'

  handlers:
    - name: reload nginx
      service:
        name: nginx
        state: reloaded

执行命令:

ansible-playbook -i inventory.ini deploy_nginx.yml

如果只想先看配置生成结果而不实际修改远程文件,可以加--check参数做预演。

验证部署结果与常见报错处理

部署完成后,登录任意一台目标机检查:

cat /etc/nginx/conf.d/site.conf
nginx -t
systemctl status nginx

nginx -t输出syntax is ok和test is successful表示配置语法正确,站点基本可用。

如果遇到报错,对照以下场景排查:

  • Destination directory /etc/nginx/conf.d does not exist:目标机未安装Nginx,检查package任务是否成功,或手动执行apt install nginx后重跑。
  • 模板变量未替换,配置里仍显示{{ nginx_port }}:检查变量文件路径是否正确、变量名拼写是否一致,Ansible默认区分大小写。
  • nginx -t报unknown directive:通常是模板中混入了不可见字符或语法错误,用cat -A查看文件,确认没有多余空格或换行符。
  • reload未触发:检查notify名称与handlers名称是否完全一致,只有文件内容发生变化时才会触发handler。

日常维护与扩展思路

当站点数量增加时,把变量集中到group_vars/web.yml统一管理,避免每台主机重复写。
新增服务器只需加入inventory.ini的[web]组,重新执行playbook即可自动生成配置。

如果需要为不同站点配置HTTPS证书,可以在模板中加入ssl_certificate等变量,把证书路径作为变量传入,同样能实现批量下发。

常见疑问:

模板文件必须放在templates目录吗? 不是强制,但Ansible默认会去playbook同级目录的templates/下查找,放在这里最省事。

能不能只对某一台服务器单独改配置? 可以,在host_vars/下新建以该主机IP或主机名为名的yml文件,写入需要覆盖的变量即可。

执行playbook需要root权限吗? 安装Nginx和写入/etc/nginx/目录通常需要,在playbook里加become: yes并确保SSH用户有sudo权限。

修改模板后如何只更新配置不重装Nginx? 直接重新执行playbook,package任务会检测状态跳过安装,template任务检测到文件变化后触发reload。

按本文步骤操作后,你应该能用Ansible模板批量生成Nginx配置并完成站点部署。
遇到异常时优先检查连通性、变量名和Nginx语法,再根据报错信息缩小范围。

分享到:
上一篇
Grafana网站监控面板模板,导入直接使用
下一篇
Shell脚本自动清理网站缓存,定时释放资源
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意