版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hjh00/article/details/78952066
应用child_process调用执行ansible命令。node.js的文本服务云ansilbe运行在同一台机器上。
1. 前端网页
<div class="container" >
<div class="row">
<div class="col-sm-12">
<div class="panel panel-default">
<div class="panel-heading">
<form class="form-inline">
<div class="row">
<div class="col-xs-6 text-left">
<button type="button" class="btn btn-success" onclick="execCmd('inputCommand','textareaResult', 'execCmdBTN')" id="execCmdBTN"> 点击运行</button>
</div>
</div>
</form>
</div>
<div class="panel-body">
<input class="form-control" type="text" id="inputCommand" name="inputCommand" value="ansible all -m ping" ></tinput>
</div>
</div>
</div>
<div class="col-sm-12">
<div class="panel panel-default">
<div class="panel-heading"><form class="form-inline"> <button type="button" class="btn btn-default">运行结果</button></form></div>
<div class="panel-body"><textarea class="form-control" id="textareaResult" name="textareaResult" rows="20"></textarea></div>
</div>
</div>
</div>
</div>
2. 前端JS脚本
利用jquery和ajax与后台交互。从输入框取出命令发到后台,等后台执行完成后,再显示结果。
function execCmd(cmdId, resId, btnId){
var cmdstr = $("#"+cmdId).val();
$("#"+btnId).attr('disabled',true);
$("#"+btnId).text('正在运行');
$.ajax({
type: 'post',
timeout: 5000,
url: '/demo/rcmdExec',
dataType: 'JSON',
data:{
cmdline: cmdstr
},
success:function(data){
if (data.rtCode == '0'){
//alert(data.rtData);
$("#"+resId).val("");
$("#"+resId).val(data.rtData);
}else{
alert(data.rtMsg);
}
},
complete: function(XMLHttpRequest, textStatus){
if(textStatus=='timeout'){
alert('timeout');
}
$("#"+btnId).attr('disabled',false);
$("#"+btnId).text('点击运行');
}
});
}
3.后台JS程序
路由程序
var express = require('express');
var router = express.Router();
var demoMd = require('../modles/demoMD');
function jsonWrite(res, data){
if(typeof data == 'undefined'){
res.json({
rtCode: '1',
rtMsg: '操作失败'
});
}else{
res.json({
rtCode: '0',
rtMsg: '操作成功',
rtData: data
});
}
};
//返回rcmd页面
router.get('/rcmd', function(req, res, next){
res.render('apps/demo/rcmd', {
title: 'rcmd'
});
});
//通过web执行ansible命令
router.post('/rcmdExec', function(req, res, next){
demoMd.ansible(req, res, next, jsonWrite);
});
实际功能demoMD.js
var childProc = require('child_process');
module.exports = {
ansible: function(req, res, next, callback){
var cmdline = req.body.cmdline;
childProc.exec(cmdline, function(error, stdout, stderr){
if(error){
console.log(error.stack);
console.log('Error code: ' + error.code);
}
console.log('child Process STDOUT: ' + stdout);
callback(res, stdout);
});
console.log(req.body);
}
}
对于耗时短,能够即时完成的调用,采用这种方法效果很好。