monitor

安装

批量升级 agent

agent 不自动更新。hub 发布新版后,要在每台机器上以 root 执行一次升级命令。命令里没有任何一台机器的凭证,所有机器共用同一条,所以可以一次发给很多台。第一次批量安装见接入节点。

升级命令

在面板的更新页复制,就是这一条:

curl -fsSL https://hub.example.com/install.sh | sh -s -- --upgrade
bash
  • 沿用机器上已有的 token、上报间隔和统计网卡,不需要 token,也不会新建节点
  • 已经是最新版的机器再执行一遍也没关系
  • 下载失败时机器照旧运行原来的版本;新版装上后起不来,自动换回原来的版本
  • 没装过 agent 的机器直接报错,不会变成新节点
  • hub 地址是 http:// 的,命令末尾加 --insecure

更新页按版本列出还没升级的节点。升级完的节点重连后从名单里消失,名单清空就是全部完成。hub 发现新版本时,导航上的「更新」带一个小圆点。

agent 不自动更新是有意的:hub 能向所有节点推送二进制,就意味着 hub 一旦被攻破,所有节点同时失守。用 cron 在每台机器上定时跑 --upgrade 等于把这条通道重新搭了起来,不建议。

发到每台机器

按你平时怎么登录这些机器来选:

做法适合
逐台粘贴机器不多,或者只能用服务商的网页控制台
SSH 客户端广播用图形界面的 SSH 客户端,它能把一条命令同时发给多台
终端循环能在自己电脑上打开终端,机器越多越省事

逐台粘贴

登上每台机器,粘贴命令,回车,几秒后确认输出的最后一行,换下一台。

SSH 客户端广播

不少 SSH 客户端能把一条命令同时发给选中的多台机器,菜单里常叫「批量执行」「多执行」「发送到所有会话」「广播输入」。把命令放进去,选中机器执行一次,再逐台确认输出的最后一行。

登录用户不是 root 的,把命令里的 | sh 换成 | sudo sh。

终端循环

在自己的电脑上用一个循环逐台登录执行。分三步:准备名单,设置免密登录(只做一次),执行。

1. 准备名单

新建文本文件 hosts.txt,一行一台机器的 IP 或域名,不留空行。已经是新版的机器留在里面也没关系:

203.0.113.10
203.0.113.11
hk-01.example.com

放在用户主目录里(Windows 是 C:\Users\你的用户名,macOS 和 Linux 是 ~),新开的终端默认就在那里。Windows 用记事本保存时,注意文件名别变成 hosts.txt.txt。

2. 免密登录(只做一次)

把自己电脑的公钥放到每台机器上,每台输一次 root 密码。已经能用密钥登录的跳过这一步。

  • ssh-keygen 问 Overwrite (y/n)? 说明已经有密钥,回答 n
  • 第一次连某台机器会问 Are you sure you want to continue connecting,输入 yes
  • Windows 10、11 自带 ssh 和 ssh-keygen,在开始菜单里打开 PowerShell 即可

macOS / Linux:

# 还没有密钥的先生成一把,提问一路回车
ssh-keygen -t ed25519
# 把公钥放到名单里的每台机器上,每台问一次 root 密码
for h in $(cat hosts.txt); do ssh-copy-id "root@$h"; done
bash

Windows(PowerShell):

# 还没有密钥的先生成一把,提问一路回车
ssh-keygen -t ed25519
# 把公钥放到名单里的每台机器上,每台问一次 root 密码
foreach ($h in Get-Content hosts.txt) {
  Get-Content $HOME/.ssh/id_ed25519.pub |
    ssh "root@$h" "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
}
powershell

3. 执行

macOS / Linux:

# 要在每台机器上执行的命令
cmd='curl -fsSL https://hub.example.com/install.sh | sh -s -- --upgrade'
# 逐台登录执行;某台失败时打一行「!! 地址 失败」,其余照常
for h in $(cat hosts.txt); do
  ssh -o BatchMode=yes "root@$h" "$cmd" || echo "!! $h 失败"
done
bash

Windows(PowerShell):

# 要在每台机器上执行的命令
$cmd = "curl -fsSL https://hub.example.com/install.sh | sh -s -- --upgrade"
# 逐台登录执行;某台失败时打一行「!! 地址 失败」,其余照常
foreach ($h in Get-Content hosts.txt) {
  ssh -o BatchMode=yes "root@$h" $cmd
  if ($LASTEXITCODE -ne 0) { Write-Host "!! $h 失败" }
}
powershell

循环一台接一台,每台几秒,一百台也就几分钟。登录用户不是 root 的:把 root@ 换成你的用户名,| sh 换成 | sudo sh;sudo 要输密码的,再在 ssh 后面加 -t,每台会问一次 sudo 密码。

会用 ansible 的可以并行执行,hosts.txt 直接当清单,-m raw 不要求目标机装 Python:

# 20 台一起升级;连不上的标 UNREACHABLE,出错的标 FAILED
ansible all -i hosts.txt -u root -f 20 -m raw -a \
  'curl -fsSL https://hub.example.com/install.sh | sh -s -- --upgrade'
bash

hub 同时转发 4 份二进制,其余排队,排不上的由脚本自动重试,几百台同时执行也能完成。

确认结果

每台机器的输出类似下面这样,中间可能多几行,最后一行以 monitor-agent installed 开头就是成功:

keeping --interval 1 from the previous install
downloading monitor-agent (x86_64)
monitor-agent installed; follow it with: journalctl -u monitor-agent -f

回到更新页,待升级名单随节点重连逐台消失。有失败的,处理后只对那几台重新执行;终端循环的话,把 hosts.txt 里只留下这几台。成功过的机器重新执行也没关系。

报错对照

登录和执行这一步的报错:

输出里看到原因怎么办
Permission denied这台还不能免密登录,或用户名不对回到终端循环第 2 步给它放公钥
Host key verification failed第 2 步没连过这台,或它重装过、指纹变了手动 ssh root@地址 连一次;重装过的先执行 ssh-keygen -R 地址
Connection timed out、Could not resolve hostname地址写错,或这台连不上:关机、防火墙、只有 IPv6 而你的网络没有 IPv6核对地址;只有 IPv6 的机器从有 IPv6 的网络去连
sudo: a password is requiredsudo 要输密码,而 ssh 没给它终端ssh 后面加 -t

脚本自己的报错(下载失败、服务起不来、没装过 agent 等)和安装时相同,见接入节点。

在 GitHub 上修改这一页最后更新 2026-09-24