零基础用Ansible批量管理多台住宅Linux主机
零基础用Ansible批量管理多台住宅Linux主机
家里有好几台树莓派、旧电脑或NAS,每次都要一台一台SSH进去敲命令,不仅效率低还容易忘配置。Ansible 就能帮你一次性在所有机器上执行相同的操作,而且不需要在客户端安装代理,完全基于SSH。
这篇文章会一步步教你从零开始搭建Ansible管理环境,并批量操作住宅里的Linux主机。
准备工作:你需要什么
在开始之前,先确认你的环境满足这些条件:
- 控制端:一台长期开机的电脑(可以是你的主力机器或一台小型服务器),系统建议Ubuntu 20.04+/Debian 11+,也可以是macOS或Windows(WSL)。本文以Ubuntu为例。
- 受控主机:所有你想管理的住宅Linux主机(例如运行Debian的树莓派、Ubuntu Server的NAS等)。它们需要开启SSH服务并可以网络互通。
- 网络:控制端能通过SSH(默认端口22)连接到每台受控主机。如果在同一个局域网内最简单;如果涉及外网,需要做好端口转发和防火墙放行。
- 用户权限:控制端使用普通用户,但需要sudo权限安装软件;受控主机建议使用同一普通用户,并允许sudo执行命令。
在控制端安装Ansible
Ansible的安装非常简单,一条命令即可:
sudo apt update
sudo apt install ansible -y
安装完成后检查版本:
ansible --version
如果看到版本号(比如2.9或更高),说明安装成功。
注意:住宅场景不需要安装额外的数据库或服务端,Ansible是纯命令行工具。
配置SSH免密登录
Ansible管理主机时依赖SSH连接,每次输密码很麻烦,所以先配置免密登录。
- 在控制端生成SSH密钥(如果已有可跳过):
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
- 将公钥复制到每台受控主机。假设受控主机的IP是192.168.1.101,用户名为pi:
ssh-copy-id pi@192.168.1.101
输入一次密码后,以后就能免密登录。
重复此步骤添加所有主机。
- 测试连接是否成功:
ssh pi@192.168.1.101
能直接登录说明免密配置成功。
编写主机清单(Inventory)
Ansible通过一个主机清单文件来知道要管理哪些机器。
新建一个文本文件(例如hosts.ini),内容如下:
[home_servers]
192.168.1.101 ansible_user=pi
192.168.1.102 ansible_user=ubuntu
192.168.1.103 ansible_user=pi
[home_servers]是组名,你可以自定义,后面会用这个组名来批量操作。- 每行一个IP或域名,
ansible_user指定登录用户名。 - 如果所有主机用户名相同,可以统一在组定义上面加:
[home_servers:vars]段,但直接写在行尾更清晰。
执行批量命令——第一个Ad-hoc操作
先运行最简单的模块 ping 来验证所有主机是否可达:
ansible -i hosts.ini home_servers -m ping
如果返回每台主机的 "pong" ,说明通信正常,Ansible可以工作了!
再来一个真正的批量操作:给所有主机安装 htop:
ansible -i hosts.ini home_servers -m apt -a "name=htop state=present" --become
-m apt调用apt模块管理软件包。-a "..."传递模块参数:安装htop。--become表示提权(sudo),因为安装软件需要管理员权限。
命令会逐台执行,最终显示每台的成功或失败信息。
编写Playbook实现更复杂的批量任务
Ad-hoc适合简单操作,日常管理建议写成Playbook(YAML文件),可重复执行且逻辑清晰。
创建一个文件 playbook.yml:
---
- name: 批量更新系统并安装常用工具
hosts: home_servers
become: yes
tasks:
- name: 更新apt缓存
apt:
update_cache: yes
cache_valid_time: 3600
- name: 升级所有软件包
apt:
upgrade: dist
- name: 安装必要工具
apt:
name:
- htop
- vim
- curl
state: present
- name: 检查磁盘使用率
command: df -h / | tail -1
register: disk_usage
- name: 显示磁盘信息
debug:
msg: "{{ disk_usage.stdout }}"
执行Playbook:
ansible-playbook -i hosts.ini playbook.yml
执行时你会看到每个任务的执行情况,绿色代表正常,黄色代表有变化,红色代表报错。
避坑指南:新手常见问题
- SSH连接超时或拒绝连接:检查受控主机的SSH服务是否运行,防火墙是否开放22端口。可以在控制端先
ssh 用户@IP手动测试。 - become密码错误:如果受控用户需要密码才能sudo,需要在
ansible.cfg中配置ansible_become_password,但密码会暴露在文件里,安全做法是用--ask-become-pass参数运行时手动输入。 - 权限问题:Ansible默认使用当前用户SSH连接,如果该用户没有sudo权限,需要提前在受控主机上将该用户加入sudo组。例如
sudo usermod -aG sudo pi。 - 主机清单IP写错或无法解析:建议先用
ansible -i hosts.ini home_servers -m ping测试,报错信息会提示具体哪个主机连接失败。 - Python版本不一致:较老的Linux发行版可能默认Python版本是2.x,而Ansible需要Python3。可以在受控主机上安装
python3并用ansible_python_interpreter=/usr/bin/python3指定。
效果验证:如何确认批量操作成功
- 对于
ping模块:所有主机返回绿色的pong即成功。 - 对于软件安装:进入任意一台受控主机,运行
htop,如果正常启动,说明批量安装生效。 - 对于Playbook:执行后查看每个任务的返回状态,没有红色报错就是成功。也可以登录主机检查文件或服务。
如果有多台主机,
可以在控制端使用 ansible -i hosts.ini home_servers -m shell -a "uptime" 一次查看所有主机的运行时长,
这是最直观的批量验证方法。
常见问题FAQ
问:受控主机是否需要安装Ansible?
答:不需要,Ansible基于SSH和Python。但受控主机需要安装Python 3(大部分现代Linux自带)。
问:住宅网络动态IP怎么办?
答:可以用主机名(如果本地DNS解析或通过路由器分配固定私有IP),或使用 ansible_host 变量指定动态更新的域名。
问:能否批量复制文件到多台主机?
答:可以,使用 copy 模块:ansible -i hosts.ini home_servers -m copy -a "src=/path/to/local/file dest=/path/to/remote"。
写在最后
通过Ansible批量管理多台住宅Linux主机,能节省大量重复操作的时间。
从基础安装、免密登录、编写主机清单到Playbook实战,按照本文步骤走下来,你已经可以自动化管理家里的服务器了。
如果遇到报错,先回到避坑部分检查最可能的问题点。
熟练掌握后,还可以配置cron任务让Ansible定期执行更新,让维护更省心。