前言

Octopus(章鱼)是58集团自动化运维的核心服务之一,是上层业务运维自动化的基础组件。2013年发展至今,从最初单一提供自动部署功能,到目前的服务器信息采集、Nginx配置管理、服务器权限控制、远程命令执行、文件传输等服务器管控能力。Octopus通过自身插件系统,可实现管控能力的平台化与灵活扩展,以满足各种运维场景下的服务器管控需求。

  整体架构图

python怎么放在服务器上跑 如何在服务器上跑python_脚本启动显示查询频繁被服务器防御

Octopus管理中心基础数据来源于CMDB系统,Octopus Agent运行在每一台服务器上,作为运维基础组件。Agent初始化是服务器交付标准之一,已经绑定在CMDB服务器交付流程,用以保证所有服务器交付以后都可以通过Octopus进行管控。

Octopus Agent启动包括一系列初始化过程:

python怎么放在服务器上跑 如何在服务器上跑python_服务器_02

环境检查

Octopus Agent正常启动后会对服务器运行环境进行标准化检查,验证是否符合CMDB定义的标准化设置。

业务环境初始化

因不同的业务所依赖的软件环境和配置不同,Agent在运行时会根据CMDB中服务器所选择业务类型模板、初始化软件环境及配置,以保证业务运行环境的标准化和一致性。

配置动态加载

因不同的服务器类型、不同的业务场景对Agent的需求不同。为了最小化的占用服务器资源,我们选择对Agent的模块按需加载。Agent启动时,Octopus管理中心会根据CMDB中该服务器的配置信息以及Octopus管理中心的定义进行配置下发,Agent会根据配置信息动态加载所需的模块及配置信息。

自升级

Agent默认加载自升级模块,Octopus管理中心在有新版本发布时会推送消息给Agent端,Agent在收到新版本消息后会下载最新版代码包更新本地代码,然后重新启动自己。Octopus管理中心也可以向指定的服务器推送新版本消息,从而实现Agent版本的灰度发布。自升级功能为Agent的版本发布管理提供了极大的便利,减少Agent自身的运维成本。

自监控

Agent会将自身的运行状态、资源占用情况上报到Octopus管理中心,管理中心根据预定义的指标和策略进行任务控制和告警,以免因Agent过度占用服务器资源影响业务的正常运行。

Octopus 通信方式

上层运维系统通过Octopus API实现对服务器的管控,API和目标服务器上的Agent如何通信是整个Octopus的核心内容之一。

开始Octopus的注册中心完全依赖的Zookeeper。Octopus Agent注册并监听Zookeeper中本机所在的节点,Octopus管理中心接到请求,将其发送到Zookeeper的对应节点,Octopus Agent监听节点收到请求转发到特定模块执行动作。

受限于zookeeper的Watch机制:Watch事件是一个一次性的触发器,也就是数据发生改变时,一个watcher event会被发送到Agent。但是Agent只会收到一次这样的信息,我们在Agent端能持续收到监听是因为zookeeper的客户端Jar帮我们做了再次watch。这里就会有一个问题,虽然有再次watch,但是在高并发情况下就会有丢事件情况,zookeeper只能保证数据的最终一致性。

基于这种机制,对于同一机器上的高并发任务,就会有丢任务的情况。在Octopus早期这个问题还不明显,随着Octopus功能场景越来越丰富,同一台机器上高并发执行多个任务的情况愈发频繁。于是我们对原有通信方式做了优化,如下图:

python怎么放在服务器上跑 如何在服务器上跑python_脚本启动显示查询频繁被服务器防御_03

为了解决高并发情况下丢事件问题,我们引入了额外的分布式队列,用来按顺序存储任务信息。zookeeper的watch仅作为一种通知机制。而真实的任务ID从队列中获取,每次watch到后,都把队列中所有任务执行完为止,这样既解决了高并发丢任务问题,也解决了任务时序的问题。

Octopus管理中心

Octopus系统对外提供的所有能力(除了Octopus Agent本身定时执行的任务),都需要通过Octopus管理中心对外暴露API,所以管理中心是整个Octopus 管控能力的入口,主要包括如下功能:

API模块

API是Octopus系统对外开放管控能力的主要入口,也是上层业务运维自动化的主要依赖的内容之一。根据应用场景的不同,Octopus对外接口分为同步请求和异步请求两种,两种方式的请求流程如下图:

python怎么放在服务器上跑 如何在服务器上跑python_脚本启动显示查询频繁被服务器防御_04

授权管理

管理所有对外API的调用权限,包括白名单管理和Token分配。每个API可配置能访问的白名单IP,每个API都会分配一个调用Token,一些特别的API按照调用方分配不同的Token。对于特殊的场景,不同的Token可操作权限不一样,以保证接口的安全性。

Agent管理 

Agent管理包括单机的管理和按分组的管理,单机管理包括:查看每个Agent的运行状态、资源占用情况、CMDB数据同步情况,同时提供Agent重启、手动/强制升级、下线等远程管理功能。分组的管理包括分组的灰度、全量升级等。

插件管理

