多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

KeyarchOS上irssi部署实战:文本界面IRC值班与告警桥接

KeyarchOS上irssi部署实战:文本界面IRC值班与告警桥接 前一阵子帮朋友整理一台只装了最小化系统的服务器朋友顺口问我现在跟团队沟通都用人手一个群怎么你值班电脑里还留着 IRC我说你看一眼我这台机器内存 2 GB图形桌面能不开就不开但值班室的消息、告警、交接班记录全在这条 IRC 里客户端就是 irssi 0.8.15-16跑在浪潮信息 KeyarchOS 上稳定、省资源还不用鼠标。朋友照着我的配置完一遍之后就回了一句把图形界面忘掉好像也没缺什么。这篇文章就是这次完整过程的记录。我会从 KeyarchOS 的环境准备讲起覆盖安装、首次连接、tmux 挂载、脚本桥接告警以及几个我反复踩过的坑。适合想给自己服务器减负、又需要稳定沟通渠道的运维也适合还没用过文本界面的新手按步骤照抄。1. 为什么最后我选择把 IRC 留在值班环境里1.1 “大而全”沟通工具在机房场景里的尴尬先从最常被问的问题开始。近几年的团队沟通工具基本都是图形化客户端界面是漂亮功能一个比一个多但你真把它放到机房值班场景里问题就来了首先服务器不装桌面环境图形客户端根本跑不起来其次就算远程桌面回公司电脑很多时候管理口、带外口这些网络路径根本不让你走大流量协议再次图形客户端启动慢、内存吃得多2 GB 内存的物理机上同时挂着数据库、redis 和监控脚本再塞一个几百 MB 的聊天客户端随时可能因为内存交换卡死。IRC 在这里恰好是个“反向答案”协议本身只有文本消息和几个简单的控制指令老旧但足够稳。一个 irssi 进程常驻内存通常二三十 MBCPU 占用平时几乎为零。它不需要系统托盘不需要桌面环境只要有一个能打开终端、能走 TCP 的通道就能用。机房网络最紧张的时候我甚至通过一条串口线加拨号链路都能把 IRC 消息发出去——那种场景你让图形客户端怎么活。1.2 为什么是 irssi 而不是其他文本客户端文本界面的 IRC 客户端不止一个比如 weechat、bitchx、ircII 都有不少老粉。我选 irssi 的原因比较直接KeyarchOS 自带的软件仓库里有现成的 irssi 0.8.15-16 包安装就是一条 dnf 命令的事不需要从源码编译也不需要额外摸索 weechat 的中继模块。另一个原因是习惯irssi 的/set配置体系、轻量级的脚本接口和成熟的自动日志功能用顺手之后很多工作都能靠它原生能力完成。当然也要承认单讲界面颜值weechat 默认配色比 irssi 好看但好看不能当饭吃。对一个跑在无头服务器上的“值班消息中枢”稳定性、依赖少、文档多、脚本多这才是真正值钱的东西。irssi 从 1997 年开发到现在各种发行版里都维护得比较勤快所以我也敢让它跑在放生产服务器上。2. KeyarchOS 环境确认与 irssi 安装仓库、版本与依赖2.1 先确认系统版本和软件仓库状态无论你拿到的是刚装好的 KeyarchOS 还是已经跑了一段时间的生产机器我建议安装前先把系统信息确认一遍免得装完发现和你同事的版本差别太大。我习惯执行的命令是cat /etc/os-release uname -m dnf repolistos-release会告诉你当前是哪个大版本uname -m确认架构绝大多数服务器是 x86_64也有部分是 ARM64dnf repolist能看出当前有哪些仓库处于启用状态。如果dnf repolist的输出寥寥无几说明系统是最小化安装部分软件包可能不在默认仓库里这时需要根据 KeyarchOS 官方文档补充对应仓库再继续安装。这里有个小经验不要随便从网上找一个大型软件源替换系统默认源服务器操作系统对软件包的编译选项和 glibc 版本有要求乱换源很容易出现装上就跑段错误的情况。我见过有人图省事把一个通用源整个加进去结果 irssi 装好之后一启动就提示缺少模块最后排查半天问题都在源上。宁可多花几分钟确认官方仓库也不要去赌无名源。2.2 用 dnf 安装 irssi 和必要依赖确认环境和仓库之后安装就很简单了sudo dnf install -y irssi irssi --version第一次安装时dnf 会自动把 irssi 运行所需的依赖拉齐主要就是 glibc、ncurses、openssl 这几个大头。ncurses 是终端界面的基础库openssl 用来支持 IRC over TLS对现在的 IRC 服务器来说基本是必须的因为已经有很多服务器明确关闭了明文 6667 端口。如果 KeyarchOS 默认仓库里找不到 irssi我的做法是先把扩展包仓库类似对应版本量级的 EPEL 仓库加进来再重试。加扩展包仓库本身也是一个常规操作注意核对仓库来源即可。装完版本号一般会显示 0.8.15-16 或相近的发行版后缀版本。这个版本号在纯版号看来确实不算新但服务器系统更新策略本来就偏向保守以稳定为主。只要你不是去折腾最新协议特性0.8.15 完全够用。我自己在 KeyarchOS 上跑了快一年没有遇到因为版本老而没法用的情况。2.3 安装后快速自检能不能启动安装完不要急着配服务器先敲一遍irssi看能不能正常进入界面。如果终端能用你会看到默认的连接窗口底部有输入行。这一步自检很关键因为它能提前暴露两个问题一是终端类型或者 TERM 环境变量不对界面渲染会乱二是依赖库缺失启动会直接报错。如果启动后界面花屏或者按键没反应多半是TERM没有设置好把TERMxterm-256color或者TERMlinux导出后重试基本能缓解。这算是纯文本界面工具的一个通用体检步骤我每次新装一个 TUI 工具都会先做一遍。3. 第一次启动 irssi从配置目录到成功连上服务器3.1 认识配置文件的主干结构irssi 的配置默认写在~/.irssi/config第一次启动时会自动生成。很多人喜欢在设置窗口里直接敲命令调整参数等你退出的时候再/save保存。这种交互方式很灵活但如果你需要在多台机器上复制配置直接编辑文件往往更快。配置文件里的核心段落是servers和channels。servers里定义了网络、主机地址、端口、是否用 TLSchannels里定义了要自动加入的频道名单。手动编辑更简单的方式是用 irssi 的命令语法/server add -network opsnet irc.example.internal 6697 -ssl /network add -nick liulang opsnet /channel add -auto #ops opsnet /channel add -auto #ops-alert opsnet第一行是添加一个名为 opsnet 的服务器地址irc.example.internal端口6697启用 SSL。第二行是给网络设置默认昵称。第三、四行则是把值班相关频道设为自动加入。注意/network add的-nick参数只对默认昵称起效具体昵称也可以在~/.irssi/config里调整nick、alternate_nick。这里有个非常容易踩的坑很多新手把/connect理解为“只连接一次”于是直接手动连接服务器忘了把服务器写进配置。等到断线重连或者机器重启所有频道都要手动重进体验极其割裂。所以我会建议任何要长期使用的服务器都把它通过/server add和/channel add写进配置里让自动连接和自动加入成为默认行为。3.2 从连接到加入频道的完整动作配置文件写好后手动连接一次看看链路是否正常/connect opsnet /join #ops /list/connect后面接的是网络名或者服务器地址连接成功后窗口底部会提示欢迎消息。/list可以列出当前服务器的公开频道不过在大型服务器的频道列表可能很长我一般会先/who #ops看看在线人员而不是刷整个列表。第一次连接时如果提示证书错误比较常见的原因是自建 IRC 服务器使用了内部 CA而 irssi 没有把你信任的 CA 目录配置进去。解决办法有两类要么在 irssi 设置里把证书校验范围指向系统的 CA 目录要么在服务器上安装内部 CA 证书后重建 CA 索引。直接用/set ssl_verify false关掉校验是最快的但只建议在内网并且你自己清楚风险的情况下用公网环境千万别这么干。3.3 配好自动重连断了才知道什么叫安心服务器重启、网络波动、路由器空闲超时这些在生产环境里轮着来。为了不让人守在屏幕前反复手动重连我建议把自动重连参数调成“激进但克制”的状态/set autoconnect yes /set autochannel join yes /set reconnect_delay_forever 30 /set max_wait_time 600 /set quitmsg 值班维护稍后回来autoconnect yes让配置里的服务器在 irssi 启动时自动连接reconnect_delay_forever 30表示一旦连接断开就每 30 秒重试一次max_wait_time限制重连间隔的上限避免无限快速重试把服务器连接打爆。这些参数实测下来很稳我见过最狠的一次是机房断网两个小时跳回来之后 irssi 自动把所有频道都加了一遍压根不需要人工操作。4. 接入 tmux 长期驻留断线恢复和多频道整理4.1 为什么要在 tmux 里跑而不是简单 nohup 后台你可能觉得既然要长期驻留直接把 irssi 放后台不就行了。真正跑过后台模式的人都懂后台有几个致命问题没有终端界面很多交互操作没法做如果想看历史输出根本没有可滚动缓冲最麻烦的是一旦要临时输入一条/msg或者执行某个命令你得想办法把键盘输入送进去。tmux 的作用就是替你把终端会话“挂”在后台随时可以重新附着回来这正好解决以上三个问题。我把 irssi 装在一个名为irc的 tmux 会话里任何一台能 SSH 到服务器的机器执行tmux attach -t irc就能看到完整界面。如果 SSH 断开了tmux 会话还在irssi 继续跑消息也不会丢。这类用法和“用 nohup 把进程丢在后台”完全不同tmux 本质上是保留了一个虚拟终端irssi 的所有 TUI 能力都在只是不在你眼前的物理屏幕上而已。4.2 一套优雅的启动和恢复脚本为了不让值班的同事每次都要记一串命令我在服务器上写了一个简单的启动脚本放在/usr/local/bin/irc-box#!/bin/bash if tmux has-session -t irc 2/dev/null; then tmux attach-session -t irc else tmux new-session -s irc -n irssi irssi fi第一次执行会创建会话并直接进入 irssi之后再执行就是重新附着。加了可执行权限sudo chmod x /usr/local/bin/irc-box这台 KeyarchOS 上ssh 登录后用irc-box一个单词就能进入值班频道非常顺手。如果有同事需要同时看但不想操作可以让他tmux attach -t irc -r只读模式更安全防止误敲命令。4.3 多频道多窗口管理技巧irssi 自带窗口管理习惯默认状态下每个频道一个窗口但很多新用户不知道快捷键。我把最常用的几个列出来Alt1到Alt9快速切换编号窗口。CtrlP/CtrlN上一个/下一个窗口。/win close关闭当前频道窗口。/win move 2把当前窗口移到第二个位置。/set autostart_scripts on配合脚本的启动开关。值班时我习惯把#ops放在窗口 1#ops-alert放窗口 2告警脚本产生的消息都发到#ops-alert日常聊天在#ops。这样眼睛盯窗口 2 就只看到真正需要处理的告警不会被闲聊淹没。这个“告警频道和聊天频道物理隔离”的习惯比任何智能过滤插件都有效我建议所有团队都这么分。5. 把 irssi 变成告警通道脚本桥接与值班实战5.1 最小通知桥用 tmux send-keys 向频道发消息irssi 本身不是为脚本设计但只通过 tmux 这个中间层bash 脚本就能直接向频道发送消息实现最小化的通知桥。原理很简单调用 tmux 的send-keys往 irssi 所在的终端里模拟按键输入把消息当作命令发出去。#!/bin/bash CHANNEL#ops-alert MESSAGE$(hostname) 检查到服务 mydaemon 异常退出时间 $(date %H:%M:%S) tmux send-keys -t irc msg $CHANNEL $MESSAGE Enter脚本格式注意两点发送长消息时send-keys的字符串里有空格没问题但如果有特殊字符比如$、反引号、单引号容易把命令解析搞乱。稳妥做法是把整串消息先写进一个变量再传给send-keys必要时用引号包一层。这种方式的局限在于必须在 irssi 所在的机器上执行因为它依赖 tmux 会话里的键盘输入。如果你的监控系统跑在其他机器上那就需要用另一种方式比如用单独的小工具通过 IRC 协议直接发包但很多企业内网环境不允许额外装太多东西所以我一般只在被监控主机本地用这种最小桥。5.2 系统指标检查配合 cron 的完整示例我更常做的场景是每五分钟检查一次磁盘使用率超过阈值就往告警频道发消息。下面是一个完整可用的脚本你放在本地就能跑#!/bin/bash export PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin CHANNEL#ops-alert THRESHOLD85 CURRENT$(df -h / | awk NR2 {print int($5)}) if [ $CURRENT -ge $THRESHOLD ]; then MESSAGE磁盘占用告警根分区当前使用 ${CURRENT}%阈值 ${THRESHOLD}% tmux send-keys -t irc msg $CHANNEL $MESSAGE Enter fi然后用 cron 定时执行*/5 * * * * /usr/local/bin/disk-alert-to-irc.sh /var/log/irc-alert.log 21执行之前先手动跑一遍脚本确认 tmux 会话名是irc这个路径。如果不在脚本会静默失败不会有任何报错。初学的人容易在这里沮丧半天其实用一句tmux has-session -t irc做前置检查就好没有会话就跳过或先启动会话再发消息让逻辑更健壮。5.3 带外管理和硬件告警的几条落地经验如果你管理的服务器硬件本身有带外管理模块比如不少服务器主板集成的 BMC 芯片它通常支持将硬件状态事件回调到本机脚本。温度过高、风扇转速异常、电源掉电这类硬件告警完全可以像软件告警一样转成 IRC 消息发到值班频道。我自己的做法是在带外管理工具的告警配置里把“执行自定义脚本”指向一个本地脚本脚本内容跟上面的磁盘告警几乎一样只是把消息文案换成硬件事件描述。这里有一个容易被忽略的坑带外管理模块触发脚本时很可能和登录用户的 shell 环境不一致脚本开头必须把PATH明确写好任何环境变量都不要依赖某个用户目录否则就会出现“手动跑没问题告警触发时却不生效”的诡异现象。硬件告警和普通聊天混在一个频道里会有噪声问题我通常用两个频道彻底分开只读告警频道给全体值班成员聊天频道用来讨论方案。文本界面的过滤能力反而更强因为你可以用/notify高亮自己的昵称、用/ignore过滤闹腾的频道成员一套组合下来该看到的一字不落不该看的也不会半夜把你震醒。6. 日常故障排查、配置细节和我的实测心得6.1 编码和终端显示中文乱码的根因运维频道里中文消息是常态。irssi 本身能处理 UTF-8但乱码通常出现在两个环节一是客户端和服务器之间缺了正确的编码协商二是终端仿真器没有设置 UTF-8。前者可以通过 irssi 命令修正/set term_charset utf-8 /set recode_out_charset utf-8 /set recode_in_charset utf-8后者则要看你的终端像是常见的终端软件默认都支持 UTF-8出问题时去检查 SSH 会话的语言环境保证LANGzh_CN.UTF-8或en_US.UTF-8之类能正常输出中文。如果发现老日志里有 GBK 编码的历史消息可以用iconv转换文件后再打开不要指望 irssi 自动处理历史编码。6.2 常见故障排查表几个月里我把常见问题攒成一张表照着排查速度会快很多现象可能原因处理方式连接超时或拒绝服务器端口没放行、服务器未启动确认 6697/6667 端口连通性检查 IRC 服务进程连接后立刻被断开主机名或反向 DNS 检查失败修改服务器配置允许免反解或调整客户端身份信息界面显示乱码终端字符集不一致统一设置 UTF-8检查 SSH 的 LANG 环境自动加入频道不生效配置文件未保存或频道网络名不一致执行/save后重启 irssi 验证消息发不出去频道人数限制或你没有发言权限查看频道模式m等标志向管理员确认权限tmux 里键盘输入无反应tmux 前缀键冲突检查 tmux 的prefix设置避免和 irssi 快捷键冲突这张表不是说一定全面但对新手来说已经能覆盖 90% 的起步问题。6.3 日志记录、隐私和值班交接的配合说一个最实用的点自动日志。irssi 的日志记录做得非常细打开之后每次会话的消息都落盘对值班交接价值巨大。昨天夜里到底有哪些告警谁在频道里说了什么结论回头翻日志一目了然。/set autolog on /set autolog_path ~/.irssi/logs/$tag/$0.logautolog_path里的$tag会是网络或服务器的标签$0是频道名。用这种结构保存日志不会被所有频道搅在一个文件里按天或按频道做归档都很方便。我还配合 cron 做了每周打包压缩17 3 * * 1 tar czf /backup/irssi-$(date \%V).tar.gz -C ~/.irssi/logs . /dev/null 21这里提醒一句如果频道里涉及账号口令、密钥之类的敏感内容尽量别让值班频道自动记录这类消息真要记录建议日志文件放在加密盘或权限收紧的目录里。文本日志明文存放权限要给到 0600别让其他普通用户能读到。6.4 想重置时怎么干净地卸载最后是卸载。如果你哪天想换成 weechat或彻底不想用 IRC卸载前先把配置备份走cp -a ~/.irssi ~/.irssi.bak sudo dnf remove -y irssi删掉~/.irssi就能把个人配置和日志都清理干净。备份的意义是防止某天还想再回来保留配置让你重新装好后一分钟内就能恢复原样而不需要重新敲一遍服务器、频道和自动重连参数。我对这类老工具的服务器包习惯一直如此不是卸载了就一了百了先备份再卸是运维素养。写到这里我的 KeyarchOS irssi 流程差不多都讲完了。最后分享一个小技巧值夜班时我在 tmux 里开两个窗格一个挂着 irssi另一个用tail -f跟踪刚才的自动日志文件频道消息和脚本告警混在一起滚动扫一眼文字流就能知道这一晚所有动静。irssi 的/lastlog命令还能在当前会话里搜索历史关键字半夜找某条告警不需要翻图形界面。对我个人来说把沟通和告警塞进一个只有几 MB 常驻内存的文本进程里是这些年我做过最舒坦的运维决策之一。不知道你愿不愿意也给自己的服务器减减负拿起 irssi 试上一次。也许你和我的感受一样图形界面并没有想象中那么必不可少。
返回列表