Ansible 到底会操作哪台机器:先查 inventory 和 limit
用 inventory graph 与 list-hosts 检查主机模式,再理解交集、排除和 limit。避免把连通性测试、动态清单与实际维护范围混在一起。
文章目录
准备只改测试机,执行输出却出现生产主机。先别让剧本继续跑。Ansible 的实际目标由 inventory、剧本 hosts 和命令行 --limit 一起决定,连接地址也可能与清单里显示的名字不同。
把清单看成可检查的数据
下面是一份最小 INI 清单,地址是文档示例地址,执行前要换成自己有权限管理的机器:
[web]
web-test ansible_host=192.0.2.10
web-prod ansible_host=192.0.2.11
[test]
web-test
web-test 是 inventory 名称,ansible_host 是连接地址。对一个名称设 limit 时,用的是 inventory 里的名字或组模式,不能默认拿 IP 就能匹配这个别名。
先查看组结构与某台机器的变量:
ansible-inventory -i inventory.ini --graph
ansible-inventory -i inventory.ini --host web-test
ansible-playbook -i inventory.ini site.yml --list-hosts
主机变量可能包含敏感值,输出不要直接贴进公开工单。动态清单尤其要确认来自哪个配置文件,以及当前账户、地域或标签条件。上周保存的清单图不能代替今天的实际目标。
hosts 与 limit 是一起筛选
假设剧本用 hosts: web。--limit test 会把目标缩小到同时属于 web 和 test 的主机,而不是额外把 test 组全部加入。预览:
ansible-playbook -i inventory.ini site.yml \
--limit test --list-hosts
命令显示的名字应该符合预期,再检查它们的 ansible_host。主机模式还支持并集、交集和排除,例如:
ansible 'web:&test' -i inventory.ini --list-hosts
ansible 'web:!web-prod' -i inventory.ini --list-hosts
给模式加引号,避免 shell 解释特殊字符。多组模式的处理顺序不能简单按字符串从左到右猜,复杂范围先打印主机列表确认。若输出为空,先修正筛选;不要为了“让命令跑起来”立即改成 all。
连通性与变更范围分别验证
确认目标之后,必要时对同一小范围做连接检查。Ansible 的 ping 模块验证连接与适用环境,不是普通 ICMP ping,也不证明业务服务健康。
首次变更尽量使用单台测试机,保存执行所用的 inventory、变量和剧本版本。--limit 不能替代阅读 delegate_to、本地任务或外部 API 调用;这些动作可能访问其他目标。剧本执行范围也要看任务本身。
完成后检查实际被修改的机器,而不只看 recap 的 changed 数量。选错目标的维护记录应明确标出,不能靠后续成功把错误范围掩盖掉。
主机模式规则见 Ansible patterns 文档,清单检查命令见 ansible-inventory 文档。