业务方根据自己的业务需求开发完自定义的插件,通过本模块上传到插件库,并定义插件的应用策略(比如:按IP、按集群、按机器类型、按环境等)。管理员审核通过后,插件自动下发到指定策略对应的服务器上,Octopus Agent会动态加载新的插件。插件在管理端被下线后,也会即时通知Agent卸载插件,插件都是热插拔的,无需重启Agent。插件的形式包括但不限于Shell、Python、Jar。

Agent配置管理

配置管理模块是动态修改配置的入口,主要管理Agent本身的配置信息,以及业务相关的配置信息。比如:不同环境、不同业务场景加载不同模块,管理员修改完配置后会自动下发到具体服务器上的Agent,根据不同的配置逻辑决定是否更新配置。

统计管理

统计管理模块会实时统计线上线下Octopus Agent的覆盖情况、存活率、各个版本的数量、资源占用等情况按分组展示,便于管理员随时了解所有Agent的状态。

Octopus Agent

Octopus Agent采用模块化设计,Agent启动时,ModuleManager根据具体条件加载相应的模块,在收到命令后,不同的命令由Actuator转发到对应的模块执行。

模块化设计使得添加新功能非常方便,只需要添加新的模块即可,对整体和原有模块完全透明。

python怎么放在服务器上跑 如何在服务器上跑python_python怎么放在服务器上跑_05

从上面的介绍可以看到,Octopus Agent的设计很清晰,不同的管控能力分成不同的模块,可以灵活扩展。只要业务方想在机器上做的事,理论上都可以通过Octopus做到,下面简单介绍一下Octopus Agent的部分功能模块。

服务器信息采集模块

搜集机器磁盘、网卡、内存、CPU等硬件信息、操作系统信息,自动同步给CMDB,用以保证CMDB数据的准确性与实时性,减少人工维护成本和误差;搜集进程、端口信息,排查异常进程和端口,支持安全和监控的异常检测,可以对服务器进行更精细化的管理。

命令执行模块

通过本模块,业务方可以在有权限的机器上执行任何合法的命令和脚本,这里的脚本包括但不限于Shell、Python脚本,支持使用不同用户执行命令/脚本,Python支持不同的版本环境。

部署相关模块

部署系统可能涉及到:FTP、Tomcat、Nginx、SCF、PHP等一系列和部署相关的模块;不同类型的业务应用,涉及到的模块不一样,下图是一个WEB项目的部署过程。

python怎么放在服务器上跑 如何在服务器上跑python_服务器_06

从图中可以看到,部署系统在部署一个WEB项目时,涉及到Octopus Agent的Nginx模块、FTP模块、Tomcat模块等多个模块,不同模块通过不同组合的执行顺序就能支持部署系统完成各种类型的项目部署任务。

服务器权限模块

实时添加服务器权限:支持工单系统授权服务器。

定时下发/动态检测:定时下发服务器权限到具体机器上,有改动自动下发,防止机器权限被恶意篡改。

文件/目录监控模块

文件/目录监控模块是用于监控服务器上特定文件和目录,如果有人恶意篡改,能及时通知相关人做相应的处理。

点对点文件传输

点对点文件传输模块,提供机器之间传输文件和目录的能力。支持同步/异步、通配符、不同用户和权限等基础功能。

之前业务方很多情况加机器之间的互信只是为了传输文件,有了Octopus的文件传输能力,对于这种场景的机器互信就可以关掉了,降低因机器互信而产生的安全风险。

文件传输请求过程如下图:

python怎么放在服务器上跑 如何在服务器上跑python_python怎么放在服务器上跑_07

管理中心接到请求后,往源机器发送启动Http服务命令,启动后将port和token返回给管理中心,管理中心收到请求成功响应后,将ip:port和token发送给目标机器,目标机器通过ip:port和token就可以将原机器上的文件传输到本机了,传输完成后关闭源机器上的Http server,管理中心向目标机器发送完请求后有两种情况:

1. 对于同步请求,管理端会等待文件传输完成之后直接返回调用者;

2. 对于异步请求,管理端发送给目标机器开始传输命令后直接返回,目标机器真正传输完成会回调管理端将结果记录下来,供调用者查询。

文件传输模块还支持以下特性:

1. 根据文件大小自动选择不同的Md5校验策略,兼容效率和安全性。

2. 支持服务端和客户端双向限速,保证不会因为文件传输而影响机器上其他业务。

3. 同一台源机器的高并发请求,提供Http Server池,多个不同业务的请求,可以共用还没有关闭的Http Server。

因为文件传输对于绝大多数机器来说是低频操作,为了减少对机器资源的占用,Http Server是需要时才启动,使用完马上关闭。对于高频的文件传输请求,比如日志文件的传输,Http Server池使得Server在关闭之前可以共用,不需要频繁启动和关闭,这样同时兼顾低频机器的资源占用和高频机器的效率问题。

总结

Octopus作为58自动化运维的基础服务之一,目前已运行在万级节点上,为自动化运维的其他业务提供支撑。本文主要介绍Octopus整体架构和Octopus的部分模块及功能。其实还有很多细节内容没有介绍,比如Octopus Agent探活、Octopus Manager和Octopus Agent之间的通信细节、插件的支持等;后续Octopus也会持续优化和升级,欢迎感兴趣的同学一起沟通交流。