You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Ansible YML清单提取IP列表供Shell及外部脚本使用?

从Ansible YML Inventory提取IP列表的两种场景解决方案

场景1:提取全部IP列表供Shell脚本使用

Ansible自带的ansible-inventory工具可直接解析YML格式的inventory并输出结构化数据,结合JSON解析工具就能轻松提取IP。

方法1:使用jq(推荐,适合有jq的环境)

ansible-inventory输出JSON格式的inventory结构,用jq可精准提取主机的ansible_host字段(若主机名不是IP),若该字段不存在则 fallback 到主机名本身:

# 提取所有主机的IP并存储到Shell变量
IPS=$(ansible-inventory -i your_inventory.yml --list | jq -r '.all.hosts[] | .ansible_host // .')

# 遍历IP列表执行脚本逻辑
for IP in $IPS; do
    echo "Processing host: $IP"
    # 这里添加你的Shell操作,如ssh、文件同步等
done

方法2:使用Python(无jq环境时备选)

利用Python内置JSON模块解析输出,无需额外依赖:

IPS=$(ansible-inventory -i your_inventory.yml --list | python3 -c "
import json, sys
data = json.load(sys.stdin)
hosts = data['all']['hosts']
print('\n'.join([h.get('ansible_host', h) for h in hosts]))
")

场景2:按指定规则匹配提取IP列表

根据组名、变量值、主机名正则等规则筛选目标主机,同样基于ansible-inventory或ansible命令实现。

示例1:按组名筛选(如提取webservers组的IP)

WEB_IPS=$(ansible-inventory -i your_inventory.yml --list | jq -r '.webservers.hosts[] | .ansible_host // .')

示例2:按变量值筛选(如提取env=prod的主机)

PROD_IPS=$(ansible-inventory -i your_inventory.yml --list | jq -r '.all.hosts[] | select(.env == "prod") | .ansible_host // .')

示例3:按主机名正则匹配(如提取以db开头的主机)

DB_IPS=$(ansible-inventory -i your_inventory.yml --list | jq -r '.all.hosts[] | select(. | test("^db.*")) | .ansible_host // .')

备选:用ansible --list-hosts快速筛选

若只需主机名/IP列表,也可直接用ansible命令的--limit参数结合--list-hosts:

# 筛选env=prod的主机,去掉开头的计数行
PROD_IPS=$(ansible -i your_inventory.yml --limit 'env=prod' all --list-hosts | tail -n +2)

注意事项

  • 确保Ansible版本在2.4及以上(ansible-inventory命令从2.4版本开始引入)
  • 若inventory中主机未设置ansible_host,则默认使用主机名作为IP,请确保主机名可被正常解析

内容的提问来源于stack exchange,提问作者Elijah Lynn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:45:19