Cesi介绍
CeSi(Centralized Supervisor Interface) 是 Supervisor 官方推荐的集中化管理 Supervisor 实例的 Web UI,该工具是用 Python 编写
Cesi安装步骤
export CESI_SETUP_PATH=~/cesi
mkdir ${CESI_SETUP_PATH}
cd ${CESI_SETUP_PATH}
wget https://github.com/gamegos/cesi/releases/download/v2.6.7/cesi-extended.tar.gz -O cesi.tar.gz
tar -xvf cesi.tar.gz
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
pip3 install --upgrade pip
pip install -r requirements.txt
python3 ${CESI_SETUP_PATH}/cesi/run.py --config-file ${CESI_SETUP_PATH}/defaults/cesi.conf.toml
pip3 install --upgrade sqlalchemy==1.3.23
python3 ${CESI_SETUP_PATH}/cesi/run.py --config-file ${CESI_SETUP_PATH}/defaults/cesi.conf.toml
[root@localhost defaults]# vi cesi.conf.toml # This is the main CeSI toml configuration file. It contains CeSI web application and # supervisord information to connect # This is the CeSI's own configuration. [cesi] # Database Uri database = "sqlite:///users.db" # Relative path # Etc # This is the main CeSI toml configuration file. It contains CeSI web application and # supervisord information to connect # This is the CeSI's own configuration. [cesi] # Database Uri database = "sqlite:///users.db" # Relative path # Etc #database = "sqlite:////opt/cesi/< version >/users.db" # Absolute path #database = "postgres://<user>:<password>@localhost:5432/<database_name>" #database = "mysql+pymysql://<user>:<password>@localhost:3306/<database_name>" activity_log = "activity.log" # File path for CeSI logs admin_username = "admin" # Username of admin user admin_password = "admin" # Password of admin user # This is the definition section for new supervisord node. # [[nodes]] # name = "api" # (String) Unique name for supervisord node. # environment = "" # (String) The environment name provides logical grouping of supervisord nodes. It can be used as filtering option in the UI. # username = "" # (String) Username of the XML-RPC interface of supervisord Set nothing if no username is configured # password = "" # (String) Password of the XML-RPC interface of supervisord. Set nothing if no username is configured # host = "127.0.0.1" # (String) Host of the XML-RPC interface of supervisord # port = "9001" # (String) Port of the XML-RPC interface of supervisord # Default supervisord nodes [[nodes]] name = "102-server" environment = "102" username = "" password = "" host = "192.168.30.102" port = "9001" [[nodes]] name = "105-server" environment = "105" username = "" password = "" host = "192.168.30.105" port = "9001"
安装完成后打开web页面第一次登录报错
Cesi正常管理
可以远程操作已经连接上主机上的supervisor
成功远程启停服务
ansible批量安装supervisor服务
ansible通过源码包安装并自动注册成service,然后ansible就可以通过service模块来对安装好的服务进行操作
- name: Create taishi dir file: path={{ taishi_dir }} state=directory owner={{ taishi_user }} group={{ taishi_user }} recurse=yes tags: base - name: Create logs dir file: path={{ taishi_dir }}/logs state=directory owner={{ taishi_user }} group={{ taishi_user }} recurse=yes tags: base - name: Create etc dir file: path={{ taishi_dir }}/etc state=directory owner={{ taishi_user }} group={{ taishi_user }} recurse=yes tags: base - name: Create supervisord dir file: path={{ taishi_dir }}/etc/supervisord state=directory owner={{ taishi_user }} group={{ taishi_user }} recurse=yes tags: base - name: Create tmp dir file: path={{ taishi_dir }}/tmp state=directory owner={{ taishi_user }} group={{ taishi_user }} recurse=yes tags: base - name: Copy the supervisorcnf to {{ groups["all"] }} template: src=supervisord.conf.j2 dest="{{ taishi_dir }}/etc/supervisord.conf" owner={{ taishi_user }} group={{ taishi_user }} mode=0755 tags: supervisor - name: Copy the start_taishi to {{ groups["all"] }} template: src=start_taishi.sh.j2 dest="{{ taishi_dir }}/etc/start_taishi.sh" owner={{ taishi_user }} group={{ taishi_user }} mode=0755 tags: supervisor - name: Copy the taishiservice to {{ groups["all"] }} template: src=taishi.service.j2 dest="/etc/systemd/system/taishi.service" owner={{ taishi_user }} group={{ taishi_user }} mode=0755 tags: supervisor - name: Copy elementtree to {{ groups["all"] }} copy: src=../../common/packages/supervisor/elementtree-1.2.7-20070827-preview.zip dest=/tmp tags: supervisor - name: Copy meld3-0.6.5.tar.gz to {{ groups["all"] }} copy: src=../../common/packages/supervisor/meld3-0.6.5.tar.gz dest=/tmp tags: supervisor - name: Copy setuptools-24.0.2.tar.gz to {{ groups["all"] }} copy: src=../../common/packages/supervisor/setuptools-24.0.2.tar.gz dest=/tmp tags: supervisor - name: Copy supervisor-3.3.0.tar.gz to {{ groups["all"] }} copy: src=../../common/packages/supervisor/supervisor-3.3.0.tar.gz dest=/tmp tags: supervisor - name: Install setuptools to {{ groups["all"] }} shell: "cd /tmp && tar -zxvf setuptools-24.0.2.tar.gz && cd setuptools-24.0.2/ && python setup.py install" tags: supervisor - name: Install elementtree to {{ groups["all"] }} shell: "cd /tmp && easy_install elementtree-1.2.7-20070827-preview.zip" tags: supervisor - name: Install meld3-0.6.5 to {{ groups["all"] }} shell: "cd /tmp && easy_install meld3-0.6.5.tar.gz" tags: supervisor - name: Install supervisor to {{ groups["all"] }} shell: "cd /tmp && easy_install supervisor-3.3.0.tar.gz" tags: supervisor - name: reload taishiservice to {{ groups["all"] }} shell: "systemctl daemon-reload" tags: supervisor - name: start taishiservice to {{ groups["all"] }} service: name=taishi state=started tags: supervisor - name: "chown taishi dir to {{ taishi_user }}" file: path="{{ taishi_dir }}" state=directory owner={{ taishi_user }} group={{ taishi_user }} recurse=yes tags: base
#Taishi Enterprise supervisor config file. [unix_http_server] file={{ taishi_dir }}/tmp/supervisor.sock ; (the path to the socket file) chown={{ taishi_user }} ; [inet_http_server] ; inet (TCP) server disabled by default port=*:9001 ; (ip_address:port specifier, *:port for all iface) ;username=user ; (default is no username (open server)) ;password=123 ; (default is no password (open server) [supervisord] logfile={{ taishi_dir }}/logs/supervisord.log ; (main log file;default $CWD/supervisord.log) logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB) logfile_backups=10 ; (num of main logfile rotation backups;default 10) loglevel=info ; (log level;default info; others: debug,warn,trace) pidfile={{ taishi_dir }}/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid) nodaemon=false ; (start in foreground if true;default false) user={{ taishi_user }} ; (default is current user, required if root) minfds=655350 ; (min. avail startup file descriptors;default 1024) minprocs=655350 ; (min. avail process descriptors;default 200) ;umask=022 ; (process file creation umask;default 022) ;user=admin ; (default is current user, required if root) ;identifier=supervisor ; (supervisord identifier, default is 'supervisor') ;directory=/tmp ; (default is not to cd during start) ;nocleanup=true ; (don't clean up tempfiles at start;default false) ;childlogdir=/tmp ; ('AUTO' child log dir, default $TEMP) ;environment=KEY="value" ; (key value pairs to add to environment) ;strip_ansi=false ; (strip ansi escape codes in logs; def. false) [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix://{{ taishi_dir }}/tmp/supervisor.sock ; use a unix:// URL for a unix socket [include] files={{ taishi_dir }}/etc/supervisord/*.ini
#!/bin/bash #/usr/bin/supervisord -c __install_dir__/etc/supervisord.conf # dpkg-reconfigure dash /usr/bin/supervisord -c {{ taishi_dir }}/etc/supervisord.conf
# taishi enterprise supervisord service for systemd (CentOS 7.0+) [Unit] Description=taishi Enterprise Supervisor daemon After=taishi.service [Service] Type=forking LimitNOFILE=655350 LimitNPROC=655350 ExecStart=/bin/bash {{ taishi_dir }}/etc/start_taishi.sh ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown ExecReload=/usr/bin/supervisorctl $OPTIONS reload KillMode=process Restart=no TimeoutSec=1200s [Install] WantedBy=multi-user.target
自动在所有节点安装配置完成supervisor并成功启动
ansible安装cesi并注册为后台service
Flask==1.0.2 Flask-SQLAlchemy==2.3.2 tomlkit==0.5.3
[cesi] # Database Uri database = "sqlite:///users.db" # Relative path # Etc #database = "sqlite:opt/cesi/< version >/users.db" # Absolute path #database = "postgres://<user>:<password>@localhost:5432/<database_name>" #database = "mysql+pymysql://<user>:<password>@localhost:3306/<database_name>" activity_log = "activity.log" # File path for CeSI logs admin_username = "admin" # Username of admin user admin_password = "admin" # Password of admin user # This is the definition section for new supervisord node. # [[nodes]] # name = "api" # (String) Unique name for supervisord node. # environment = "" # (String) The environment name provides logical grouping of supervisord nodes. It can be used as filtering option in the UI. # username = "" # (String) Username of the XML-RPC interface of supervisord Set nothing if no username is configured # password = "" # (String) Password of the XML-RPC interface of supervisord. Set nothing if no username is configured # host = "127.0.0.1" # (String) Host of the XML-RPC interface of supervisord # port = "9001" # (String) Port of the XML-RPC interface of supervisord # Default supervisord nodes [[nodes]] name = "192.168.30.174" environment = "" username = "" password = "" host = "192.168.30.174" port = "9001" [[nodes]] name = "192.168.30.175" environment = "" username = "" password = "" host = "192.168.30.175" port = "9001" [[nodes]] name = "192.168.30.176" environment = "" username = "" password = "" host = "192.168.30.176" port = "9001"
[Unit] Description=cesi [Service] Environment= ExecStart=/usr/local/python3.9/bin/python3 {{taishi_dir}}/cesi/cesi/run.py --config-file {{ taishi_dir }}/cesi/defaults/cesi.conf.toml ExecReload=/bin/kill -HUP $MAINPID KillSignal=TERM User=root WorkingDirectory={{taishi_dir}}/cesi Restart=on-failure [Install] WantedBy=multi-user.target
- name: Create cesi dir file: path="{{ taishi_dir }}/cesi" state=directory owner={{ taishi_user }} group={{ taishi_user }} recurse=yes tags: cesi - name: Copy cesi.tar to {{groups["cesi"]}} copy: src=cesi.tar.gz dest=/tmp tags: cesi - name: "Install cesi for {{groups['cesi']}}" unarchive: src="/tmp/cesi.tar.gz" dest="{{ taishi_dir }}/cesi" copy=no mode=0755 owner={{ taishi_user }} group={{ taishi_user }} tags: cesi - name: "copy python3.9 for {{groups['cesi']}}" copy: src=Python-3.9.0.tgz dest=/tmp mode=0755 owner={{ taishi_user }} group={{ taishi_user }} tags: cesi - name: "Install python3.9 for {{groups['cesi']}}" unarchive: src="/tmp/Python-3.9.0.tgz" dest="{{ taishi_dir }}/cesi" copy=no mode=0755 owner={{ taishi_user }} group={{ taishi_user }} tags: cesi - name: "make python3.9 for {{groups['cesi']}}" shell: "yum install -y zlib zlib-devel openssl openssl-devel libffi-devel sqlite-devel && rm -fr /usr/local/python3.9 && mkdir /usr/local/python3.9 && cd {{ taishi_dir }}/cesi/Python-3.9.0 && ./configure --prefix=/usr/local/python3.9 && make && make install" ignore_errors: True tags: cesi - name: "copy requirments for {{groups['cesi']}}" copy: src=requirements.txt dest={{ taishi_dir }}/cesi/requirements.txt mode=0755 owner={{ taishi_user }} group={{ taishi_user }} tags: cesi - name: "Install python3 requirments" shell: "/usr/local/python3.9/bin/python3.9 -m pip install --upgrade pip && cd {{ taishi_dir }}/cesi/ && /usr/local/python3.9/bin/pip3 install -r requirements.txt && /usr/local/python3.9/bin/pip3 install --upgrade sqlalchemy==1.3.23" ignore_errors: True tags: cesi - name: "Copy the cesi.conf" template: src=cesi.conf.toml.j2 dest="{{ taishi_dir }}/cesi/defaults/cesi.conf.toml" owner={{ taishi_user }} group={{ taishi_user }} mode=0755 tags: cesi - name: "Copy the cesi service" template: src=cesi.service.j2 dest="/etc/systemd/system/cesi.service" owner={{ taishi_user }} group={{ taishi_user }} mode=0755 tags: cesi - name: reload cesiservice to {{ groups["cesi"] }} shell: "systemctl daemon-reload" tags: cesi - name: start cesiservice to {{ groups["cesi"] }} service: name=cesi state=started tags: cesi
安装完成后自动启动服务