一键启停容器服务
项目介绍
应用场景:
点击按钮,自动启动容器
项目架构:
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
)
python防脱发技巧

浙公网安备 33010602011771号