我正在運行這樣的腳本:
const someString = "text@ip:ip,text@ip:,";
const arg2 = "5";
let result = await new Promise((resolve, reject) => {
child.exec(`"/path/to/script.sh" "${someString}" "${arg2}"`,
(error=child.ExecException, stdout=string, stderr=string) => {
if (error) {
isErr = true;
reject(error);
}else {
resolve(stdout);
}
});
});
該腳本接收arg2
良好,如$2
. 但是,$1
顯示一個空白字串。我已經在我的 Node.js 應用程式中記錄了該字串,它是正確的。可能與字串中的特殊字符有關?
腳本需要相對于應用程式異步運行,并相對于其父函式同步運行(上面的代碼片段就是這種情況)。
編輯:這是我無法作業的原始代碼。它是動態生成一個ansible庫存。
節點:
async function buildInventory(site){
const agentNumber = site.agentData.agentNumber;
let hostsByType = {};
let hosts = "";
if ( site.hosts.length > 0 ){
site.hosts.forEach(host => {
if (hostsByType.hasOwnProperty(`${host.type}`)) {
hostsByType[`${host.type}`].push(`${host.ip}`);
}else{
hostsByType[`${host.type}`] = [ `${host.ip}` ];
}
});
}
if ( hostsByType != {} ){
for (const key in hostsByType) { // create arg in format type@ip:,type@ip:ip:,
if (Object.hasOwnProperty.call(hostsByType, key)) {
hosts = hosts `${key}@`;
hostsByType[key].forEach(ip => {
hosts = hosts `${ip}:`;
});
hosts = hosts ',';
}
console.log(hosts); // string logged is in expected format
}
}
if ( hosts = "" ){
hosts = "na";
}
let isErr = false;
let result = await new Promise((resolve, reject) => {
child.exec(`"/usr/raindrop/app/ansible/mkinv" "${hosts}" "${agentNumber}"`,
(error=child.ExecException, stdout=string, stderr=string) => {
if (error) {
isErr = true;
reject(error);
}else {
resolve(stdout);
}
});
});
if( !isErr ){
result = result.split(/\r?\n/)[0];
if ( result == "genskipped" ){
logger.log('info', `Inventory generation skipped(no hosts)`);
return true;
}else if ( result == "gensuccess"){
logger.log('info', `Inventory generated`);
return true;
}else {
logger.log('warn', `Unknown response from inventory generation script`);
console.log(result);
return false;
}
}else{
logger.log('error', `Inventory generation error: ${result}`);
return false;
}
}
bash腳本:
#!/bin/bash
mkdir -p /data/ansible/$2
cd /data/ansible/$2
while [[ $1 == "na" ]];do
echo "genskip"
exit 0;
done
touch inventory.yml
echo "all:" > inventory.yml
echo " children:" >> inventory.yml
IFS=',' read -a hostsByType <<< "$1" # arg in format type@ip:,type@ip:ip:,
echo $1 >> /logs/ansible-debug.log
for val in "$hostsByType";do
while [[ "$val" != "" ]];do
IFS='@' read -a data <<< "$val"
echo " ${data[0]}:" >> inventory.yml
IFS=':' read -a hosts <<< "${data[1]}"
c=1
for host in "$hosts";do
while [[ "$host" != "" ]];do
echo " host${c}: $host"
c=$(($c 1))
break;
done
done
break;
done
done
subnet=$(cat /data/vpn/rain.conf | grep 'ipv4=')
IFS='=' read -a arr <<< $subnet
subnet=${arr[1]}
agent_ip="${subnet}${2}"
echo " vars:" >> inventory.yml
echo " ansible_port: 22" >> inventory.yml
echo " ansible_user: sisadm" >> inventory.yml
echo " private_key_file: /data/ssh/keys/$2" >> inventory.yml
echo " ansible_ssh_common_args: '-o StrictHostKeyChecking=no -o ProxyCommand=\"ssh -o \'ForwardAgent yes\' agent@$agent_ip -p 11522 \'ssh-add /home/agent/.ssh/id_rsa && nc %h %p\'\"'" >> inventory.yml
echo "gensuccess"
EDIT2:
/logs/ansible-debug.log
每次運行腳本時顯示一個新行。腳本創建的inventory.yml:
all:
children:
vars:
ansible_port: 22
ansible_user: sisadm
private_key_file: /data/ssh/keys/2
ansible_ssh_common_args: '-o StrictHostKeyChecking=no -o ProxyCommand="ssh -o \'ForwardAgent yes\' [email protected] -p 11522 \'ssh-add /home/agent/.ssh/id_rsa && nc %h %p\'"'
uj5u.com熱心網友回復:
你的問題在這里:
if ( hosts = "" ){
hosts = "na";
}
嘗試這個:
if ( hosts == "" ){
hosts = "na";
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/493704.html