家用住宅主机Linux Ansible批量管理多台住宅主机
为什么家用住宅主机需要 Ansible 批量管理
很多个人玩家在家里有好几台 Linux 设备,比如 NAS、下载机、远程办公机或家庭媒体服务器。
手动一台台更新、修改配置或者执行命令非常低效。
Ansible 正好解决这个问题:只需要一台主控机,就能通过 SSH 向所有被控机下发指令,而且不需要在被控机上装 agent。
本教程假设你的主控机(能运行 Ansible 的那台)和被控机(要管理的那几台)都在同一个家庭局域网内,
并且都已经装好了 Linux 系统(Ubuntu、
Debian、
CentOS 等均适用)。
准备工作:主控机与被控机的 SSH 连接
主控机上安装 Ansible
在 Debian/Ubuntu 系列:
sudo apt update && sudo apt install ansible -y
CentOS/RHEL 系列:
sudo yum install epel-release -y && sudo yum install ansible -y
安装完成后用 ansible --version 确认版本。
打通 SSH 免密登录
这是最关键的一步。
Ansible 默认通过 SSH 连接被控机,所以需要让主控机能直接 SSH 到每台被控机而不需要密码。
- 在主控机上生成密钥对(如果已经有了可跳过):
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
- 将公钥复制到每台被控机(将被控机 IP 或主机名替换为你的实际地址):
ssh-copy-id 用户名@被控机IP
例如:ssh-copy-id pi@192.168.1.101。
如果被控机没有默认开启密钥认证,可以先手动登录一次设置。
- 测试免密登录是否成功:
ssh pi@192.168.1.101 "hostname"
如果能直接返回主机名就 OK。
编写 Inventory 并执行第一条命令
创建 inventory 文件
在主控机上新建一个文件(比如 hosts.ini),列出所有要被管理的设备:
[home_servers]
# 建议用家用设备的内网 IP,避免 DDNS 变动影响
192.168.1.101 ansible_user=pi
192.168.1.102 ansible_user=user2
# 也可以给主机起别名便于记忆
# nas ansible_host=192.168.1.101 ansible_user=pi
测试 Ansible 连通性
执行以下命令,Ansible 会用 ping 模块检测所有主机是否在线(注意不是 ICMP ping,而是 SSH 连通性测试):
ansible all -i hosts.ini -m ping
如果返回绿色 "pong" 表示成功。
批量执行命令
现在就能用 Ansible 对多台设备同时执行命令了。
比如查看所有被控机的 uptime:
ansible all -i hosts.ini -m shell -a "uptime"
更常见的场景是批量更新系统:
ansible all -i hosts.ini -m apt -a "upgrade=yes update_cache=yes" -b
-b表示使用 sudo 提权。如果被控机普通用户没有 sudo 免密码权限,需要先在每台被控机上配置sudo visudo,添加一行:pi ALL=(ALL) NOPASSWD:ALL。
避坑指南(家用场景特别容易踩的坑)
- 被控机 IP 经常变化:家用路由器的 DHCP 租约短,建议在路由器里给每台设备绑定静态 IP,或者在 hosts.ini 里用 Mac 地址对应的固定 IP。
- SSH 端口非默认:如果你改了 SSH 端口,需要在 inventory 里加上
ansible_port=2222。 - host key checking 报错:第一次连接会出现
The authenticity of host...的确认提示。可以在ansible.cfg里关闭首次连接检查:
[defaults]
host_key_checking = False
注意:生产环境建议保持检查,家用内部网络可酌情关闭。
- 普通用户 sudo 无密码:Ansible 使用
-b时默认会尝试用当前用户 sudo。如果提示需要密码,要么配置 NOPASSWD,要么改用--ask-become-pass每次输入密码(不推荐批量)。 - Python 版本不一致:如果被控机是旧系统(如 CentOS 6),可能默认 Python2,而本机 Ansible 要求 Python3。可以在 inventory 里指定
ansible_python_interpreter=/usr/bin/python3。
常见问题解答
Q:我只有一台设备,还用学 Ansible 吗?
可以先用官网的 playbook 模版练手,未来设备多了直接上手。
Q:被控机没有公网 IP,能不能用 Ansible 管理?
完全可以,家用局域网内操作不限公网。如果需要外网管理,给主控机配置 DDNS 并做好安全组限制即可。
Q:执行 playbook 时返回 "UNREACHABLE" 怎么办?
检查被控机是否开机、网络是否连通、SSH 端口是否开放,以及密钥是否复制成功。
效果验证与进阶
执行 ansible all -i hosts.ini -m shell -a "free -h" 查看所有主机的内存状况。
如果顺利,你会看到每个被控机的输出结果。
至此,你已经实现了家用住宅主机的 Ansible 批量管理。
下一步可以尝试编写简单的 playbook(YAML 文件)实现自动部署 Docker、修改 NTP 配置等操作。
如果你在搭建家庭服务器时遇到问题,欢迎继续翻看本站其他教程,比如《家庭 NAS 的 Ansible 一键部署》等相关内容。