我正在做我的第一个狂欢脚本将部署 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