首页/系统与基础设施/自动化运维速查/Ansible 动态清单脚本的编写要点
Ansible 核心70 条

Ansible 动态清单脚本的编写要点

动态清单脚本是一个可执行程序,Ansible 调用它获取主机信息:必须支持列出全部主机并输出规定的 JSON 结构,可选支持查询单台主机信息,同时要处理好凭据、超时、缓存与错误。编写要点是把平台差异封装在脚本内、失败时不要返回空清单冒充成功,并为查询结果加分组标签便于执行时选取。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​‌​​​‌‌‌‌​​‌​‌‌​‌‌‌​​‌‌​​​​‌​‌‌​‌‌​‌​‌‌​‌​​‌​‌‌​​​‌‌​​‌​‌‌​‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌‌​‌‌​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌‌‌​​‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌‌​​​​​‌‌‌​‌​​​​‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌​​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

脚本需要做什么

Ansible 调用动态清单脚本时,会以列出参数请求全部主机信息,脚本需输出一个 JSON 对象:顶层是各个分组,每组有主机列表,可选提供主机变量;同时可以通过一个保留键集中携带全部主机变量,避免逐台再调用。若脚本支持单台查询,Ansible 在需要某台主机变量时会再调用一次,但现在更推荐用集中携带的方式一次返回,减少调用次数。

基本信息

调用方式由 Ansible 以可执行程序调用
必需能力支持列出参数并输出规定 JSON
可选能力支持单主机查询参数
返回结构分组映射加可选的集中主机变量

编写要点

  • 输出结构正确:分组名映射到主机与主机变量,结构错误会导致清单为空。
  • 集中返回变量:用保留键一次携带全部主机变量,减少调用次数。
  • 错误显式失败:接口异常时以非零状态退出,不要返回空清单。
  • 凭据外部注入:从环境变量或密钥系统读取,不写死在脚本里。
  • 设置超时与重试:对外接口查询要有超时,避免执行长时间挂起。
  • 加分组标签:按环境、角色、区域生成分组,便于执行时精确选取。
  • 自行校验:用清单查询命令查看结果,确认分组与主机符合预期。

最小可用脚本骨架

最小可用脚本骨架
#!/usr/bin/env bash
# 动态清单脚本:列出全部主机并集中返回变量
set -euo pipefail

hosts=$(query_platform_hosts) || {
  echo '查询平台失败' >&2   # 错误写到标准错误
exit 1                  # 非零退出,避免空清单被当成成功
}

printf '{"_meta": {"hostvars": %s}, "all": {"children": ["prod"]}, "prod": {"hosts": %s}}\n' \
  "${hosts}" "${hosts}"   # 结构:集中变量 + 分组

常见问题与判读

现象原因处置
清单为空但任务成功脚本出错返回空结构出错时非零退出并检查返回码
执行慢逐台查询主机变量用集中返回方式一次提供
凭据失效写死或过期未轮换改为外部注入并做有效性检查
分组缺失脚本未生成标签分组按平台标签生成分组
结果与平台不一致本地缓存未失效设置合理缓存时长
权限拒绝脚本不可执行或解释器路径错误确认执行位与解释器路径
脚本返回空清单是最危险的失败方式:任务照常执行并报告成功,实际什么都没做。宁可让脚本显式失败,也不要返回空结构。
查询结果建议加缓存并设定有效时长:大规模环境每次执行都全量查询平台接口,既慢又可能触发接口限流。

易错点

  • 接口异常返回空清单:任务静默无操作并报告成功,覆盖结果被误认为已完成
  • 凭据写死在脚本里:脚本入库后凭据扩散,轮换时还要逐个分发修改
  • 逐台查询主机变量:主机数量大时调用次数成倍增加,执行时间被查询拖长
  • 脚本无执行权限或解释器路径错误:Ansible 调用失败,排查时容易误判为平台接口故障

数据来源与参考

  • Ansible 官方文档:动态清单脚本开发说明
  • Ansible 官方文档:清单插件开发与 _meta 结构
  • Ansible 官方文档:ansible-inventory 校验清单

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/dynamic-inventory-script-authoring.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​‌​​​‌‌‌‌​​‌​‌‌​‌‌‌​​‌‌​​​​‌​‌‌​‌‌​‌​‌‌​‌​​‌​‌‌​​​‌‌​​‌​‌‌​‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌‌​‌‌​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌‌‌​​‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌‌​​​​​‌‌‌​‌​​​​‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌​​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​