远程执行命令我使用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官方需要的两个表)
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 %}
<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 %}
最后我实现的效果:
转载于:https://blog.51cto.com/lihuipeng/1440954