如何用Bash解析haproxy返回文件生成IP与对应服务器的关联字典
高效实现方案
1. 批量拉取所有节点数据(替代逐次SSH)
使用Ansible批量执行命令,一次性拉取所有haproxy节点的查询结果到本地汇总文件,仅需一次批量SSH握手,比逐节点请求效率提升数倍:
# 替换your_haproxy_query_cmd为你实际查询google_b后端的命令 ansible haproxy_nodes -m shell -a "your_haproxy_query_cmd" -o | awk -F'|' '{ gsub(/^[ \t]+|[ \t]+$/, "", $1); print $1; gsub(/^[ \t]+[0-9]+ >> /, "", $3); print $3 }' > haproxy_all_result.txt
该命令会自动生成你描述的标准格式文件,自动过滤额外状态信息。
2. 单步解析生成Bash关联数组
用awk直接解析汇总文件,一次性输出符合要求的字典定义,无需手动循环逐行插入:
# 解析文件并直接加载字典变量 eval "$(awk ' # 匹配haproxy节点名行,可根据实际节点名规则调整正则 /^haproxy-[0-9]+$/ { cur_node = $0 next } # 匹配google_b开头的有效IP记录 /^google_b / { ip = $2 ip_map[ip] = ip_map[ip] ? ip_map[ip]" "cur_node : cur_node } END { printf "declare -A haproxy_results=(" for (ip in ip_map) { printf " [\"%s\"]=\"%s\"", ip, ip_map[ip] } print " )" }' haproxy_all_result.txt)"
3. 结果验证
执行完成后可直接输出字典验证是否符合预期:
for ip in "${!haproxy_results[@]}"; do echo "IP: $ip 对应节点: ${haproxy_results[$ip]}" done
适配说明
- 自动跳过节点报错行(如
Can't find backend等非google_b开头的记录) - 天然支持单节点返回多IP的场景,每个IP会单独作为键存储对应节点
- 若节点名命名规则不是
haproxy-数字格式,只需调整awk第一处正则匹配规则即可
内容的提问来源于stack exchange,提问作者ben shalev
相关产品推荐
相关产品推荐

