Ansible inventory主机清单管理
Ansible 管理服务器靠的就是 inventory 主机清单,它决定了你要操作哪些机器、怎么分组、用什么变量。
这篇教程从零开始,带你用 INI 和 YAML 两种写法配置主机清单,实现批量服务器分组,并给出验证命令和常见报错处理。
先理清 inventory 文件和目录结构
Ansible 默认读取 /etc/ansible/hosts,但推荐在项目目录下自建 inventory 文件,方便版本管理和迁移。
常用做法是创建 inventory/ 目录,里面放 hosts.ini 或 hosts.yml。
执行 ansible --version 可以看到当前配置的 inventory 路径。
如果自定义文件,运行时加 -i 参数指定,例如 ansible all -i inventory/hosts.ini -m ping。
关键点: 主机清单支持两种格式——INI 和 YAML,INI 简单直观适合新手,YAML 结构清晰适合复杂分组和变量。
用 INI 格式做基础分组
新建文件 inventory/hosts.ini,内容如下:
[web]
192.168.1.10
192.168.1.11
[db]
192.168.1.20 ansible_user=root
192.168.1.21
[all:vars]
ansible_ssh_private_key_file=/root/.ssh/id_rsa
方括号里是组名,组下面写主机 IP 或域名。
主机后面可以直接跟变量,比如 ansible_user=root 指定登录用户。[all:vars] 给所有主机设置通用变量,这里指定了 SSH 私钥路径。
验证分组:ansible web -i inventory/hosts.ini --list-hosts 会列出 web 组下的主机。
注意: 如果主机使用非标准 SSH 端口,写成 192.168.1.10:2222 或 ansible_port=2222。
嵌套分组与多级管理
当服务器数量多时,可以定义父组包含子组。
继续在 hosts.ini 中追加:
[web]
192.168.1.10
192.168.1.11
[db]
192.168.1.20
192.168.1.21
[app:children]
web
db
[app:vars]
ansible_python_interpreter=/usr/bin/python3
[app:children] 表示 app 组包含 web 和 db 两个子组。
这样执行 ansible app -i inventory/hosts.ini -m ping 就能同时操作所有 web 和 db 机器。
验证方法: 使用 ansible-inventory -i inventory/hosts.ini --graph 可以树状显示分组结构,确认嵌套关系是否正确。
改用 YAML 格式更清晰
如果觉得 INI 容易写错,可以换成 YAML 格式,新建 inventory/hosts.yml:
all:
children:
web:
hosts:
192.168.1.10:
192.168.1.11:
db:
hosts:
192.168.1.20:
ansible_user: root
192.168.1.21:
vars:
ansible_ssh_private_key_file: /root/.ssh/id_rsa
YAML 用缩进表示层级,children 下面放子组,hosts 下面放主机,主机后面可以跟变量字典。
运行命令时指定 -i inventory/hosts.yml 即可。
两种格式选择建议: 纯静态分组且机器少用 INI;
需要动态变量、多级嵌套或与脚本集成用 YAML。
批量操作前的连通性检查
配置好清单后,先用 ping 模块测试连通性:
ansible all -i inventory/hosts.ini -m ping
成功会返回 pong,失败会显示 SSH 连接错误。
常见报错 UNREACHABLE 通常是 IP 不通、SSH 密钥未配置或用户名错误。
检查 /etc/ansible/ansible.cfg 中 remote_user 和 private_key_file 是否设置正确。
如果只想测试某个组,把 all 换成组名,例如 ansible web -i inventory/hosts.ini -m ping。
避坑提醒: 不要直接修改默认的 /etc/ansible/hosts 而不做备份,建议项目内维护独立 inventory 文件,避免影响其他任务。
常见疑问
为什么 ansible all 报错找不到主机?
检查 inventory 文件路径是否正确,运行命令时是否加了 -i 参数。默认路径可能被 ansible.cfg 覆盖,用 ansible --version 查看实际配置。
主机变量和组变量冲突时哪个生效?
主机变量优先级高于组变量,组变量高于 all 组变量。可以用 ansible-inventory --host 192.168.1.10 查看某台主机的最终变量。
动态 inventory 和静态清单怎么选?
服务器数量少、IP 固定用静态清单;云环境或频繁扩缩容建议用动态 inventory 脚本对接 API。
能否在清单里写主机名而不是 IP?
可以,但需要确保控制节点的 DNS 或 /etc/hosts 能解析这些主机名,否则同样会连接失败。
按照上面的步骤配置好 inventory 主机清单和分组后,就可以用 ansible 或 ansible-playbook 批量操作服务器了。
先从 ping 测试开始,确认分组和变量都生效,再逐步编写更复杂的 playbook。