supervisor集群管理

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"
cesi.conf.toml配置

安装完成后打开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
tasks/main.yml
#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
templates/supervisord.conf.j2
#!/bin/bash


#/usr/bin/supervisord -c __install_dir__/etc/supervisord.conf
# dpkg-reconfigure dash
/usr/bin/supervisord -c {{ taishi_dir }}/etc/supervisord.conf 
templates/start_taishi.sh.j2
# 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
templates/taishi.service.j2

   

   

    

   自动在所有节点安装配置完成supervisor并成功启动

ansible安装cesi并注册为后台service

    

Flask==1.0.2
Flask-SQLAlchemy==2.3.2
tomlkit==0.5.3
files/requirements.txt
[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"
templates/cesi.conf.toml.j2
[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
templates/cesi.service.j2
- 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
tasks/main.yml

 

 安装完成后自动启动服务

原文地址:https://www.cnblogs.com/yxh168/p/14844970.html