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)、 主 SOPdocs/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. 目标¶
- dell-R620 的 filebeat 由工程幂等管理(安装/配置/服务/自监控四项均达期望态),
日志以
platform=physical入库; - OpenWrt 的 logd 日志经宿主 rsyslog 落盘并由宿主 Filebeat 采集,以
platform=network入库; - 既有 14 台 RPM 主机的渲染结果逐字节不变(不得因本次改动触发无谓重启与日志断流);
- 连续执行两次,第二次零变更。
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,默认值不变)
注意(三个已踩的坑):
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 …。- 安装命令不得接管道 ——
cmd | tail -3的返回码是tail的 0,安装失败会被判成成功 (首次部署即因此误判,直到写配置时报「/etc/filebeat不存在」才暴露)。 统一改为「重定向到日志 → 取rc→tail→exit $rc」,rpm分支同类问题一并纠正。 - 模板中门控段的注释必须写在标记对内 ——
_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同步,请勿在站点侧修改)