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

如何获取指定主机前置的Ansible主机列表供Bash脚本调用

实现目标

从Ansible inventory中提取空格分隔的主机列表,作为Bash脚本入参,调用格式为script.sh host_1 host_2 host_3 ...

具体要求

指定某台主机固定放在参数列表的首位,其余主机跟在后面,参考效果:script.sh host_2.example.de host_1.example.de host_3.example.de ...

现有inventory示例(inventory.ini)
[manager]
host_2.example.de

[utility_nodes]
host_1.example.de host_template=Utility1 
host_2.example.de host_template=Utility2 

[master_nodes] 
host_3.example.de host_template=Master1 
host_4.example.de host_template=Master2
可直接落地的实现方法

方法1:轻量命令行拼装(最简便)

不需要额外依赖,直接用ansible自带的list-hosts能力提取列表,拼装后调用脚本:

# 在这里修改你要放在首位的优先主机
PRIORITY_HOST="host_2.example.de"
# 提取主机列表:优先主机放第一位,后面拼接去重后排除优先主机的全量主机
ALL_HOSTS="$PRIORITY_HOST $(ansible all -i inventory.ini --list-hosts | grep -v 'hosts ([0-9]*):' | sed 's/^  //' | grep -v "^$PRIORITY_HOST$" | tr '\n' ' ')"
# 调用你的脚本
bash script.sh $ALL_HOSTS

使用说明:

  • -i inventory.ini 指定你的inventory文件路径,按实际部署路径修改即可
  • ansible自带的--list-hosts会自动对跨分组重复的主机去重,不需要额外处理重复传参问题
  • 过滤规则分别筛掉ansible输出的统计行、已经放在首位的优先主机,避免参数重复

方法2:结构化解析(稳定性更高)

如果担心ansible命令行输出格式随版本变化,可以用ansible-inventory输出结构化JSON,配合jq解析:

PRIORITY_HOST="host_2.example.de"
ALL_HOSTS="$PRIORITY_HOST $(ansible-inventory -i inventory.ini --list | jq -r '._meta.hostvars | keys[] | select(. != "'$PRIORITY_HOST'")' | tr '\n' ' ')"
bash script.sh $ALL_HOSTS

这个方法完全基于结构化数据解析,不会受命令行输出格式调整影响,适合生产环境使用。

校验方式

正式调用脚本前,可以先执行echo $ALL_HOSTS查看输出内容,确认第一个参数是指定的优先主机,其余主机无重复、无遗漏即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:54:21