|
1 | 1 | <img src="https://github.com/troopstack/troop/raw/master/assets/troop.png" width="200"> |
2 | 2 | <br> |
3 | | -Troop is an operation and maintenance automation infrastructure, a server centralized management system. |
| 3 | +Troop是基于Go语言开发的运维自动化管理工具,能够对服务器实现批量操作,并且完美支持Linux和Windows系统。 |
4 | 4 |
|
5 | | -## Documentations |
6 | | -- [Getting Started](https://github.com/kurolz/troop-service) |
7 | | -- [Troop API](https://troop.docs.apiary.io/) |
8 | | -- [Architecture](https://www.processon.com/view/link/5dc23dace4b04913a28be048) |
9 | 5 |
|
10 | | -## Build from source |
| 6 | +## 文档 |
| 7 | +- [快速安装](https://github.com/kurolz/troop-service) |
| 8 | +- [API文档](https://troop.docs.apiary.io/) |
11 | 9 |
|
12 | | -```bash |
| 10 | +## 源码启动 |
| 11 | +```shell |
13 | 12 | git clone https://github.com/troopstack/troop |
14 | 13 | cd troop |
15 | 14 | ./control build |
16 | 15 | ``` |
17 | 16 |
|
18 | | -## Contributors |
| 17 | +## 模块 |
| 18 | +- 服务端:General |
| 19 | +- 客户端:Scout |
| 20 | +- 文件服务器:FileManager |
| 21 | +- 命令行工具:Client |
| 22 | + |
| 23 | +## 类或术语说明 |
| 24 | +- General: Troop系统中的服务端,是所有Scout的控制器。 |
| 25 | +- Scout: Troop系统中的客户端,是运行在每台服务器上的Agent。 |
| 26 | +- 握手: 密钥交换过程,服务端和客户端互相交换并保存对方的「RSA公钥」和「AES密钥」。 |
| 27 | + |
| 28 | +## 特点 |
| 29 | +- 高可用:Scout和General通过单向RPC通信,Server无状态可横向扩缩 |
| 30 | +- 安全性:传输过程中的所有数据都通过RSA或旋转AES加密 |
| 31 | +- 速度快:充分利用Go语言的特性提高性能 |
| 32 | +- 可扩展:任何语言编写的脚本或二进制文件,可作为插件下发给Scout |
| 33 | +- 自升级:Scout和插件互相管理,通过Scout管理插件的版本,反过来通过插件也能管理Scout的版本 |
| 34 | + |
| 35 | +## 用户交互 |
| 36 | +- API调用 |
| 37 | +- 命令行工具 |
| 38 | + |
| 39 | +## 系统架构图 |
| 40 | + |
| 41 | + |
| 42 | +## 任务下发 |
| 43 | +##### 默认支持三种基础任务: |
| 44 | +- 检测连通性 |
| 45 | +- 执行Command |
| 46 | +- 推送文件 |
| 47 | + |
| 48 | +##### 有四种指定任务执行主机的方式: |
| 49 | +1. 指定一个或多个主机名执行 |
| 50 | +3. 指定操作系统执行 |
| 51 | +4. 指定带Tag的主机执行 |
| 52 | +5. 指定带Tag的主机中任意一台执行 |
| 53 | + |
| 54 | +##### 任务下发过程如下图: |
| 55 | + |
| 56 | + |
| 57 | +## 数据安全性 |
| 58 | +Troop服务端和客户端之间的交互通过公私钥和旋转密钥来加密数据。 |
| 59 | +- 客户端第一次启动时会生成一对自己的「RSA密钥」。 |
| 60 | +- 客户端和服务端每次重启都会重新生成自己的「AES密钥」。 |
| 61 | +- 客户端每次重启都会向服务端发起一次握手,把主机信息包括公钥和AES推送给服务端,服务端接收校验后保存主机信息,并返回自己的AES给客户端保存。 |
| 62 | +- 服务端每次重启都会通知所有客户端重新握手。 |
| 63 | + |
| 64 | +##### 密钥使用: |
| 65 | +- 客户端RSA密钥(A):为了保证B密钥不泄露,服务端向客户端传输B密钥时通过A密钥加密。 |
| 66 | +- 服务端AES密钥(B):服务端向客户端推送的消息使用B密钥加密。 |
| 67 | +- 客户端AES密钥(C):客户端向服务端推送任务结果使用C密钥加密。 |
| 68 | + |
| 69 | + |
| 70 | +##### 客户端和服务端握手交换密钥的过程如下图: |
| 71 | + |
| 72 | + |
| 73 | +## 插件 |
| 74 | +使用插件来扩展功能,来完成一些个性化任务。 |
| 75 | + |
| 76 | +插件是任意编程语言编写的脚本打包成的二进制文件,并且提供执行参数。所有插件通过Git管理,自动下发到Scout。 |
| 77 | + |
| 78 | +Troop自带了**ScoutManager**插件。如果成千上万台机器上安装了Scout,Scout的更新维护就成了大问题。服务端可以向ScoutManager下发停止、重启、升级Scout等任务。从而实现自升级,不需要手动到服务器上维护Scout。 |
| 79 | + |
| 80 | +插件通过规范的文件名来管理版本。 |
| 81 | + |
| 82 | +##### 插件命名规则: |
| 83 | +- **Linux**:[插件名]-[操作系统]-v[版本号] |
| 84 | +- **Windows**:[插件名]-[操作系统]-v[版本号].exe |
| 85 | + |
| 86 | +如ScoutManager插件: |
| 87 | +- **Linux**: scout_manager-linux-v1.0.2 |
| 88 | +- **Windows**: scout_manager-win-v1.0.2.exe |
| 89 | + |
| 90 | + |
| 91 | +## 空闲内存占用 |
| 92 | + |
| 93 | +| 服务 | 内存 | |
| 94 | +|------|------| |
| 95 | +| General | 72MB | |
| 96 | +| FM | 50MB | |
| 97 | +| Scout | 6MB | |
| 98 | + |
| 99 | +## 性能测试对比 |
| 100 | +<table> |
| 101 | + <tr> |
| 102 | + <th rowspan="3">场景</th> |
| 103 | + <th colspan="3">耗时(s)</th> |
| 104 | + <th colspan="3">成功率(成功 / 所有)</th> |
| 105 | + <tr> |
| 106 | + <tr> |
| 107 | + <th>Troop</th> |
| 108 | + <th>SaltStack</th> |
| 109 | + <th>Ansible</th> |
| 110 | + <th>Troop</th> |
| 111 | + <th>SaltStack</th> |
| 112 | + <th>Ansible</th> |
| 113 | + <tr> |
| 114 | + <tr> |
| 115 | + <td>ifconfig命令测试</td> |
| 116 | + <td>0.230</td> |
| 117 | + <td>0.735</td> |
| 118 | + <td>5.557</td> |
| 119 | + <td>15 / 15</td> |
| 120 | + <td>15 / 15</td> |
| 121 | + <td>15 / 15</td> |
| 122 | + </tr> |
| 123 | + <tr> |
| 124 | + <td>小文件(21Byte)分发</td> |
| 125 | + <td>0.302</td> |
| 126 | + <td>0.612</td> |
| 127 | + <td>6.368</td> |
| 128 | + <td>15 / 15</td> |
| 129 | + <td>15 / 15</td> |
| 130 | + <td>15 / 15</td> |
| 131 | + </tr> |
| 132 | + <tr> |
| 133 | + <td>大文件(30k)分发</td> |
| 134 | + <td>0.355</td> |
| 135 | + <td>0.672</td> |
| 136 | + <td>6.292</td> |
| 137 | + <td>15 / 15</td> |
| 138 | + <td>15 / 15</td> |
| 139 | + <td>15 / 15</td> |
| 140 | + </tr> |
| 141 | + <tr> |
| 142 | + <td>文件读取</td> |
| 143 | + <td>0.192</td> |
| 144 | + <td>0.740</td> |
| 145 | + <td>5.519</td> |
| 146 | + <td>15 / 15</td> |
| 147 | + <td>15 / 15</td> |
| 148 | + <td>15 / 15</td> |
| 149 | + </tr> |
| 150 | + <tr> |
| 151 | + <td>批量脚本执行(5s等待)</td> |
| 152 | + <td>5.208</td> |
| 153 | + <td>6.032</td> |
| 154 | + <td>7.614</td> |
| 155 | + <td>15 / 15</td> |
| 156 | + <td>15 / 15</td> |
| 157 | + <td>15 / 15</td> |
| 158 | + </tr> |
| 159 | + <tr> |
| 160 | + <td>多机器(45台,5s等待)</td> |
| 161 | + <td>5.495</td> |
| 162 | + <td>6.937</td> |
| 163 | + <td>6.889</td> |
| 164 | + <td>45 / 45</td> |
| 165 | + <td>45 / 45</td> |
| 166 | + <td>45 / 45</td> |
| 167 | + </tr> |
| 168 | +</table> |
| 169 | + |
| 170 | +## 开发者 |
19 | 171 |
|
20 | 172 | <a href="https://github.com/troopstack/troop/contributors"><img src="https://opencollective.com/troop/contributors.svg?button=false" /></a> |
21 | 173 |
|
|
0 commit comments