supervisor+cesi多服务器进程集中管理

最近由于管理的服务器比较多啊,难免疏忽有的服务就挂了,实在不想被老板天天挂念着我。。。。所以我毅然决然找个工具来管理一下,需求如下:

  • 必须有web界面,可以界面操作(我这么懒。。。)
  • 能够服务挂了自动重启(不想让老板半夜想我哈哈)

找了半天supervisor比较符合,但是他是单机操作,之前有人在github上发现了supervisor_monitor,但是现在官方推荐cesi比较好,最后不得不吐槽一下,网上的教程真的是五花八门但是基本上都是太基础了…,所以自行研究了一番成功的可以部署在五台服务器,并且用一台机器上的cesi管理他们,真香啊。

安装supervisor

首先说下这个是需要五台服务器都要安装的,包括两部分supervisord(服务端)、supervisorctl(客户端)
  1. 首先安装
#通过apt安装不推荐,官网文档说了 这个要落后pip数个版本
sudo apt-get install supervisor

#通过pip安装,强烈推荐, 之前需要将默认python环境为python3
pip install supervisor
  1. 生成默认配置文件
# root 用户
echo_supervisord_conf > /etc/supervisord.conf

# 普通用户
echo_supervisord_conf | sudo tee /etc/supervisord.conf

