清单的两种来源
静态清单是一个文本文件,按组列出主机名或地址,适合变动少、结构清晰的环境,例如网络设备、固定服务器与本地测试机。动态清单则是在执行时获取主机信息:早期方式是编写可执行脚本,按约定返回 JSON;现在更常用清单插件,在配置文件中声明插件与查询条件,由 Ansible 自行调用云平台或虚拟化平台接口。两者都能同时指定,执行范围是它们的并集。
基本信息
| 静态清单 | INI 或 YAML 文件,内容固定 |
|---|---|
| 动态清单脚本 | 可执行程序,按约定输出 JSON |
| 清单插件 | 按配置文件查询平台接口获取主机 |
| 指定方式 | 执行时用参数指定清单文件或目录 |
选择依据
- 固定设备与网络设备:内容稳定,静态清单最直观、可评审。
- 弹性云主机:实例随扩缩容变化,用插件或脚本动态获取更可靠。
- 混合场景:静态文件保存分组与环境信息,动态来源补充弹性主机。
- 合规要求:需要人工评审目标范围时,静态清单或把动态结果导出评审更易留痕。
- 多环境隔离:按环境拆分清单文件或目录,避免一次误选跨环境执行。
- 变更频繁的资产系统:用插件直接对接,比手工维护文件更省力。
两种清单写法
两种清单写法
; 静态 INI 清单:组名加成员
[web]
web01.example.com
web02.example.com
[db]
db01.example.com
[prod:children] ; 组嵌套:把上面的组归入环境组
web
db动态清单插件配置
动态清单插件配置
# inventory/cloud.yml:声明插件与查询条件
plugin: aws_ec2 # 使用云平台清单插件
regions:
- cn-north-1
filters:
tag:Environment: prod # 只取生产标签的实例
keyed_groups:
- key: tags.Role # 按角色标签自动分组
prefix: role
# 需在 ansible.cfg 的 [inventory] 段启用对应插件两种来源对比
| 对比项 | 静态清单 | 动态清单 |
|---|---|---|
| 内容来源 | 文件内容 | 平台接口或资产系统 |
| 维护方式 | 人工编辑并评审 | 自动查询 |
| 弹性支持 | 需手工同步 | 随实例变化自动更新 |
| 可评审性 | 高,能直接查看 | 需导出结果查看 |
| 依赖 | 无额外依赖 | 依赖接口可用与凭据 |
| 失败表现 | 内容过时导致目标缺失 | 接口异常导致清单为空 |
动态清单接口异常时返回空列表,任务可能静默地「什么也没做」并报告成功。执行前应先查看实际选中的主机数量,数量为零时按失败处理。
执行前用清单查询命令确认范围:以树形结构查看分组与主机的层级关系,比直接看配置文件更容易发现意外纳入或遗漏的主机。