OA0 = Omni AI 0
OA0 是一个探索 AI 的论坛
现在注册
已注册用户请  登录
OA0  ›  技能包  ›  linux-patcher: 自动化 Linux 服务器系统补丁与 Docker 镜像更新

linux-patcher: 自动化 Linux 服务器系统补丁与 Docker 镜像更新

 
  audit ·  2026-02-02 10:39:35 · 3 次点击  · 0 条评论  

name: linux-patcher
description: 自动化 Linux 服务器补丁与 Docker 容器更新。当用户要求更新、打补丁或升级 Linux 服务器,应用安全更新,更新 Docker 容器,检查系统更新,或跨多台主机管理服务器维护时使用。支持 Ubuntu、Debian、RHEL、AlmaLinux、Rocky Linux、CentOS、Amazon Linux 和 SUSE。包含 PatchMon 集成,用于自动主机检测和智能 Docker 处理。


Linux 补丁工具

通过 SSH 自动化跨多台主机的 Linux 服务器补丁和 Docker 容器更新。

⚠️ 重要免责声明

发行版支持状态

已全面测试:
- ✅ Ubuntu - 已在真实基础设施中进行端到端测试

支持但未测试:
- ⚠️ Debian GNU/Linux - 命令基于官方文档
- ⚠️ Amazon Linux - 支持 AL2 (yum) 和 AL2023 (dnf)
- ⚠️ RHEL (Red Hat Enterprise Linux) - 支持 RHEL 7 (yum) 和 8+ (dnf)
- ⚠️ AlmaLinux - 与 RHEL 兼容,使用 dnf
- ⚠️ Rocky Linux - 与 RHEL 兼容,使用 dnf
- ⚠️ CentOS - 支持 CentOS 7 (yum) 和 8+ (dnf)
- ⚠️ SUSE/OpenSUSE - 使用 zypper 包管理器

测试建议:
始终先在非生产环境中测试未经测试的发行版。脚本在未经测试的发行版上运行时将发出警告。

安全须知

此技能要求:
- 免密码 sudo 访问权限 - 配置为受限权限
- SSH 密钥认证 - 不存储或传输密码
- PatchMon 凭据 - 安全存储在用户主目录中

请阅读 SETUP.md 获取完整的安全配置指南。

快速开始

自动模式(推荐)

从 PatchMon 更新所有主机(自动检测):

scripts/patch-auto.sh

跳过 Docker 更新(仅更新系统包):

scripts/patch-auto.sh --skip-docker

预览更改(试运行):

scripts/patch-auto.sh --dry-run

手动模式(备选方案)

单台主机 - 仅系统包

scripts/patch-host-only.sh user@hostname

单台主机 - 完整更新

scripts/patch-host-full.sh user@hostname /path/to/docker/compose

从配置文件更新多台主机

scripts/patch-multiple.sh config-file.conf

功能特性

  • PatchMon 集成 - 自动检测需要更新的主机
  • 智能 Docker 检测 - 自动检测 Docker 和 Compose 路径
  • 选择性更新 - 使用 --skip-docker 标志跳过 Docker 更新
  • 需要免密码 sudo - 通过 visudo/etc/sudoers.d/ 文件配置
  • SSH 密钥认证 - 无需密码提示
  • 并行执行 - 同时更新多台主机
  • 试运行模式 - 预览更改而不实际应用
  • 手动覆盖 - 在不使用 PatchMon 的情况下对特定主机运行更新

配置

选项 1:通过 PatchMon 自动配置(推荐)

配置 PatchMon 凭据以实现自动主机检测:

cp scripts/patchmon-credentials.example.conf ~/.patchmon-credentials.conf
nano ~/.patchmon-credentials.conf

设置您的凭据:

PATCHMON_URL=https://patchmon.example.com
PATCHMON_USERNAME=your-username
PATCHMON_PASSWORD=your-password

然后只需运行:

scripts/patch-auto.sh

脚本将:
1. 查询 PatchMon 以获取需要更新的主机
2. 自动检测每台主机上的 Docker
3. 应用适当的更新(仅主机或完整更新)

选项 2:单台主机(快速手动)

直接使用命令行参数运行脚本(无需配置文件)。

