零基础用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连接,每次输密码很麻烦,所以先配置免密登录。

  1. 在控制端生成SSH密钥(如果已有可跳过):
   ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
  1. 将公钥复制到每台受控主机。假设受控主机的IP是192.168.1.101,用户名为pi:
   ssh-copy-id pi@192.168.1.101

输入一次密码后,以后就能免密登录。
重复此步骤添加所有主机。

  1. 测试连接是否成功:
   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

执行时你会看到每个任务的执行情况,绿色代表正常,黄色代表有变化,红色代表报错。

避坑指南:新手常见问题

  1. SSH连接超时或拒绝连接:检查受控主机的SSH服务是否运行,防火墙是否开放22端口。可以在控制端先 ssh 用户@IP 手动测试。
  2. become密码错误:如果受控用户需要密码才能sudo,需要在ansible.cfg中配置 ansible_become_password,但密码会暴露在文件里,安全做法是用 --ask-become-pass 参数运行时手动输入。
  3. 权限问题:Ansible默认使用当前用户SSH连接,如果该用户没有sudo权限,需要提前在受控主机上将该用户加入sudo组。例如 sudo usermod -aG sudo pi
  4. 主机清单IP写错或无法解析:建议先用 ansible -i hosts.ini home_servers -m ping 测试,报错信息会提示具体哪个主机连接失败。
  5. 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定期执行更新,让维护更省心。

分享到:
上一篇
灾难恢复演练验证服务器备份有效性:灾难恢复演练
下一篇
Jenkins CI/CD自动化发布跨境网站
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意