Bash 脚本:不显示完成状态消息

Bash 脚本:不显示完成状态消息

我正在做我的第一个狂欢脚本将部署 4 个虚拟机到 CloudStack 环境。我想包括一个回声脚本末尾的消息说明部署了多少个虚拟机。有没有办法让它在最后出现?每次运行命令时,cloudstack 都会给出错误或成功消息。有没有办法将“错误”或“作业 ID”消息合并到最后一个 IF 语句中回声我的剧本?

如果虚拟机已部署,cloudstack 将返回以下内容:

deployvirtualmachineresponse:
id: 4fe88c45-fc7c-4ac2-9554-c815e1ada3f6
jobid: 01f52a39-8e57-4968-af34-c4ee53f29e25

如果虚拟机由于错误而失败,即相同的虚拟机名称 cloudstack 返回以下内容:

 deployvirtualmachineresponse:
 uuidList: []
 errorcode: 431
 errortext: ! 'The vm with hostName HOSTNAME01 already exists in the network
 domain: cs1null; network=Ntwk[251|Guest|5]'

如果虚拟机由于 API 超时而失败,云堆栈将返回以下内容:

 Timeout connecting to https://cloud.datapipe.com/api/compute/v1

我的脚本

#!/bin/bash
HOSTNAME=HOSTNAME
vm_deployed=0
vm_failed=0

for i in {1..1}; do
    if cloudstack virtualmachine deploy \
                  --serviceofferingid 48 \
                  --templateid XXX \
                  --zoneid 7 \
                  --keypair XXX \
                  --securitygroupids XXX \
                  --name $(printf "%s%02d" $HOSTNAME $i);
    then
        (( ++vm_deployed ))
     else
        (( ++vm_failed ))
     fi
done

if [ "$JOBID" ] || [ "$ERROR" ]; then
    if (( vm_failed > 0 )); then
        echo "deployed $vm_deployed, failed $vm_failed VMs"
    else
        echo "deployed all $vm_deployed VMs"
    fi
fi

if (( vm_failed > 0 )); then
    exit 1
fi

答案1

假设 Cloudstack 脚本以适当的状态退出(0 表示成功,≥1 表示失败),这将起作用:

vm_deployed=0
vm_failed=0

for i in {1..4}; do
    if cloudstack vm deploy ...; then
        (( ++vm_deployed ))
    else
        (( ++vm_failed ))
    fi
done

# I am not sure if I got your description right.
if [ "$JOBID" ] || [ "$ERROR" ]; then
    if (( vm_failed > 0 )); then
        echo "deployed $vm_deployed, failed $vm_failed VMs"
    else
        echo "deployed all $vm_deployed VMs"
    fi
fi

if (( vm_failed > 0 )); then
    exit 1
fi

(注意:(( ))是一种 bash 主义,因此只有当行中有 bash 时它才会起作用#!。)

答案2

1. 消息未显示,因为工作编号$错误未设置,但根据任务描述,不需要任何变量直到那些已经设定好了。

2. 循环仅运行一次,无法部署CloudStack四次。

3. 最后如果块应折叠到前一个块中。

4.$主机名设置为字符串“HOSTNAME”,(不是变量)。将其设置为“$HOSTNAME”可以工作,但有些多余。

建议修改,(但不改变 CloudStack 部分,这需要稍后的帮助...):

#!/bin/bash
vm_deployed=0
vm_failed=0

for i in {1..4}; do
    if cloudstack virtualmachine deploy \
                  --serviceofferingid 48 \
                  --templateid XXX \
                  --zoneid 7 \
                  --keypair XXX \
                  --securitygroupids XXX \
                  --name $(printf "%s%02d" $HOSTNAME $i);
    then
        (( ++vm_deployed ))
     else
        (( ++vm_failed ))
     fi
done

if (( vm_failed > 0 )); then
    echo "deployed $vm_deployed, failed $vm_failed VMs"
    exit 1
else
    echo "deployed all $vm_deployed VMs"
fi

相关内容