选项 3:多台主机(手动配置)

基于 scripts/patch-hosts-config.example.sh 创建配置文件:

cp scripts/patch-hosts-config.example.sh my-servers.conf
nano my-servers.conf

配置示例:

# 主机定义:主机名,SSH用户,Docker路径
HOSTS=(
  "webserver.example.com,ubuntu,/opt/docker"
  "database.example.com,root,/home/admin/compose"
  "monitor.example.com,docker,/srv/monitoring"
)

# 更新模式:"host-only" 或 "full"
UPDATE_MODE="full"

# 试运行模式(设置为 "false" 以应用更改)
DRY_RUN="true"

然后运行:

scripts/patch-multiple.sh my-servers.conf

先决条件

控制机要求(运行 OpenClaw 的机器)

  • [ ] OpenClaw 已安装并运行
  • [ ] SSH 客户端 已安装(ssh 命令可用)
  • [ ] Bash 4.0 或更高版本
  • [ ] curl 已安装(用于 PatchMon API)
  • [ ] jq 已安装(用于 JSON 解析)
  • [ ] PatchMon 已安装(用于检查哪些主机需要更新)
  • 不需要安装在 OpenClaw 主机上
  • 可以安装在任何可通过 HTTPS 访问的服务器上
  • 下载地址:https://github.com/PatchMon/PatchMon

安装缺失的工具:

# Ubuntu/Debian
sudo apt install curl jq

# RHEL/CentOS/Rocky/Alma
sudo dnf install curl jq

# macOS
brew install curl jq

目标主机要求

  • [ ] SSH 服务器 正在运行且可访问
  • [ ] SSH 密钥认证 已配置(免密码登录)
  • [ ] 免密码 sudo 已配置用于补丁命令(参见 SETUP.md)
  • [ ] Docker 已安装(可选,仅用于完整更新)
  • [ ] Docker Compose 已安装(可选,仅用于完整更新)
  • [ ] PatchMon 代理 已安装并正在报告(可选但推荐)

PatchMon 设置(自动模式必需)

需要 PatchMon 来自动检测哪些主机需要打补丁。

重要提示: PatchMon 不需要与 OpenClaw 安装在同一台服务器上。将 PatchMon 安装在单独的服务器上(可以是您网络上的任何服务器),OpenClaw 将通过 API 查询它。

下载 PatchMon:
- GitHub: https://github.com/PatchMon/PatchMon
- 文档: https://docs.patchmon.net

您需要:
- [ ] PatchMon 服务器安装在任意可访问的服务器上(不一定是 OpenClaw 主机)
- [ ] PatchMon 代理安装在所有要打补丁的目标主机上
- [ ] PatchMon API 凭据(用户名/密码)
- [ ] 从 OpenClaw 主机到 PatchMon 服务器的网络连接(HTTPS)

架构:

┌─────────────────┐      HTTPS API      ┌─────────────────┐
│ OpenClaw 主机   │ ──────────────────> │ PatchMon 服务器 │
│ (本机)        │    查询更新         │ (独立主机)     │
└─────────────────┘                     └─────────────────┘
                                                  │
                                                  │ 报告
                                                  ▼
                                         ┌─────────────────┐
                                         │ 目标主机        │
                                         │ (带代理)       │
                                         └─────────────────┘

快速开始:
1. 在单独的服务器上安装 PatchMon 服务器(参见 GitHub 仓库)
2. 在所有要打补丁的主机上安装 PatchMon 代理
3. 配置 OpenClaw 以访问 PatchMon API:

cp scripts/patchmon-credentials.example.conf ~/.patchmon-credentials.conf
nano ~/.patchmon-credentials.conf  # 设置 PatchMon 服务器 URL
chmod 600 ~/.patchmon-credentials.conf

详细设置:
参见 references/patchmon-setup.md 获取完整的安装指南。

我可以在没有 PatchMon 的情况下使用此技能吗?
可以!您可以使用手动模式来针对特定主机,无需 PatchMon。但是,自动检测需要更新的主机需要 PatchMon。

目标主机要求

必需:
- SSH 服务器正在运行
- SSH 用户的免密码 sudo(用于 aptdocker 命令)
- PatchMon 代理已安装并正在报告(用于自动模式)

