Я работаю над своим первым скриптом bash , который развернет 4 виртуальные машины в облачной среде. Я хотел бы добавить эхо- сообщение в самом конце сценария, в котором указано, сколько виртуальных машин было развернуто. Есть ли способ сделать это в самом конце? Каждый раз, когда команда запускается, cloudtack выдает ошибку или сообщение об успехе. Есть ли способ включить сообщение "error" или "jobid" в оператор IF для самого последнего эха моего скрипта?

Если виртуальная машина развернута, облачный стек возвращает следующее:

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

Если виртуальная машина дает сбой из-за ошибки, то есть то же имя облака VM возвращает следующее:

 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

2 ответа2

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

(Примечание: (( )) это bashism, поэтому он будет работать только до тех пор, пока у вас есть bash в #! линия.)

0

1. Сообщения не отображались, потому что $ JOBID и $ ERROR не установлены, но на основании описания задачи ни одна из переменных не нужна, пока они не установлены.

2. Цикл запускается только один раз, он не может развернуть CloudStack 4 раза.

3. Последний блок if должен быть свернут к предыдущему.

4. Для $ HOSTNAME задана строка "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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .