Node.js 入门笔记(5) - child_process

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
	}
}
对于耗时短,能够即时完成的调用,采用这种方法效果很好。






猜你喜欢

转载自blog.csdn.net/hjh00/article/details/78952066