对于完整更新:
- Docker 和 Docker Compose 已安装
- Docker Compose 文件存在于指定路径

配置免密码 Sudo

在每个目标主机上,创建 /etc/sudoers.d/patches

# 对于 Ubuntu/Debian 系统
username ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/docker

# 对于 RHEL/CentOS 系统
username ALL=(ALL) NOPASSWD: /usr/bin/yum, /usr/bin/docker, /usr/bin/dnf

username 替换为您的 SSH 用户。使用 sudo -l 测试以验证。

更新模式

仅主机更新

仅更新系统包:
- 运行 apt update && apt upgrade(或在 RHEL 上运行 yum update
- 移除未使用的包(apt autoremove
- 触及 Docker 容器

何时使用:
- 没有 Docker 的主机
- 仅安全补丁
- 需要最小化停机时间

完整更新

完整的更新周期:
- 更新系统包
- 清理 Docker 缓存(docker system prune
- 拉取最新的 Docker 镜像
- 使用新镜像重新创建容器
- 会导致短暂的服务中断

何时使用:
- 基于 Docker 的基础设施
- 定期维护窗口
- 有可用的应用程序更新

工作流程

自动工作流程(patch-auto.sh)

  1. 查询 PatchMon - 通过 API 获取需要更新的主机
  2. 对于每台主机:
    - SSH 登录主机
    - 检查是否安装了 Docker
    - 自动检测 Docker Compose 路径(如果未指定)
    - 根据 Docker 检测结果应用仅主机或完整更新
  3. 报告结果 - 成功/失败更新的摘要

仅主机更新过程

  1. SSH 登录目标主机
  2. 运行 sudo apt update
  3. 运行 sudo apt -y upgrade
  4. 运行 sudo apt -y autoremove
  5. 报告结果

完整更新过程

  1. SSH 登录目标主机
  2. 运行 sudo apt update && upgrade && autoremove
  3. 导航到 Docker Compose 目录
  4. 运行 sudo docker system prune -af(清理)
  5. 拉取 compose 文件中列出的所有 Docker 镜像
  6. 运行 sudo docker compose pull
  7. 运行 sudo docker compose up -d(重新创建容器)
  8. 报告结果

Docker 检测逻辑

使用自动模式时:
- Docker 已安装 + 找到 compose 文件 → 完整更新
- Docker 已安装 + 未找到 compose 文件 → 仅主机更新
- Docker 未安装 → 仅主机更新
- 设置了 --skip-docker 标志 → 仅主机更新(忽略 Docker)

Docker 路径自动检测

当未指定 Docker 路径时,脚本检查以下位置:

  1. /home/$USER/Docker/docker-compose.yml
  2. /opt/docker/docker-compose.yml
  3. /srv/docker/docker-compose.yml
  4. $HOME/Docker/docker-compose.yml
  5. 当前目录

覆盖自动检测:

scripts/patch-host-full.sh user@host /custom/path

示例

示例 1:通过 PatchMon 自动更新(推荐)

# 首次使用:配置凭据
cp scripts/patchmon-credentials.example.conf ~/.patchmon-credentials.conf
nano ~/.patchmon-credentials.conf

# 运行自动更新
scripts/patch-auto.sh

示例 2:带试运行的自动更新

# 预览将要更新的内容
scripts/patch-auto.sh --dry-run

# 查看输出,然后应用
scripts/patch-auto.sh

示例 3:跳过 Docker 更新

# 即使检测到 Docker,也仅更新系统包
scripts/patch-auto.sh --skip-docker

示例 4:手动单台主机,仅系统包

scripts/patch-host-only.sh admin@webserver.example.com

示例 5:手动单台主机,完整更新,自定义 Docker 路径

scripts/patch-host-full.sh docker@app.example.com /home/docker/production

示例 6:从配置文件手动更新多台主机

scripts/patch-multiple.sh production-servers.conf

示例 7:通过 OpenClaw 聊天

只需询问 OpenClaw:
- "更新我的服务器"
- "为所有需要更新的主机打补丁"
- "仅更新系统包,跳过 Docker"

OpenClaw 将使用自动模式并报告结果。

故障排除

PatchMon 集成问题

"未找到 PatchMon 凭据"

  • 创建凭据文件:cp scripts/patchmon-credentials.example.conf ~/.patchmon-credentials.conf
  • 使用您的 PatchMon URL 和凭据进行编辑
  • 或者将 PATCHMON_CONFIG 环境变量设置为自定义位置

"PatchMon 认证失败"

  • 验证 PatchMon URL 是否正确(不带尾部斜杠)
  • 检查用户名和密码
  • 确保 PatchMon 服务器可访问:curl -k https://patchmon.example.com/api/health
  • 检查防火墙规则

"没有主机需要更新",但 PatchMon 显示有可用更新

  • 验证 PatchMon 代理是否在目标主机上运行:systemctl status patchmon-agent
  • 检查代理报告间隔:/etc/patchmon/config.yml
  • 强制代理更新:patchmon-agent report

系统更新问题

在 apt/docker 命令上出现 "权限被拒绝"

  • 配置免密码 sudo(参见先决条件部分)
  • 使用以下命令测试:ssh user@host sudo apt update

"连接被拒绝"

  • 验证 SSH 访问:ssh user@host echo OK
  • 检查 SSH 密钥是否已配置
  • 验证主机名解析

未找到 Docker Compose

  • 指定完整路径:scripts/patch-host-full.sh user@host /full/path
  • 或者在目标主机上安装 Docker Compose
  • 自动检测搜索:/home/user/Docker/opt/docker/srv/docker

更新后容器启动失败

  • 检查日志:ssh user@host "docker logs container-name"
  • 手动检查:ssh user@host "cd /docker/path && docker compose logs"
  • 如果需要回滚:ssh user@host "cd /docker/path && docker compose down && docker compose up -d"

PatchMon 集成(可选)

有关仪表板监控和计划补丁,请参见 references/patchmon-setup.md

PatchMon 提供:
- 更新状态的 Web 仪表板
- 每台主机的包跟踪
- 安全更新高亮显示
- 更新历史记录

安全注意事项

  • 免密码 sudo 是自动化所必需的
  • 限制为特定命令(仅 aptdocker
  • 使用 /etc/sudoers.d/ 文件(更易于管理)
  • SSH 密钥 应受到保护
  • 尽可能使用受密码保护的密钥
  • 限制密钥权限:chmod 600 ~/.ssh/id_rsa
  • 在生产环境中应用更新前进行审查
  • 首先使用试运行模式
  • 在暂存环境中测试
  • 在维护窗口期间安排更新
  • 使用 OpenClaw cron 作业进行自动化
  • 与团队协调进行 Docker 更新(短暂停机)

最佳实践

  1. 先测试 - 在应用更改前运行试运行模式
  2. 错开更新 - 不要同时更新所有主机(避免完全中断)
  3. 监控日志 - 更新后检查输出是否有错误
  4. 备份配置 - 将 Docker Compose 文件保存在版本控制中
  5. 明智安排时间 - 在低流量窗口期间更新
  6. 记录路径 - 维护基础设施的配置文件
  7. 需要时重启 - 内核更新需要重启(未自动化)

重启管理

脚本不会自动重启主机。更新后:

  1. 检查是否需要重启:ssh user@host "[ -f /var/run/reboot-required ] && echo YES || echo NO"
  2. 在维护窗口期间安排手动重启
  3. 使用 PatchMon 仪表板跟踪重启需求

与 OpenClaw 集成

按计划运行更新

为自动夜间补丁创建 cron 作业:

cron add --name "夜间服务器补丁" \
  --schedule "0 2 * * *" \
  --task "cd ~/.openclaw/workspace/skills/linux-patcher && scripts/patch-auto.sh"

或仅系统包模式:

cron add --name "夜间系统包更新" \
  --schedule "0 2 * * *" \
  --task "cd ~/.openclaw/workspace/skills/linux-patcher && scripts/patch-auto.sh --skip-docker"

通过聊天运行更新

只需询问 OpenClaw

3 次点击  ∙  0 人收藏  
登录后收藏  
目前尚无回复
0 条回复
About   ·   Help   ·    
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
Developed with Cursor