Django开发运维后台(五):formview结合salt执行命令

简介:

远程执行命令我使用saltstack这个运维工具,执行一些系统命令可以直接使用salt,执行一些相关的游戏脚本,则可以使用salt的模块功能,最后还可以把结果存入数据库,太方便了

saltstack 自定义modules:http://lihuipeng.blog.51cto.com/3064864/1396279

saltstack return的使用:http://lihuipeng.blog.51cto.com/3064864/1403387

saltstack API的使用:http://docs.saltstack.cn/ref/clients/index.html#localclient

我这里使用了多数据库,django多数据库的配置参考:http://lihuipeng.blog.51cto.com/3064864/1415141


models.py(这个salt官方需要的两个表)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class  QjshsaJids(models.Model):
     _database  =  'kaifu'
     id  =  models.IntegerField(primary_key = True )
     jid  =  models.CharField(unique = True , max_length = 255 )
     load  =  models.TextField()
     class  Meta:
         managed  =  False
         db_table  =  'QjshSa_jids'
 
class  QjshsaSaltreturns(models.Model):
     _database  =  'kaifu'
     id  =  models.IntegerField(primary_key = True )
     fun  =  models.CharField(max_length = 50 )
     jid  =  models.CharField(max_length = 255 )
     result  =  models.TextField()
     host  =  models.CharField(max_length = 255 )
     success  =  models.CharField(max_length = 10 )
     full_ret  =  models.TextField()
     class  Meta:
         managed  =  False
         db_table  =  'QjshSa_saltreturns'

forms.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
systemcommand  =  [
                         ( 'df -lh' , 'df -lh' ),
                         ( 'free -m' , 'free -m' ),
                         ( 'uptime' , 'uptime' ),
                         ( 'netstat -tunlp' , 'netstat -tunlp' ),
                         ( 'ps aux | grep "daemon"' , 'ps aux | grep "daemon"' ),
                         ( 'crontab -l' 'crontab -l' ),
                      ]
 
 
class  ExecuteSystemForm(forms.Form):
     plat  =  forms.CharField(required = True ,
                            widget = forms.TextInput(attrs = { 'readonly' : 'True' 'class' : "form-control" }))
     server_id  =  forms.CharField(required = True ,
                                 widget = forms.TextInput(attrs = { 'readonly' : 'True' 'class' : "form-control" }))
     server_name  =  forms.CharField(required = True ,
                                 widget = forms.TextInput(attrs = { 'readonly' : 'True' 'class' : "form-control" }))
     host  =  forms.CharField(required = True ,
                            widget = forms.TextInput(attrs = { 'readonly' : 'True' 'class' : "form-control" }))
     command  =  forms.ChoiceField(required = True ,
                                 choices = systemcommand,
                                 widget = forms.Select(attrs = { 'class' : "form-control" }))

我限定了可以执行某些命令,感觉这样我安心一些。。。


