ansible管理多台linux服务器的核心是“一次编写、处处生效”,依赖免密ssh连通性、inventory分组定义、模块精准操作和playbook流程固化;需先确保控制机与目标机ssh免密可达,再按角色分组编写inventory,显式指定python解释器,用copy/lineinfile/template等模块安全修改配置,最后通过带backup、tags和--check验证的playbook实现可重复、可验证的批量运维。

Ansible 管理多台 Linux 服务器配置,核心是“一次编写、处处生效”——靠免密 SSH 连通性打底,用 inventory 分组定义目标,借模块精准操作,最后用 playbook 把零散动作串成可复用、可验证的流程。
第一步:确保控制机与所有目标机 SSH 免密可达
这是硬前提,缺一不可:
- 在控制机运行 ssh-keygen -t rsa -b 4096 -N "" 生成无密码密钥
- 对每台目标机执行 ssh-copy-id user@192.168.1.10(替换为实际 IP 和用户)
- 手动验证:ssh user@192.168.1.10 不输密码能直接登录才算成功
- 若目标机禁用了密码登录,请确认其 /etc/ssh/sshd_config 中 PubkeyAuthentication yes 已启用,并重启 sshd
第二步:写清楚 inventory(主机清单),按需分组
清单不是 IP 列表,而是你“怎么看待这批机器”的逻辑表达:
- 新建文件如 ./inventory,内容示例:
web01 ansible_host=192.168.1.10 ansible_user=deploy
web02 ansible_host=192.168.1.11 ansible_user=deploy
[db]
db01 ansible_host=192.168.1.20 ansible_user=admin
[all:vars]
ansible_python_interpreter=/usr/bin/python3
- 组名(如 [web])用于后续命令定向,比如 ansible web -i ./inventory -m ping
- ansible_python_interpreter 必须显式指定,尤其在 CentOS 8+/Ubuntu 22.04 等默认无 /usr/bin/python 的系统上
- 跨网段或非标端口?直接在主机行加参数:db01 ansible_host=10.10.3.10 ansible_port=2222
第三步:用模块精准修改配置,避免手动覆盖
改配置不是“传个文件就完事”,关键在安全、可逆、可验证:
- copy 模块分发文件时加 backup: yes,自动保留原配置副本
- lineinfile 修改单行(如 PermitRootLogin no),靠正则匹配+备份,不破坏整份文件结构
- template 渲染 Jinja2 模板,让不同服务器自动填入自身变量(如 IP、角色名)
- user 和 group 模块统一建账号、设 sudo 权限,比手改 /etc/passwd 更可靠
第四步:用 Playbook 把操作固化成可重复流程
临时命令(ad-hoc)适合调试,批量配置必须靠 Playbook:
- 一个典型 playbook(nginx-config.yml)结构:
- hosts: web
become: yes
vars:
nginx_conf_path: /etc/nginx/conf.d/app.conf
tasks:
- name: Copy nginx config template
template:
src: templates/app.conf.j2
dest: "{{ nginx_conf_path }}"
backup: yes
- name: Reload nginx
systemd:
name: nginx
state: reloaded
- 加 tags 可选择性执行某段,例如只更新配置:ansible-playbook nginx-config.yml --tags copy
- 敏感值(如密码、token)不要硬编码,用 vars_prompt 交互输入,或 ansible-vault 加密
- 执行前先模拟:ansible-playbook nginx-config.yml --check,看哪些文件会变、哪些跳过











