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