目标
拨测不是“能不能通”这么简单,而是要把问题分层:
- 网络层通不通
- 登录层通不通
- 业务端口通不通
- 哪一步失败了
只要分层清楚,后面的排障和重试才有意义。
最小可用版本
先把三层检查拆开,不要混在一起。
#!/usr/bin/env bash
set -euo pipefail
host="$1"
ping -c 1 -W 1 "$host" >/dev/null
nc -z -w 2 "$host" 22
ssh -o BatchMode=yes -o ConnectTimeout=5 "$host" 'true'
如果环境里没有 nc,可以换成 timeout 包 telnet,但脚本出口要统一,别写成每台机器一个版本。
我现在固定的状态字段
每台主机只保留几个字段就够了:
{
"host": "node-01",
"ping": "ok",
"ssh": "fail",
"port_22": "ok",
"fail_stage": "ssh",
"reason": "permission denied"
}
这样后面生成报表,不需要再重新解析整段终端输出。
失败清单怎么分
我把失败固定成四类:
icmp不通tcp端口不通ssh鉴权失败ssh超时或拒绝
case "$fail_stage" in
icmp) retry="yes" ;;
tcp) retry="yes" ;;
ssh) retry="no" ;;
esac
这个分类决定了是否重试,也决定了后续谁来处理。
报告怎么出
我会同时出两份:
- JSON 给脚本接
- Markdown 给人看
| 主机 | 阶段 | 结果 | 备注 |
| --- | --- | --- | --- |
| node-01 | ssh | fail | permission denied |
| node-02 | port-22 | fail | timeout |
Markdown 只展示失败项和汇总,不要把所有命令原样贴上去。
定时跑的时候怎么收口
定时任务至少要落三份东西:
- 原始结果
- 汇总结果
- 失败清单
mkdir -p /var/log/probe/$(date +%F)
./probe.sh hosts.txt > /var/log/probe/$(date +%F)/summary.json
./render_report.py /var/log/probe/$(date +%F)/summary.json > /var/log/probe/$(date +%F)/report.md
这样后续要做趋势图、重试统计或者历史对比,才有数据可用。
这篇真正能写的点
这篇不是写“拨测很重要”,而是写:
- 为什么要拆三层
- 怎么定义失败
- 怎么让结果能复用
- 怎么让重跑不污染结果
这些才是实战里真正会反复碰到的东西。
发表回复