Ansible 清单文件精通指南
Ansible inventory 从入门到进阶:INI/YAML 格式、主机分组、主机模式(通配/范围/交集)、主机变量与组变量层级、连接参数、复杂清单组织与验证测试。一篇讲透。
直接回答:清单(inventory)是 Ansible 的"机器台账"——INI 或 YAML 文件列出主机、分组与连接参数。进阶能力:主机模式(web*、db[1:3]、交集 :&)、变量层级(host 覆盖 group)、多文件目录化组织、ansible-inventory --list 验证解析结果。
基础形态
[webservers]
web1.example.com
web2.example.com ansible_host=192.168.1.12
[dbservers]
db[1:3].example.com # 范围展开为 db1 db2 db3
默认找 /etc/ansible/hosts,实际项目用 -i 指定自己的清单文件。
主机模式:选择目标的语言
ansible 'web*' -m ping # 通配
ansible 'webservers[0]' -m ping # 索引
ansible 'webservers:&production' -m ping # 交集:在 web 且在生产
ansible 'all:!dbservers' -m ping # 排除
playbook 的 hosts: 字段与命令行 --limit 都用这套模式语言。
变量层级
[webservers:vars]
http_port=8080
[production:children] # 组的组
webservers
dbservers
优先级:主机变量 > 组变量 > all 变量;同名就近覆盖。连接参数(ansible_user、ansible_ssh_private_key_file、ansible_become)也是变量,放对应层级。
复杂清单的组织
大项目用目录化清单:inventories/production/ 下放多个文件(hosts.yml、group_vars/、host_vars/)——Ansible 按 inventory 插件、文件扩展与忽略规则加载,并由变量插件处理 group_vars/host_vars,不是读取全部文件。静态文件之外还有动态清单插件(从云厂商 API 实时拉主机列表)。
验证与测试
ansible-inventory -i inventories/production --list # 看解析结果全貌
ansible-inventory -i inventories/production --graph # 看分组树
ansible all -i inventories/production -m ping # 连通性冒烟
清单改完先验证再跑 playbook——组名拼错的代价是"任务安静地没跑"。
常见问题(FAQ)
Q:INI 和 YAML 格式选哪个?
A:小清单 INI 更直观;变量层级深、结构复杂的项目用 YAML(与 playbook 语法一致,减少心智切换)。
Q:动态清单怎么用?
A:云厂商插件(aws_ec2、azure_rm 等)配置凭证后自动生成清单——主机随云伸缩自动进出清单,告别手动维护台账。
Q:同一主机在多个组里变量冲突怎么办?
A:同层级组通常按字母序合并(后者覆盖),父子组优先级与 ansible_group_priority 也会影响结果,不确定时用 ansible-inventory --host <name> 看该主机的最终变量集。
官方参考
本文依据官方文档整理,示例未在本文中进行运行验证。生产部署需按所用版本、权限和实际负载验证。