将节点派生功能实时输出到网页



我有一个Web服务器,它为Docker容器接收用户输入,创建一个global_vars文件(Ansible变量文件(,然后将paste的相应groupvars文件复制到Ansible文件夹中,最后运行Ansible剧本。我想要实现的是从运行Ansible Playbook的spawn命令中获得输出,并提供输出的实时流,以便用户知道他们的容器何时可以使用。

我正在使用快速手柄进行模板制作,我已经尝试过了-

//Render Ansible output
app.get('/control-setup/:userid/output', async (req,res) => {
let userid = req.params.userid
Users.findById(userid).exec(async function (err, result) {
if (err) throw err
let site = result.docker.site
let site_name = site.slice(8)
let output = await exphbs.create({
helpers: {
outputHelper: function () {return ansible.ansibleRunAndReturn(site_name)}
}
})
res.render('output', {
helpers: {
output: output
}
})
})
})

然而,我在网页上没有得到任何输出,但我可以在控制台上看到输出。

可靠的生成脚本-

//Run Ansible and report errors
async function ansibleRunAndReturn(site_name) {
//Copy relevant global file to mujoerp_automation/glabal_vars/all
const src = await __dirname+'/ansible/'+site_name
const dest = await path.join(__dirname, '../mujoerp_automation/group_vars/all')
await fse.copy(src, dest, function (err) {
if (err) throw err
console.log(src+ ' Global vars file copied to ' +dest)
})
//Change playbook location as required
const playbook = await path.join(__dirname, '../mujoerp_automation/master.yml')
const process = await spawn('sh', ['-c', 'echo redhat237 | sudo -S ansible-playbook ../mujoerp_automation/master.yml'],{stdio: 'inherit' })
return process
}
module.exports = {
createGlobal,
ansibleRunAndReturn
}

输出网页-

<div>
{{output.process}}
</div>

有人能告诉我我做错了什么吗?或者是否有更好的方法?

我无法在实时流中获得输出,但我通过使用网页使网站正常工作。

当我点击设置按钮后重定向到另一个页面时,Ansible函数就会启动。

很少有经验教训-从产卵切换到产卵同步。删除promisify。为try-catch块添加了抛出异常的条件

更改ansible.js代码-

//Run Ansible and report errors
async function ansibleRunAndReturn(site_name) {
//Copy relevant global file to mujoerp_automation/glabal_vars/all
const src = await __dirname+'/ansible/'+site_name
const dest = await path.join(__dirname, '../mujoerp_automation/group_vars/all')
await fse.copy(src, dest, function (err) {
if (err) throw err
console.log(src+ ' Global vars file copied to ' +dest)
})
//Change playbook location as required
const playbook = await path.join(__dirname, '../mujoerp_automation/master.yml')
const ansibleProcess = await spawnSync('sh', ['-c', `echo redhat237 | sudo -S ansible-playbook ${playbook}`], {encoding: 'utf8'})//stdio: 'inherit', })
const stdout = await console.log(ansibleProcess.stdout)
await console.log(ansibleProcess.stderr)
const output = await console.log(ansibleProcess.output)
await console.log(ansibleProcess.status)
if (ansibleProcess.status != 0) {
throw 'Server setup failed'
}
return {playbook, ansibleProcess, stdout, output }
}

更改了";"控制中心";

//Render Control Setup
app.get('/control-setup/:userid', (req,res) => {
let userid = req.params.userid
let email = Users.findById(userid).exec(function (err, data) {
if (err) throw error
res.render('controlSetup', {
helpers: {
userid: function () { return req.params.userid },
email: data.email,
site: data.docker.site,
admin: data.docker.adminpwd,
cpus: data.docker.cpus,
memory: data.docker.memory,
storage: data.docker.storage
}
})
})
})
//Render Control Edit
app.get('/control-edit/:userid', (req,res) => {
let userid = req.params.userid
let email = Users.findById(userid).exec(function (err, data) {
if (err) throw error
res.render('controlEdit', {
helpers: {
userid: function () { return req.params.userid },
email: data.email,
cpus: data.docker.cpus,
memory: data.docker.memory,
storage: data.docker.storage
}
})
})
})
//Render Ansible output
app.get('/control-setup/:userid/output', async (req,res) => {
let userid = await req.params.userid
await Users.findById(userid).exec(async function (err, result) {
if (err) throw err
let site = result.docker.site
let site_name = site.slice(8)
try {
await res.render('output')
await ansible.ansibleRunAndReturn(site_name)
await res.redirect('/docker/control/'+userid)
} catch (e) {
res.redirect('/docker/control-setup/'+userid+'/error')
}
})
})
app.get('/control-setup/:userid/error', async (req,res) => {
res.render('error')
})
//Setup/Edit Docker details for docker
app.post('/control-setup/:userid',
//validation
[
body('site').isURL({allow_underscores: true}),
body('admin').isLength({ min: 6 })
], async (req,res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
const userid = req.params.userid
//Setup or Edit
var site = req.body.site
var adminpwd = req.body.admin
var cpus = req.body.cpus
var memory = req.body.memory
var storage = req.body.storage
//Needs a function to get the next available port
var dockerPort = await freePort()
console.log(dockerPort)
//Cutting https:// from input
var site_name = site.slice(8)
//Save or Edit in DB
Users.updateOne({_id: userid}, {docker: {site: site, adminpwd: adminpwd, hostPort: dockerPort, cpus: cpus, memory: memory, storage: storage}}, {upsert: true, new: true},
function (err, result) {
if (err) throw err
console.log('Docker Parameters Setup in User' + result)
})
await ansible.createGlobal(site_name, adminpwd, dockerPort, cpus, memory, storage)
await res.redirect(userid+'/output')
})

和往常一样,因为我对开发还很陌生,如果有人有更好的选择或方法来实际实现spawnSync命令的实时流,我会非常感谢学习这些技术或逻辑。

最新更新