跳转至

SOP —— 日志纳管扩面(1b 步骤 2/3):deb 系主机 + 网络设备日志

变更主题:把 dell-R620(Ubuntu 24.04,KVM 宿主) 与 OpenWrt(.2) 的日志纳入 EFK 执行时间:2026-10-02 02:00–02:10(CST)|执行方:工程 monitoring-p2-20261001 关联:docs/SOP-platform-labels.md 附录 A(纳管扩面 1b 的步骤 1 = Harbor)、 主 SOP docs/SOP.md(EFK 首次搭建)、docs/LOGGING-GAP.md(能力差距清单)

1. 背景

集群外日志采集此前只覆盖 RPM 系(Rocky 9)主机:包管理与预检查都按 rpm/dnf 写死。 剩下两类日志源因此落在体系外:

  • dell-R620:Ubuntu 24.04(deb 系),是 KVM 宿主(承载 k8s/slurm/lustre/lsf 全部虚机), 本身却没有日志入 EFK;
  • OpenWrt(.2):公网链路入口设备(frpc),无包体系、装不了 Filebeat,日志只在本机内存 环形缓冲(/root/syslog.log),重启即丢。

2. 目标

  1. dell-R620 的 filebeat 由工程幂等管理(安装/配置/服务/自监控四项均达期望态), 日志以 platform=physical 入库;
  2. OpenWrt 的 logd 日志经宿主 rsyslog 落盘并由宿主 Filebeat 采集,以 platform=network 入库;
  3. 既有 14 台 RPM 主机的渲染结果逐字节不变(不得因本次改动触发无谓重启与日志断流);
  4. 连续执行两次,第二次零变更。

3. 前置条件

项 要求 落地检查
执行身份 工程以 root 经 SSH 操作目标机 dell 的 root 免密原本不可用,需先追加公钥(步骤 1)
制品来源 artifacts.elastic.co 的 .deb 可达 curl -sI <deb_url> 返回 200(实测 200)
宿主 node_exporter 已运行且开了 textfile collector systemctl is-active prometheus-node-exporter;--collector.textfile.directory=/opt/node-exporter/textfile
OpenWrt 登录 root 免密 ssh 可用 ssh root@192.168.31.2 'uci -q get system.@system[0].log_ip'
宿主 rsyslog 在运行(本机是 KVM 宿主,改它需谨慎) systemctl is-active rsyslog;改前先备份片段、rsyslogd -N1 语法校验
端口 514/udp 未被占用 ss -lunH \| awk '{print $4}' \| grep -E '[:.]514$'

4. 影响范围

对象 变更 是否停服
dell-R620(192.168.31.249 / .250) 新装 Filebeat 8.19.0(deb)+ 配置 + 自监控 timer 否
dell-R620 的 rsyslog 新增片段 /etc/rsyslog.d/30-remote-input.conf(imudp 514) 否(reload;内置语法门禁与失败回滚)
OpenWrt(192.168.31.2) uci 设置 logd 转发到 .249(UDP),重启 logd logd 重启会清空其内存缓冲(可接受)
既有 15 台 RPM 主机(含 Harbor) 自监控脚本内容更新一次(不重启 Filebeat);unit/配置/服务均无变化 否
集群内 K8s 资源 本轮无变化 否

窗口:无常驻作业依赖;dell-R620 是宿主,其 rsyslog 变更做了语法校验与失败回滚。

5. 分步操作

步骤 1:给宿主 root 追加免密公钥(前置,一次性)

工程远端执行器固定以 root 连接,而 dell-R620 的 root 此前无免密公钥 (ssh root@192.168.31.249 实测 Permission denied (publickey,password))。 追加的是既有 14 台在用的同一把公钥,口径因此与集群外其它主机一致。

注意:改的是 root 的授权文件,先备份;已存在则跳过(幂等)。

# 备份原文件(存在时)
sudo -n cp -p /root/.ssh/authorized_keys \
  backup/onboard-deb-20261002/root-ssh/authorized_keys.bak.$(date +%Y%m%d-%H%M%S)
# 幂等追加(已在则 grep -q 命中,不重复写)
sudo -n install -d -m 700 -o root -g root /root/.ssh
grep -qF "$(cat ~/.ssh/id_ed25519.pub)" /root/.ssh/authorized_keys 2>/dev/null || \
  cat ~/.ssh/id_ed25519.pub | sudo -n tee -a /root/.ssh/authorized_keys >/dev/null
sudo -n chmod 600 /root/.ssh/authorized_keys; sudo -n chown root:root /root/.ssh/authorized_keys
# 验证
ssh -o BatchMode=yes root@192.168.31.249 'hostname; id -un'   # 预期 dell-R620 / root

预期:返回 dell-R620 与 root。失败判断:仍 Permission denied → 检查 PermitRootLogin 与公钥路径。

步骤 2:配置与实现体的 deb 适配(工程侧)

改动集中在四处:配置声明 OS 族与制品、包管理按族分派、预检查按族校验 OS 主版本、 自监控输出目录按族注入。

# 配置(config/default.yaml)
#   nodes.dell_r620 = [{host: 192.168.31.249, name: dell-r620, role: kvm-host, os_family: deb}]
#   platforms.dell_r620 = physical
#   filebeat.deb_url  = https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.19.0-amd64.deb
#   filebeat.textfile_dir = {rpm: /var/lib/node_exporter/textfile, deb: /opt/node-exporter/textfile}
#   precheck.expected_os_major_deb = "24"
# 实现体:modules/host_filebeat.py(probe_pkg / _install_pkg 按 family 分派;_family / _textfile_dir)
# 预检查:utils/precheck.py(_check_hosts 按 os_family 选期望主版本;_check_artifact 校验两种制品)
# 采集脚本:artifacts/collectors/filebeat_metrics.py(OUT 改为读 TEXTFILE_DIR,默认值不变)

注意(三个已踩的坑):

  1. apt-get install <URL> 在本环境不可用 —— 实测报 「E: 无法定位软件包 https://…/beats/filebeat」(rc=100,apt 对 URL 中的连字符解析异常)。 改为 curl -fsSL -o /tmp/filebeat-8.19.0-amd64.deb <url> && dpkg -i …。
  2. 安装命令不得接管道 —— cmd | tail -3 的返回码是 tail 的 0,安装失败会被判成成功 (首次部署即因此误判,直到写配置时报「/etc/filebeat 不存在」才暴露)。 统一改为「重定向到日志 → 取 rc → tail → exit $rc」,rpm 分支同类问题一并纠正。
  3. 模板中门控段的注释必须写在标记对内 —— _strip_block() 只剥离 begin/end 之间; 注释若留在标记外,会让全部 20 个节点渲染结果变化,触发 15 台无谓的配置重下发与 Filebeat 重启。回归判据见步骤 6。

步骤 3:预检查(只读门禁)

PYTHONPATH="$HOME/py_public_modules" .venv/bin/python main.py precheck

预期:无 BLOCK 项;日志出现 集群外主机 SSH -> 16 台全部可达; dell 的 OS=24.04 与 expected_os_major_deb=24 匹配(改动前此处会因 expected_os_major=9 而 BLOCK)。

步骤 4:dry-run 预演(必须实测零改动)

PYTHONPATH="$HOME/py_public_modules" .venv/bin/python main.py deploy --dry-run
# 零改动实测(别只看代码推断)
ls -d /etc/filebeat /etc/rsyslog.d/30-remote-input.conf /var/log/remote   # 三者均应「不存在」
dpkg-query -W -f='${Status}\n' filebeat                                  # 预期「没有找到…软件包」
ssh root@192.168.31.2 'uci -q get system.@system[0].log_ip || echo UNSET' # 预期 UNSET

步骤 5:正式下发

PYTHONPATH="$HOME/py_public_modules" .venv/bin/python main.py deploy

等价底层动作(dell-R620,工程内由 HostFilebeat.converge_one 完成):

# ① 安装(deb 分支,离线制品缺失时回落在线)
curl -fsSL -o /tmp/filebeat-8.19.0-amd64.deb \
  https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.19.0-amd64.deb
dpkg -i /tmp/filebeat-8.19.0-amd64.deb
# ② 配置(0600 下发;含 host-network-log 段,因 role=kvm-host)
install -m 0600 -o root -g root <渲染结果> /etc/filebeat/filebeat.yml
# ③ 服务
systemctl enable filebeat; systemctl restart filebeat; systemctl is-active filebeat
# ④ 自监控(脚本 0755 + unit 0644 + timer;deb 节点 unit 多一行 TEXTFILE_DIR)
install -m 0755 -o root -g root artifacts/collectors/filebeat_metrics.py /usr/local/bin/env-filebeat-metrics
# ⑤ 接收端 rsyslog(幂等:sha256 一致且 514 在监听即跳过)
rsyslogd -N1                       # 语法门禁,非 0 即回滚片段
systemctl reload-or-restart rsyslog
# ⑥ 转发端 OpenWrt
ssh root@192.168.31.2 "uci set system.@system[0].log_ip='192.168.31.249'; \
  uci set system.@system[0].log_proto='udp'; uci set system.@system[0].log_remote='1'; \
  uci commit system; /etc/init.d/log restart"

预期:16 台全 OK(dell 首次为 OK install-deb,write-config,start-service,selfmon-updated), 网络设备日志为 openwrt-log-forward。 失败判断:任一主机 FAIL → 达阈值即停批;dell 安装失败先看 /tmp/env-fb-install.log。

步骤 6:渲染回归(防止波及既有 15 台)

# 用「改动前的模板备份」与「改动后的模板」分别渲染全部节点,逐字节比对
PYTHONPATH="$HOME/py_public_modules" .venv/bin/python - <<'PYEOF'
from pathlib import Path
import yaml, sys
sys.path.insert(0, str(Path.cwd()))
import modules.host_filebeat as hf

cfg = yaml.safe_load(Path("config/default.yaml").read_text())
inst = hf.HostFilebeat(cfg)
nodes = [(dict(n), c) for c, items in cfg["nodes"].items() for n in items]
for n, c in nodes:
    n["platform"] = (cfg.get("platforms") or {}).get(c, c)

new = {n["name"]: inst.render_config(n, c, "PW") for n, c in nodes}
hf.TEMPLATE = Path("backup/onboard-deb-20261002/artifacts/filebeat-host.yml.tpl.bak.20261002-015756")
old = {n["name"]: inst.render_config(n, c, "PW") for n, c in nodes}
print("与改动前渲染不一致的节点:", sorted(k for k in new if new[k] != old[k]))
PYEOF

判据:只有 dell-r620 的渲染结果变化(新增 host-network-log 段);其余 19 个节点逐字节一致。 不符即说明门控段写错位置,不得下发。

步骤 7:验证与幂等复跑

见第 6 章;随后再跑一次 deploy,预期 16 台全部 OK 且动作列为空。

6. 验证

项 命令 预期(实测)
服务在跑 ssh root@192.168.31.249 'systemctl is-active filebeat' active
自监控出口 ssh root@192.168.31.249 'cat /opt/node-exporter/textfile/filebeat.prom \| head -2' 含 filebeat_scrape_up 1
落盘 sudo ls -lR /var/log/remote OpenWrt/dropbear.log、OpenWrt/logread.log
转发端 ssh root@192.168.31.2 'uci -q get system.@system[0].log_ip; /etc/init.d/log status' 192.168.31.249、running
入库 查 ES:platform:physical / platform:network 191 条 / 5 条(实测,02:07 窗口)
字段解析 取一条 platform:network 文档 host_name=OpenWrt、device_program=dropbear、service.name=dropbear、log_source=network
幂等 再跑一次 main.py deploy 16 台 -> OK(动作列为空)、网络设备日志「均已就绪」,退出码 0

7. 回滚

备份位置:backup/onboard-deb-20261002/,逐条登记见其 README.md;工程根台账 backup/README.md 第 12 条。

# 1) OpenWrt:撤销 logd 转发(日志回落到本机内存缓冲)
ssh root@192.168.31.2 "uci -q delete system.@system[0].log_ip; uci -q delete system.@system[0].log_proto; \
  uci commit system; /etc/init.d/log restart"
