如何在嵌套for循环中使用ansible-playbook并解决inventory告警问题
问题原因
- 循环逻辑错误:你编写的嵌套内层循环完全多余。rebootlist存储的4个文件名本身就是符合要求的Ansible inventory清单,直接传给
-i参数即可。内层循环读取了每个清单文件里的服务器主机名,把单个主机名作为inventory文件路径传给Ansible,Ansible找不到对应名称的文件,就会判定inventory为空,触发告警。 - 补充注意:你提供的rebootlist内容里缺少reboot01文件,如果是遗漏需要补上,否则会漏处理对应100台服务器。
解决方案
方案1:简化循环(直接按批次执行)
删除多余的内层循环即可,示例脚本如下:
# 先定义日志输出路径,避免$output变量为空 output=./reboot_run.log for j in $(cat rebootlist); do ansible-playbook -i "$j" reboot.yml >> "$output" done
方案2:增加批次间隔(可选,避免业务受影响)
如果需要每批次重启后预留业务恢复时间,可增加等待逻辑:
output=./reboot_run.log # 每批次重启后等待180秒再执行下一批,可根据实际需求调整时长 wait_time=180 for j in $(cat rebootlist); do echo "===== 开始执行批次 $j 重启任务 =====" >> "$output" ansible-playbook -i "$j" reboot.yml >> "$output" echo "===== 批次 $j 执行完成,等待 ${wait_time}s 后执行下一批 =====" >> "$output" sleep $wait_time done
验证方法
执行以下命令验证inventory可被正常解析,输出对应100台主机即代表配置正确:ansible -i reboot00 all --list-hosts
内容的提问来源于stack exchange,提问作者Raal
相关产品推荐
相关产品推荐