# 修改下列参数
[include]
files = /etc/supervisor.d/*.conf    #切记下面supervisorctl配置项目的conf 要放在这里!!!!!!!!!!!!

#想要cesi管理需要打开web设置,其中账号密码 需要和下列的supervisorctl的一样
[inet_http_server]         ; inet (TCP) server disabled by default
port=0.0.0.0:9001        ; ip_address:port specifier, *:port for all iface
username=admin              ; default is no username (open server)
password=******               ; default is no password (open server)

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
serverurl=http://0.0.0.0:9001 ; use an http:// url to specify an inet socket
username=admin              ; should be same as in [*_http_server] if set
password=******
  1. 启动服务端, supervisord这是服务端线程,基本杀不死,启动即可。
# root 用户
supervisord

# 普通用户, 先将log文件权限修改一下,默认位置/tmp/supervisro/*.log
sudo supervisord 

# 可以重启服务端
supervisorctl reload

#报错的时候杀不掉
sudo rm -r /tmp/supervisor.sock
  1. 配置客户端
#介绍如下,根据自己的需求来配置
command=/bin/cat              ; 程序运行命令,建议使用绝对路径。
process_name=%(program_name)s ; 程序名称,可用的变量有 `group_name`, `host_node_name`, `process_num`, `program_name`, `here`(配置文件目录)。 一般程序需要运行多个副本的情况会使用。后面会有例子。
numprocs=1                    ; 程序运行的副本个数,默认为1,如果值大于1,则`process_name` 必须包含 `%(process_num)s`
numprocs_start=0              ; `%(process_num)s`起始数字,默认为0
00=/tmp                ; 程序运行的所在目录,相当于先cd到指定目录,然后运行程序。
umask=022                     ; umask for process (default None)
priority=999                  ; 程序操作的的优先级,例如在start all/stop all,高优先级的程序会先关闭和重启。
autostart=true                ; 在supervisord启动时自动启动,默认为true
startsecs=1                   ; 程序启动前等待时间等待时间。默认为1。
startretries=3                ; 尝试重启最大次数。默认为3。
autorestart=unexpected        ; 是否自动重启,可选参数为 false, unexpected, true。如果为false则不自动重启,如果为unexpected表示如果程序退出信号不在 `exitcodes` 中,则自动重启。默认为unexpected
exitcodes=0,2                 ; 程序退出码。配合`autorestart`使用。默认为 0,2
stopsignal=QUIT               ; 杀死进程是发送的信号,默认为TREM。
stopwaitsecs=10               ; 发送SIGKILL信号前最大等待时间。默认为10。
user                          ; 以指定用户身份启动程序。默认为当前用户。
stopasgroup=false             ; 是否向子进程发送停止信号,这对于Flask的debug模式很有用处,如果设置为true,则不向子进程发送停止信号。默认为false
killasgroup=false             ; 是否向子进程发送kill信号,默认为false
redirect_stderr=false         ; 将错误输出定向到标准输出,默认为false
stdout_logfile=/a/path        ; 标准输出日志路径,可选参数为 `自定义` `AUTO` `NONE`,`自定义`将日志写到自定义路径,可用的变量有`group_name`, `host_node_name`, `process_num`, `program_name`, `here`(配置文件目录);`NONE`不创建日志;`AUTO` 又supervisord自动选择路径,并且当supervisord服务重新启动时原来自动创建的日志以及日志的备份文件会被删除。默认为AUTO
stdout_logfile_maxbytes=1MB   ; 标准输出日志单个文件最大大小,如果超过指定大小会将日志文件备份,可用的单位 KB MB GB。如果设置为0则表示不限制文件大小。默认为50MB
stdout_logfile_backups=10     ; 标准输出日志文件最大备份数。默认为10
stdout_capture_maxbytes=1MB   ; 当进程处于“stdout capture mode”模式下写入到FIFO队列最大字节数,可用单位 KB MB GB。默认为0,详细说明见[capture-mode](http://supervisord.org/logging.html#capture-mode)
stdout_events_enabled=false   ; 
                              ;以下配置项配置错误输出的日志参数。和上面标准输出配置相同。
stderr_logfile=/a/path        ;
stderr_logfile_maxbytes=1MB   ;
stderr_logfile_backups=10     ;
stderr_capture_maxbytes=1MB   ;
stderr_events_enabled=false   ;
environment=A="1",B="2"       ; 环境变量设置,可用的变量有 `group_name`, `host_node_name`, `process_num`, `program_name`, `here`。 默认为空。
serverurl=AUTO                ; override serverurl computation (childutils)

# 这是一个demo
[program:app] ; 程序名称,在 supervisorctl 中通过这个值来对程序进行一系列的操作
autorestart=True      ; 程序异常退出后自动重启
autostart=True        ; 在 supervisord 启动的时候也自动启动
redirect_stderr=True  ; 把 stderr 重定向到 stdout,默认 false
environment=PATH="/home/app_env/bin"  ; 可以通过 environment 来添加需要的环境变量,一种常见的用法是使用指定的 virtualenv 环境
command=python server.py  ; 启动命令,与手动在命令行启动的命令是一样的, 尽量用全路径
user=ubuntu           ; 用哪个用户启动
directory=/home/app/  ; 程序的启动目录
stdout_logfile_maxbytes = 20MB  ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20     ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /data/logs/usercenter_stdout.log


#其实就几个比较实用 
#启动命令
command=/home/jiangnan/anaconda3/bin/python  -m http.server 28888
#挂掉重启
autostart=true
autorestart=true
startsecs=3
#日志的处理
redirect_stderr = true
stdout_logfile = /etc/supervisord.d/log/confd.log # 日志文件配置,尽量放在/var/log或者项目下面


#简洁的配置就是
[program:simplehttpserver]
command=/home/jiangnan/anaconda3/bin/python  -m http.server 28888
autostart=true
autorestart=true
startsecs=3
redirect_stderr = true
stdout_logfile = /etc/supervisord.d/log/confd.log # 日志文件配置,尽量放在/var/log或者项目下面

# 将配置好的上述文件命名为simplehttpserver.conf(名字自己定义,他看的是program这个参数启动),放在之前配置的files = /etc/supervisor.d/*.conf
  1. 启动客户端supervisorctl,配置完后重新启动
# 常用命令如下
supervisordctl status 查看进程运行状态
supervisordctl start 进程名 启动进程
supervisordctl stop 进程名 关闭进程
supervisordctl restart 进程名 重启进程
supervisordctl update 重新载入配置文件
supervisordctl shutdown 关闭supervisord
supervisordctl clear 进程名 清空进程日志
supervisordctl 进入到交互模式下。使用help查看所有命令。
start stop restart + all 表示启动,关闭,重启所有进程

安装cesi

说明
这个只需要在一个顺眼的服务器上安装一个就可以了
  1. 首先安装依赖环境
# On Ubuntu [18.04, 16.04, 14.04]
sudo apt install -y git python3 python3-pip python3-venv
# On Centos 7
sudo yum install -y git epel-release
sudo yum install -y python34 python34-pip python34-venv
# On Fedora 28
sudo dnf install -y git python3 python3-pip python3-venv

2.安装cesi,比较推荐的集成到系统中作为service进行使用

export CESI_SETUP_PATH=/opt/cesi
mkdir ${CESI_SETUP_PATH}
cd ${CESI_SETUP_PATH}

# Download the project to CESI_SETUP_PATH directory, 如果wget不行 直接用网页访问下载
wget https://github.com/gamegos/cesi/releases/download/v2.6.8/cesi-extended.tar.gz -O cesi.tar.gz
tar -xvf cesi.tar.gz

# Create virtual environment and install requirement packages
python3 -m venv venv
source venv/bin/activate
(venv) $ pip3 install -r requirements.txt
(venv) $ deactivate   # Deactivate virtual environment

# Build ui (First you must install dependencies for ui -> yarn) - Optional
cd ${CESI_SETUP_PATH}/cesi/ui
yarn install
yarn build

# Create cesi.conf.toml file and update cesi.conf.toml for your environment.
# Config file documentation can be found inside default file.
# (You must create cesi.conf in the etc directory for cesi.service)
sudo cp ${CESI_SETUP_PATH}/defaults/cesi.conf.toml /etc/cesi.conf.toml

# Run as a service
sudo cp ${CESI_SETUP_PATH}/defaults/cesi.service /etc/systemd/system/cesi.service
sudo systemctl daemon-reload
sudo systemctl start cesi

3.配置/etc/cesi.conf.toml,根据下列参考进行修改

database = "sqlite:///users.db" # Relative path
activity_log = "/home/cesi/logs/activity.log" # File path for CeSI logs
admin_username = "admin" # Username of admin user
admin_password = "admin" # Password of admin user

[[nodes]]
name = "node1"  #节点名称,自定义
environment = "TEST" #这个可以理解为进程分组
username = "admin"  #远程主机supervisor的web主机帐号密码
password = "admin"  #密码不支持特殊字符,如果web成功监听远程主机但是无法选中操作,原因大都基于此。
host = "172.16.23.102"
port = "9001"

[[nodes]]
name = "node2"
environment = "TEST"
username = "admin"
password = "pass123"
host = "172.16.23.241"
port = "9001"


#如果出现无法启动的时候可以使用一下命令 进行debug比较方便
python /opt/cesi/cesi/run.py --config-file /etc/cesi.conf.toml

完成,又可以愉快的摸鱼了。。。

网上教程千千万,只有这里最全面,看完记得点个赞!!!!