# 2) 宿主 rsyslog:删除片段并重载(高危:写坏会让宿主失去日志能力,故先语法校验)
sudo rsyslogd -N1 && sudo rm -f /etc/rsyslog.d/30-remote-input.conf && sudo systemctl reload-or-restart rsyslog
sudo rm -rf /var/log/remote                       # 已落盘的网络设备日志
# 3) dell-R620 的 Filebeat:停用并卸载
ssh root@192.168.31.249 "systemctl disable --now filebeat; systemctl disable --now env-filebeat-metrics.timer; \
  rm -f /etc/systemd/system/env-filebeat-metrics.{service,timer} /usr/local/bin/env-filebeat-metrics; \
  systemctl daemon-reload; dpkg -r filebeat"
# 4) 工程代码:还原 5 个文件(配置/实现体/预检查/采集脚本/模板)
cp -p backup/onboard-deb-20261002/config/default.yaml.bak.<TS>   config/default.yaml
cp -p backup/onboard-deb-20261002/modules/host_filebeat.py.bak.<TS> modules/host_filebeat.py
cp -p backup/onboard-deb-20261002/utils/precheck.py.bak.<TS>     utils/precheck.py
cp -p backup/onboard-deb-20261002/artifacts/collectors/filebeat_metrics.py.bak.<TS> artifacts/collectors/filebeat_metrics.py
cp -p backup/onboard-deb-20261002/artifacts/filebeat-host.yml.tpl.bak.<TS> artifacts/filebeat-host.yml.tpl
# 5) 公钥:从 root 的 authorized_keys 移除该行,或恢复备份
sudo -n cp -p backup/onboard-deb-20261002/root-ssh/authorized_keys.bak.<TS> /root/.ssh/authorized_keys

回滚后验证:ls /etc/filebeat 不存在、systemctl is-active rsyslog 为 active、 ES 中不再新增 platform:network 文档、main.py precheck 恢复为 15 台集群外主机。

不可逆项:已入库的日志不会随回滚消失(ILM 14 天自然过期); OpenWrt 内存缓冲在 logd 重启时清空,回滚前产生的日志若未落盘则已丢失。

8. 风险说明

风险 缓解
宿主 rsyslog 配置写坏 → KVM 宿主失去系统日志 片段独立成文件、改前备份、rsyslogd -N1 门禁、重载后非 active 立即删片段并重启(实现体内置)
514/udp 明文无认证,任何人可向宿主投日志 内网边界内;如需收敛可改 input 绑定地址或换 TLS(未做,登记为待办)
本机 Filebeat 以 root 采宿主全部 journald 与既有 14 台口径一致;宿主日志量需纳入容量观察(首轮 191 条/2 分钟窗口)
OpenWrt 日志被 stop 截断,不再进宿主 /var/log/syslog 有意为之(防重复入库);排查设备日志请查 /var/log/remote/OpenWrt/
改动波及既有 15 台(脚本重下发一次) 渲染回归保证配置字节不变;脚本更新不重启 Filebeat,无断流
黑盒目标 ldapadmin-web 报失败(探测到 302) 非本次引入,属既有探测配置与期望状态不匹配,登记为待办

附录 A:实测记录(2026-10-02)

时间 事件 结果
02:02 预检查 16 台可达,dell OS=24.04 匹配
02:04 首次 deploy 失败:apt-get install <URL> 报「无法定位软件包」,且管道吞掉 rc 导致被误判成功
02:05 第二次 deploy dell 安装成功;网络日志失败:ss 探测取错列(Local 是第 4 列),误判 514 未监听
02:07 第三次 deploy 全绿:dell 零动作、OpenWrt openwrt-log-forward、接收端与转发端均就绪,退出码 0
02:07 落盘 /var/log/remote/OpenWrt/{dropbear,logread}.log
02:09 幂等复跑 16 台 -> OK(动作列为空),退出码 0
02:09 ES 验证 platform:physical 191 条、platform:network 5 条;service.name=dropbear 解析正确

对照:docs/SOP-platform-labels.md 附录 A 记录的「dell-R620 node_exporter 未运行」前提有误 —— 实测 prometheus-node-exporter 为 active,textfile 目录 /opt/node-exporter/textfile,自监控出口本就存在。


来源:/home/rain/Documents/k8s_ins/monitoring-p2-20261001/docs/SOP-onboard-deb-network.md | 最后更新:2026-10-02 02:10(由 build/sync.py 同步,请勿在站点侧修改)