Aching Notes

技术笔记、折腾记录和长期项目整理

连通性拨测体系:ping、SSH、telnet 和失败清单

目标

拨测不是“能不能通”这么简单,而是要把问题分层:

  • 网络层通不通
  • 登录层通不通
  • 业务端口通不通
  • 哪一步失败了

只要分层清楚,后面的排障和重试才有意义。

最小可用版本

先把三层检查拆开,不要混在一起。

#!/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,可以换成 timeouttelnet,但脚本出口要统一,别写成每台机器一个版本。

我现在固定的状态字段

每台主机只保留几个字段就够了:

{
  "host": "node-01",
  "ping": "ok",
  "ssh": "fail",
  "port_22": "ok",
  "fail_stage": "ssh",
  "reason": "permission denied"
}

这样后面生成报表,不需要再重新解析整段终端输出。

失败清单怎么分

我把失败固定成四类:

  1. icmp 不通
  2. tcp 端口不通
  3. ssh 鉴权失败
  4. 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

这样后续要做趋势图、重试统计或者历史对比,才有数据可用。

这篇真正能写的点

这篇不是写“拨测很重要”,而是写:

  • 为什么要拆三层
  • 怎么定义失败
  • 怎么让结果能复用
  • 怎么让重跑不污染结果

这些才是实战里真正会反复碰到的东西。


已发布

分类

来自

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注