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语法,再根据报错信息缩小范围。