一键启停容器服务

项目介绍

应用场景:

点击按钮,自动启动容器

项目架构:

1.apache:负载均衡+反向代理服务器
2.docker:项目跑在容器中(django代码+mysql服务)

启动容器服务

# 启动服务器
import os
from datetime import datetime

from Client import settings
from agent.modelparams import START_SERVER_COMMAD
from agent.models import ServerConfig

# 服务器启动命令
START_SERVER_COMMAD = "docker-compose up &"

def start_server(self):
    company_name = str(self.coding)   
    dir_str = os.path.join(settings.ABOUT_SERVER_DIR, company_name)   
    path_str = os.path.join(dir_str, "docker-compose.yml")   # docker-compose文件存放路径
    conf_name = company_name + ".conf"
    conf_path = os.path.join(settings.SERVER_CONF_DIR, conf_name) # conf文件存放路径
    if not os.path.exists(path_str):     #如果路径不存在表示,当前操作对象未创建两个配置文件(兜底措施)
        self.create_yaml()
    if not os.path.exists(conf_path):
        self.create_conf()
    os.chdir(dir_str)   # 切换工作目录
    os.system(START_SERVER_COMMAD)  # 执行启动容器命令


# 批量启动容器
def start_server_action(modeladmin, request, queryset):
    for obj in queryset:   # 批量启动容器
        obj.start_server()   
    # 更新当前容器的启停状态,和启停时间
    for i in queryset:
        ServerConfig.objects.filter(customers=i).update(server_status="1", updated_time=datetime.now())
    modeladmin.message_user(request, "操作成功")  # 返回给admin提示信息



停止容器服务

应用场景:点击按钮,自动停止容器

import os
from datetime import datetime

from Client import settings
from agent.modelparams import START_SERVER_COMMAD
from agent.models import ServerConfig
# 服务器停止命令
STOP_SERVER_COMMAND = "docker-compose stop &"

# 批量停止服务器
def stop_server(self):
    company_name = str(self.coding)
    dir_str = os.path.join(settings.ABOUT_SERVER_DIR, company_name)
    os.chdir(dir_str)   # 切换工作目录
    os.system(START_SERVER_COMMAD)  # 执行停止容器命令

django项目应用

项目中的容器启动和停止的两个函数是挂载在model模型上的,并应用django的信号,并在此模型的amdin中配置了自定义动作,admin页面中点击下拉框点击执行动作,逻辑中发送信息,则自动执行两个函数

admin自定义动作

@admin.register(client_customers)
class client_customers_admin(admin.ModelAdmin):
    actions = [start_server_action, stop_server_action]

随便一个文件中定义动作函数

# 批量操作:开启中层系统服务
def start_server_action(modeladmin, request, queryset):
    for obj in queryset:
        obj.start_server()
    for i in queryset:
        ServerConfig.objects.filter(customers=i).update(server_status="1", updated_time=datetime.now())
    modeladmin.message_user(request, "操作成功")

models.py

class client_customers(models.Model):

    # 启动服务器
    def start_server(self):
        

    # 停止服务器
    def stop_server(self):
        

信号文件

应用/signals

# 自定义服务器启停信号
server_active = Signal(providing_args=["obj", "active_start", "active_stop"])
# 回调函数:执行启停服务器
@receiver(signal=server_active)
def do_active(sender, **kwargs):
    this_obj = kwargs.get("obj")
    active_start = kwargs.get("active_start")
    active_stop = kwargs.get("active_stop")
    if active_start:
        this_obj.start_server()
    if active_stop:
        this_obj.stop_server()

admin表单保存数据成功后执行save_related()方法,然后发送信号启停容器

@admin.register(client_customers)
class client_customers_admin(admin.ModelAdmin):
    # modelform保存时会执行这个方法
    def save_related(self, request, form, formsets, change):
        super().save_related(request, form, formsets, change)
        this_obj = form.instance
        # 发送启停信号
        server_active.send(
            sender=None, obj=this_obj,
            active_start=form.start_flag,
            active_stop=form.stop_flag
        )
posted @ 2023-05-11 14:22  河图s  阅读(20)  评论(0)    收藏  举报