Ansible批量管理服务器,批量推送网站配置
Ansible 批量管理服务器的核心思路是:把要操作的机器写进主机清单,用一个 YAML 格式的 Playbook 描述“先传文件、再校验、通过后重载服务”,然后一条命令并发执行到所有节点。
本文面向零基础运维,带你完成批量推送网站配置的全过程,最终能在多台服务器上同步 Nginx 站点配置,并用 nginx -t 和访问测试确认生效。
准备条件与目录规划
控制端需要能通过 SSH 免密登录被管理服务器,且目标机已安装 Nginx、Python 可用。
建议先约定一个清晰的控制端目录,避免文件散落:
mkdir -p /opt/ansible/site-config/{inventory,playbooks,templates}
inventory/hosts:主机清单,记录服务器 IP 和分组。playbooks/:存放 Playbook 文件。templates/:存放网站配置模板。
验证免密登录是否可用:
ssh root@192.168.1.11 "hostname"
能直接返回主机名说明免密正常;
如果提示输入密码,先执行 ssh-copy-id root@192.168.1.11 把公钥推过去。
编写主机清单和网站配置模板
编辑 inventory/hosts,用分组管理不同环境的机器:
[web]
192.168.1.11
192.168.1.12
如果 SSH 端口不是 22 或用户不是 root,写成 192.168.1.11 ansible_port=2222 ansible_user=deploy。
在 templates/site.conf.j2 中放一份 Nginx 站点模板,变量 server_name 和 root 由 Playbook 传入:
server {
listen 80;
server_name {{ server_name }};
root {{ web_root }};
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
模板里用双花括号表示变量,所有机器会得到同一份结构、按变量渲染出的配置,避免手工逐台修改。
用 Playbook 批量推送并重载
新建 playbooks/push-site.yml,关键动作是复制配置、校验语法、仅在通过时重载:
- hosts: web
become: yes
vars:
server_name: www.example.cn
web_root: /var/www/html
tasks:
- name: 推送站点配置
template:
src: ../templates/site.conf.j2
dest: /etc/nginx/conf.d/site.conf
owner: root
group: root
mode: "0644"
notify: reload nginx
- name: 校验 Nginx 配置语法
command: nginx -t
register: nginx_check
changed_when: false
failed_when: nginx_check.rc != 0
handlers:
- name: reload nginx
service:
name: nginx
state: reloaded
执行前先做一次空跑检查:
cd /opt/ansible/site-config
ansible-playbook -i inventory/hosts playbooks/push-site.yml --check
确认没有报错后再正式执行:
ansible-playbook -i inventory/hosts playbooks/push-site.yml
校验不通过时不要重载:nginx -t 返回非 0 会让任务失败,从而阻止错误配置上线。
这是批量操作里最值得保留的一道保险。
避坑与常见报错
- 权限不足:目标机用普通用户登录时,
become: yes需要该用户能 sudo,否则会报权限错误。 - 模板路径写错:
src相对路径以 Playbook 所在目录为基准,写错会提示文件不存在。 - 配置被覆盖:如果目标机原本有同名文件,
template会直接覆盖,建议先确认文件名唯一,或先用--check观察变化。 - 重载未触发:只有文件内容真正变化时
notify才会触发 handler,内容没变就不重载属于正常行为。 - SSH 连接超时:检查目标机防火墙是否放行控制端 IP,以及 22 端口是否可达。
验证结果与适用场景
推送完成后,逐台确认配置和访问效果:
ansible -i inventory/hosts web -m shell -a "nginx -t && systemctl is-active nginx"
预期输出每台都显示语法测试成功和 active。
再用 curl -I http://192.168.1.11 检查返回状态码。
判断是否适合用 Ansible 批量管理:服务器数量在几台到几十台、配置结构基本一致、需要频繁同步时收益明显;
如果只有单台机器或配置差异极大,手工维护反而更省事。
需要注意,不同发行版和 Nginx 安装方式的配置目录可能不同,比如部分环境使用 /etc/nginx/sites-available/,建议以目标机实际路径为准。
可以只推送不重载吗
可以。
去掉 notify: reload nginx 和 handlers 部分即可,配置会更新但服务保持原状,适合先灰度观察的场景。
推送失败怎么定位到具体哪台机器
Playbook 输出里会标出失败主机名和错误任务,也可以用 ansible -i inventory/hosts web -m ping 先确认哪些机器连通性有问题。
变量怎么按机器区分
在主机清单里为每台机器设置独立变量,或在 host_vars/ 目录下按 IP 建文件,Playbook 会自动读取,适合不同站点绑定不同域名的情况。