远程执行命令我使用saltstack这个运维工具,执行一些系统命令可以直接使用salt,执行一些相关的游戏脚本,则可以使用salt的模块功能,最后还可以把结果存入数据库,太方便了
saltstack 自定义modules:http://lihuipeng.blog.51cto.com/3064864/1396279
saltstack return的使用:
saltstack API的使用:
我这里使用了多数据库,django多数据库的配置参考:
models.py(这个salt官方需要的两个表)
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
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
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
{% from "form_macro.html" import render_field, render_checkbox%}{% extends "execute_cmd_index.jinja.html" %}{% set active_page2 = 'executesystem' -%}{% block content %}
最后我实现的效果: