【Drone插件】利用WebSocket执行SSH命令和上传文件

1,325 阅读1分钟

前言

由于习惯了使用drone做CI/CD,但是某些情况下我们是无法直接通过ssh连接到服务器的。比如我们的服务器在某个专有云内;又或者我们不想把ssh映射到公网;又或者我们无法直接ssh。 于是我们今天的主角就诞生了:drone-remote-agent.

介绍

drone-remote-agent实现通过websocket代理执行ssh命令,支持上传脚本到服务器并且代理执行,并且整个websocket通信都经过加密。

特性

  • 支持批量文件上传
  • 支持批量命令执行
  • 只支持SSH使用账号密码认证
  • 整个通信使用AES+RSA进行加密

开始使用

秘钥公钥生成

openssl genrsa -out rsa_private_key.pem 1024
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

部署服务端

在服务器上部署插件并且以agent模式启动,这里使用docker来示意:

docker pull pumelo/dra
docker run -d -v /path:/path --mode agent --prk /path/rsa_private_key.pem

这里注意下需要把私钥上传到服务器,并且映射到容器内。

Drone中step配置

.drone.yml中新增一个步骤

steps:
  - name: deploy-container
    pull: if-not-exists
    image: pumelo/dra
    volumes:
      - name: wsKey
        path: /dra
    settings:
      agent-endpoint: 10.10.0.27:8080
      ssh-host: 10.10.0.27:22
      ssh-username: root
      ssh-password: 123456
      publicKeyFilePath: /dra/rsa_public_key.pem
      script: # 远程执行脚本
        - docker pull 10.10.0.14:5000/nginx:1.15
        - docker run -d \
        - --name=test-nginx-a \
        - -p8877:80 \
        - 10.10.0.14:5000/nginx:1.15
      upload: # 上传文件列表,只支持文件,文件夹会自动忽略 local:remote
        - ./README.md:/data/README.md

源码

pumelotea/drone-remote-agent: drone通过websocket通道执行ssh脚本 (github.com)