Troop是基于Go语言开发的运维自动化管理工具,能够对服务器实现批量操作,并且完美支持Linux和Windows系统。
git clone https://github.com/troopstack/troop
cd troop
./control build
- 服务端:General
- 客户端:Scout
- 文件服务器:FileManager
- 命令行工具:Client
- General: Troop系统中的服务端,是所有Scout的控制器。
- Scout: Troop系统中的客户端,是运行在每台服务器上的Agent。
- 握手: 密钥交换过程,服务端和客户端互相交换并保存对方的「RSA公钥」和「AES密钥」。
- 高可用:Scout和General通过单向RPC通信,Server无状态可横向扩缩
- 安全性:传输过程中的所有数据都通过RSA或旋转AES加密
- 速度快:充分利用Go语言的特性提高性能
- 可扩展:任何语言编写的脚本或二进制文件,可作为插件下发给Scout
- 自升级:Scout和插件互相管理,通过Scout管理插件的版本,反过来通过插件也能管理Scout的版本
- API调用
- 命令行工具
- 检测连通性
- 执行Command
- 推送文件
- 指定一个或多个主机名执行
- 指定操作系统执行
- 指定带Tag的主机执行
- 指定带Tag的主机中任意一台执行
Troop服务端和客户端之间的交互通过公私钥和旋转密钥来加密数据。
- 客户端第一次启动时会生成一对自己的「RSA密钥」。
- 客户端和服务端每次重启都会重新生成自己的「AES密钥」。
- 客户端每次重启都会向服务端发起一次握手,把主机信息包括公钥和AES推送给服务端,服务端接收校验后保存主机信息,并返回自己的AES给客户端保存。
- 服务端每次重启都会通知所有客户端重新握手。
- 客户端RSA密钥(A):为了保证B密钥不泄露,服务端向客户端传输B密钥时通过A密钥加密。
- 服务端AES密钥(B):服务端向客户端推送的消息使用B密钥加密。
- 客户端AES密钥(C):客户端向服务端推送任务结果使用C密钥加密。
使用插件来扩展功能,来完成一些个性化任务。
插件是任意编程语言编写的脚本打包成的二进制文件,并且提供执行参数。所有插件通过Git管理,自动下发到Scout。
Troop自带了ScoutManager插件。如果成千上万台机器上安装了Scout,Scout的更新维护就成了大问题。服务端可以向ScoutManager下发停止、重启、升级Scout等任务。从而实现自升级,不需要手动到服务器上维护Scout。
插件通过规范的文件名来管理版本。
- Linux:[插件名]-[操作系统]-v[版本号]
- Windows:[插件名]-[操作系统]-v[版本号].exe
如ScoutManager插件:
- Linux: scout_manager-linux-v1.0.2
- Windows: scout_manager-win-v1.0.2.exe
服务 | 内存 |
---|---|
General | 72MB |
FM | 50MB |
Scout | 6MB |
场景 | 耗时(s) | 成功率(成功 / 所有) | ||||
---|---|---|---|---|---|---|
Troop | SaltStack | Ansible | Troop | SaltStack | Ansible | |
ifconfig命令测试 | 0.230 | 0.735 | 5.557 | 15 / 15 | 15 / 15 | 15 / 15 |
小文件(21Byte)分发 | 0.302 | 0.612 | 6.368 | 15 / 15 | 15 / 15 | 15 / 15 |
大文件(30k)分发 | 0.355 | 0.672 | 6.292 | 15 / 15 | 15 / 15 | 15 / 15 |
文件读取 | 0.192 | 0.740 | 5.519 | 15 / 15 | 15 / 15 | 15 / 15 |
批量脚本执行(5s等待) | 5.208 | 6.032 | 7.614 | 15 / 15 | 15 / 15 | 15 / 15 |
多机器(45台,5s等待) | 5.495 | 6.937 | 6.889 | 45 / 45 | 45 / 45 | 45 / 45 |
Troop is released under the Apache 2.0 license. See LICENSE。