views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class  ExecuteSystem(FormView):
     template_name  =  'execute_system.jinja.html'
     form_class  =  ExecuteSystemForm
 
 
     def  get_initial( self * * kwargs):
         initial  =  {}
         kaifuid  =  self .kwargs[ 'pk' ]
         serverinfo  =  ServerList.objects.get(kaifu_id = kaifuid)
         initial[ 'plat' =  serverinfo.plat
         initial[ 'server_id' =  serverinfo.server_id
         initial[ 'server_name' =  serverinfo.server_name
         initial[ 'host' =  serverinfo.dx_ip
         return  initial
 
     def  form_valid( self , form):
         formdata  =  form.cleaned_data
         host  =  formdata[ 'host' ]
         command  =  formdata[ 'command' ]
         saltconnection  =  salt.client.LocalClient()
         result  =  saltconnection.cmd(host,  'cmd.run' , [command], ret = 'qjsh_mysql' )
         result  =  result[host]
         messages.success( self .request, '执行成功!' )
         return  render_to_response( self .template_name,
                                   { 'form' :form, 'kaifuid' : self .kwargs[ 'pk' ], 'result' :result},
                                   context_instance = RequestContext( self .request))
 
 
     def  get_context_data( self * * kwargs):
         context  =  super (ExecuteSystem, self ).get_context_data( * * kwargs)
         context[ 'kaifuid' =  self .kwargs[ 'pk' ]
         return  context

get_inital是初始化form

form_valid是表单通过验证后执行的

execute_system.jinja.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
{% from "form_macro.html" import render_field, render_checkbox%}
{% extends "execute_cmd_index.jinja.html" %}
{% set active_page2 = 'executesystem' -%}
{% block content %}
     < div  class = "row" >
         < div  class = "col-md-6" >
             < form  class = "form-inline"  role = "form"  method = "POST" >{% csrf_token %}
                 < table  class = "table table-bordered table-hover" >
                     < tr >
                         < td >平台名称:</ td >
                         < td >{{ form.plat|safe }}</ td >
                     </ tr >
                     < tr >
                         < td >服务器ID:</ td >
                         < td >{{ form.server_id|safe }}</ td >
                     </ tr >
                     < tr >
                         < td >服务器名称:</ td >
                         < td >{{ form.server_name|safe }}</ td >
                     </ tr >
                     < tr >
                         < td >执行IP:</ td >
                         < td >{{ form.host|safe }}</ td >
                     </ tr >
                     < tr >
                         < td >执行命令:</ td >
                         < td >
                             < div  class = "form-group" >
                                 {{ form.command|safe }}
                             </ div >
                         </ td >
                     </ tr >
                     < tr >
                         < td  colspan = "2" >< center >< button  type = "submit"  class = "btn btn-info" >确定</ button ></ center ></ td >
                     </ tr >
                 </ table >
             </ form >
         </ div >
     </ div >
     {% if result %}
     < hr >
     < div  class = "row" >
         < div  class = "panel panel-primary" >
             < div  class = "panel-heading" >
                 < h3  class = "panel-title" >执行结果:</ h3 >
             </ div >
             < div  class = "panel-body" >
                 < pre >< core >`result`</ core ></ pre >
             </ div >
         </ div >
     </ div >
     {% endif %}
{% endblock %}

最后我实现的效果:

wKiom1PMzc3xw83eAAFklYkH6s0158.jpg

wKioL1PMzuijHJM2AAIRjGr_jKY071.jpg

本文转自运维笔记博客51CTO博客,原文链接http://blog.51cto.com/lihuipeng/1440954如需转载请自行联系原作者


lihuipeng


相关文章
|
19天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
112 45
|
25天前
|
运维 监控 网络协议
|
8天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
20 2
|
11天前
|
缓存 运维 监控
【运维必备知识】Linux系统平均负载与top、uptime命令详解
系统平均负载是衡量Linux服务器性能的关键指标之一。通过使用 `top`和 `uptime`命令,可以实时监控系统的负载情况,帮助运维人员及时发现并解决潜在问题。理解这些工具的输出和意义是确保系统稳定运行的基础。希望本文对Linux系统平均负载及相关命令的详细解析能帮助您更好地进行系统运维和性能优化。
32 3
|
1月前
|
IDE 关系型数据库 MySQL
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
这篇文章是关于如何创建一个Django框架,介绍Django的项目结构和开发逻辑,并指导如何创建应用和编写“Hello, World!”程序的教程。
39 3
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
|
20天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
32 2
|
1月前
|
运维 Java Linux
【运维基础知识】掌握VI编辑器:提升你的Java开发效率
本文详细介绍了VI编辑器的常用命令,包括模式切换、文本编辑、搜索替换及退出操作,帮助Java开发者提高在Linux环境下的编码效率。掌握这些命令,将使你在开发过程中更加得心应手。
32 2
|
1月前
|
存储 运维 监控
实时计算Flink版在稳定性、性能、开发运维、安全能力等等跟其他引擎及自建Flink集群比较。
实时计算Flink版在稳定性、性能、开发运维和安全能力等方面表现出色。其自研的高性能状态存储引擎GeminiStateBackend显著提升了作业稳定性,状态管理优化使性能提升40%以上。核心性能较开源Flink提升2-3倍,资源利用率提高100%。提供一站式开发管理、自动化运维和丰富的监控告警功能,支持多语言开发和智能调优。安全方面,具备访问控制、高可用保障和全链路容错能力,确保企业级应用的安全与稳定。
41 0
|
3月前
|
图形学 开发者 存储
超越基础教程:深度拆解Unity地形编辑器的每一个隐藏角落,让你的游戏世界既浩瀚无垠又细节满满——从新手到高手的全面技巧升级秘籍
【8月更文挑战第31天】Unity地形编辑器是游戏开发中的重要工具,可快速创建复杂多变的游戏环境。本文通过比较不同地形编辑技术,详细介绍如何利用其功能构建广阔且精细的游戏世界,并提供具体示例代码,展示从基础地形绘制到植被与纹理添加的全过程。通过学习这些技巧,开发者能显著提升游戏画面质量和玩家体验。
152 3
|
3月前
|
运维 Devops 持续交付
自动化运维之路:从脚本到DevOps探索后端开发:从基础到高级实践
【8月更文挑战第28天】在数字化时代的浪潮中,企业对于IT运维的要求越来越高。从最初的手动执行脚本,到如今的自动化运维和DevOps实践,本文将带你领略运维的演变之旅。我们将探索如何通过编写简单的自动化脚本来提升效率,进而介绍DevOps文化的兴起及其对现代运维的影响。文章将为你揭示,通过持续集成、持续部署和微服务架构的实践,如何构建一个高效、可靠的运维体系。准备好让你的运维工作变得更加智能化和自动化了吗?让我们一起踏上这段旅程。 【8月更文挑战第28天】 本文旨在为初学者和有一定经验的开发者提供一个深入浅出的后端开发之旅。我们将一起探索后端开发的多个方面,包括语言选择、框架应用、数据库设计