SSH Deploy Skill - 通用 SSH 远程部署工具
📋 概述
通过 paramiko + 自定义部署引擎管理任意 Linux 服务器。本技能已针对国内网络环境进行完整优化。
🚀 快速开始
1. 首次使用
cd /root/.openclaw/workspace/skills/ssh-deploy-skill
# 自动设置(检查依赖、创建配置)
bash scripts/setup.sh
# 手动安装依赖(如果自动失败)
pip3 install --user paramiko
2. 配置服务器(两种方式)
方式 A:使用 inventory.json(原有方式)
编辑 ~/.ssh-deploy/inventory.json 文件,添加你的服务器信息,或使用命令行添加:
python3 scripts/inventory.py add web-01 \
--host 192.168.1.101 \
--user root \
--ssh-key ~/.ssh/id_rsa \
--groups production,web \
--tags "阿里云"
配置文件位置:所有服务器配置都保存在 ~/.ssh-deploy/inventory.json 文件中。
方式 B:直接从 ~/.ssh/config 读取(新增)
如果你已经在 ~/.ssh/config 中配置了 Host 条目,无需任何额外配置,可以直接使用这些 host 名:
# ~/.ssh/config 内容示例
Host dy-c1
HostName 101.126.92.30
User root
IdentityFile ~/.ssh/mypc_id_rsa
Port 22
# 直接使用 host 名执行命令
python3 scripts/deploy.py exec dy-c1 "ls -la /opt"
系统会自动解析 ~/.ssh/config 中的 Host、HostName、Port、User、IdentityFile 等字段。
注意:从 SSH config 加载的服务器是动态只读的,不会保存到
inventory.json。如果你想添加分组或标签,请使用inventory.py add将其导入。
3. 执行远程命令
# 单台服务器
python3 scripts/deploy.py exec web-01 "uptime && df -h"
# 批量执行(按分组)
python3 scripts/deploy.py exec group:production "docker ps"
# 批量执行(按标签)
python3 scripts/deploy.py exec tag:"阿里云" "systemctl status nginx"
# 顺序执行(避免并发过高)
python3 scripts/deploy.py exec group:large "apt update" --sequential
4. 文件传输
# 上传文件
python3 scripts/deploy.py upload web-01 ./nginx.conf /etc/nginx/nginx.conf
# 批量上传(所有分组服务器)
python3 scripts/deploy.py upload group:web ./config.json /opt/app/config.json
# 下载文件
python3 scripts/deploy.py download web-01 /var/log/nginx/access.log ./logs/
5. 使用模板安装软件
所有模板位于 templates/,已预配置国内镜像源。
# 安装 Docker(自动配置国内镜像加速)
cat templates/install_docker.sh | python3 scripts/deploy.py exec tag:docker "bash -s"
# 安装 MySQL(环境变量设置密码)
MYSQL_ROOT_PASSWORD=YourPass123 cat templates/install_mysql.sh | \
python3 scripts/deploy.py exec db-01 "bash -s"
# 基础环境配置(系统更新 + 镜像源)
cat templates/base_setup.sh | python3 scripts/deploy.py exec group:all "bash -s"
📦 安装脚本模板列表
| 模板 | 功能 | 国内镜像优化 | 环境变量 |
|------|------|-------------|----------|
| base_setup.sh | 基础环境配置 | ✅ | - |
| install_git.sh | Git | ❌ | GIT_USER_NAME, GIT_USER_EMAIL |
| install_docker.sh | Docker CE + 加速器 | ✅ | - |
| install_mysql.sh | MySQL 8.0 | ✅ | MYSQL_ROOT_PASSWORD |
| install_postgresql.sh | PostgreSQL 15 | ✅ | PG_VERSION |
| install_nginx.sh | Nginx | ❌ | - |
| install_nodejs.sh | Node.js | ✅(npm) | NODE_VERSION |
| install_redis.sh | Redis | ❌ | - |
| install_python.sh | Python | ✅(pip) | PYTHON_VERSION |
注意:所有已添加的服务器配置保存在
~/.ssh-deploy/inventory.json文件中。
🎯 核心功能
服务器清单管理 (inventory.py)
# 列出所有服务器
python3 scripts/inventory.py list
# 按分组列出
python3 scripts/inventory.py list --group production
# 按标签列出
python3 scripts/inventory.py list --tag "阿里云"
# 添加服务器
python3 scripts/inventory.py add SERVER_NAME \
--host IP_OR_HOSTNAME \
--port 22 \
--user USERNAME \
--ssh-key PATH_TO_KEY \
--groups GROUP1,GROUP2 \
--tags TAG1,TAG2 \
--desc "描述信息"
目标语法(在 deploy.py 中使用):
server-name- 具体服务器group:分组名- 所有该分组的服务器tag:标签名- 所有包含该标签的服务器*- 所有服务器
远程命令执行 (deploy.py)
# 并行批量执行(默认)
python3 scripts/deploy.py exec group:web "docker pull nginx"
# 顺序执行(大 batch 或避免负载过高)
python3 scripts/deploy.py exec group:large "apt upgrade -y" --sequential
# 使用环境变量
export MYSQL_VERSION="8.0"
cat templates/install_mysql.sh | python3 scripts/deploy.py exec db-01 "bash -s"
文件传输
# 上传(单台)
python3 scripts/deploy.py upload web-01 ./local.conf /etc/app/conf.d/conf.conf
# 批量上传
python3 scripts/deploy.py upload group:web ./nginx.conf /etc/nginx/nginx.conf
# 下载
python3 scripts/deploy.py download web-01 /var/log/app.log ./logs/
🌏 国内网络优化
镜像源配置
本技能默认使用阿里云镜像源,已配置:
- Ubuntu/Debian →
mirrors.aliyun.com - CentOS/RHEL →
mirrors.aliyun.com - npm →
registry.npmmirror.com(淘宝) - pip →
mirrors.aliyun.com/pypi/simple - Docker → 中科大、网易、百度加速器
- Go →
goproxy.cn - Maven → 阿里云仓库
详细配置手册:references/mirrors.md
一键配置国内镜像
# 在所有服务器上配置系统镜像源
cat templates/base_setup.sh | python3 scripts/deploy.py exec group:all "bash -s"
# 配置 Docker 加速(在安装docker.sh中已自动执行)
# 如果需要手动配置:
cat <<'EOF' | python3 scripts/deploy.py exec group:all "bash -s"
cat > /etc/docker/daemon.json <<DOCKER
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
DOCKER
systemctl restart docker
EOF
🔒 安全最佳实践
-
SSH 密钥管理
- 使用密钥认证,禁用密码
- 密钥文件权限
chmod 600 ~/.ssh/id_rsa - 不同环境使用不同密钥
-
最小权限
- 创建专用部署用户,不使用 root
- 配置免密码 sudo(仅限必要命令)
- 服务器
sshd_config中:PermitRootLogin no,PasswordAuthentication no
-
敏感信息
- 不在
inventory.json中存储密码 - 使用环境变量传递密码(如
MYSQL_ROOT_PASSWORD) - 配置文件权限设为
640,属主root:appgroup
- 不在
-
审计
- 保留所有部署日志
- 记录执行的命令、服务器、时间、结果
完整安全指南:references/best-practices.md
🐛 故障排查
快速诊断
# 1. 网络测试
ping <host>
telnet <host> 22
# 2. 手动 SSH 测试
ssh -i ~/.ssh/id_rsa root@<host> "uptime"
# 3. 查看连接详情
python3 scripts/deploy.py exec <server> "uptime" 2>&1
# 4. 验证密钥权限
ls -la ~/.ssh/id_rsa*
常见问题
| 问题 | 解决方案 |
|------|----------|
| 连接拒绝/超时 | 检查服务器状态、SSH 服务、防火墙/安全组 |
| Permission denied (publickey) | 检查公钥是否在服务器的 ~/.ssh/authorized_keys,密钥权限 600 |
| sudo: a password is required | 配置免密码 sudo 或使用 root 用户 |
| Command not found | 使用绝对路径或确保 PATH 包含命令 |
| 国内下载慢 | 运行 base_setup.sh 配置镜像源,或参考 docs/mirrors.md |
详细排查手册:references/troubleshooting.md
📊 批量操作示例
场景1:全新服务器初始化
# 1. 添加服务器到清单
python3 scripts/inventory.py add web-01 --host 1.2.3.101 --groups web --tags "生产"
# 2. 基础环境配置(镜像源、工具)
cat templates/base_setup.sh | python3 scripts/deploy.py exec web-01 "bash -s"
# 3. 安装核心软件
cat templates/install_docker.sh | python3 scripts/deploy.py exec web-01 "bash -s"
cat templates/install_nginx.sh | python3 scripts/deploy.py exec web-01 "bash -s"
# 4. 上传应用配置
python3 scripts/deploy.py upload web-01 ./app-config.json /opt/app/config.json
# 5. 启动应用
python3 scripts/deploy.py exec web-01 "docker-compose up -d"
场景2:多台服务器轮询更新
# 灰度发布:先更新第一批
cat deploy-v2.sh | python3 scripts/deploy.py exec tag:"灰度-1" "bash -s"
# 检查监控指标,确认正常...
# 全量发布
cat deploy-v2.sh | python3 scripts/deploy.py exec tag:生产 "bash -s"
场景3:文件同步
# 同步配置文件到所有 Web 服务器
python3 scripts/deploy.py upload group:web ./nginx.conf /etc/nginx/nginx.conf
# 批量重启
python3 scripts/deploy.py exec group:web "nginx -t && systemctl reload nginx"
场景4:巡检与监控
# 批量收集服务器状态
python3 scripts/deploy.py exec "*" "uptime" > uptime-$(date +%F).log
python3 scripts/deploy.py exec "*" "df -h" > disk-$(date +%F).log
python3 scripts/deploy.py exec "*" "docker ps --format 'table {{.Names}}\t{{.Status}}'" > containers-$(date +%F).log
🔄 CI/CD 集成
GitLab CI 示例
stages:
- deploy
deploy_production:
stage: deploy
script:
- pip3 install --user paramiko
- export TARGET="group:production"
- cat deploy.sh | python3 skills/ssh-deploy-skill/scripts/deploy.py exec "$TARGET" "bash -s"
only:
- main
GitHub Actions 示例
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install paramiko
run: pip3 install paramiko
- name: Deploy to servers
run: |
cat deploy.sh | python3 skills/ssh-deploy-skill/scripts/deploy.py exec "group:staging" "bash -s"
🛠️ 开发者指南
添加新的安装模板
- 在
templates/目录创建.sh文件 - 使用
#!/bin/bash和set -e(出错退出) - 检测系统类型并适配(参考现有模板)
- 使用环境变量作为参数,不要硬编码敏感数据
- 添加国内镜像源配置(如适用)
自定义脚本结构
#!/bin/bash
set -e
echo "===== 安装 XXX ====="
# 1. 检测系统
if [ -f /etc/debian_version ]; then
OS="debian"
elif [ -f /etc/redhat-release ]; then
OS="redhat"
else
echo "不支持的系统"
exit 1
fi
# 2. 配置国内镜像(如果需要)
# ...
# 3. 安装软件
if [ "$OS" = "debian" ]; then
apt-get update
apt-get install -y xxx
elif [ "$OS" = "redhat" ]; then
yum install -y xxx
fi
# 4. 启动服务
systemctl start xxx
systemctl enable xxx
echo "XXX 安装完成!"
在 Python 中直接使用库
from inventory import Inventory, Server
from deploy import SSHDeployer
# 加载清单
inv = Inventory()
server = inv.get_server("web-01")
# 创建部署器
deployer = SSHDeployer()
# 执行命令
result = deployer.execute(server, "docker ps")
print(result.success, result.output)
# 上传文件
res = deployer.upload_file(server, "./local.conf", "/etc/conf.d/local.conf")
deployer.close()
📚 更多文档
README.md- 完整使用指南(包含 API 参考)references/mirrors.md- 国内镜像源配置详解references/best-practices.md- 最佳实践和代码示例references/troubleshooting.md- 故障排查完整手册
🤝 贡献
欢迎提交 Issue 和 Pull Request!
📄 许可证
MIT License
Scan to join WeChat group