Script de Bash: a mensagem de status de conclusão não é exibida

0

Estou trabalhando no meu primeiro bater script que implantará 4 VMs em um ambiente cloudstack. Eu gostaria de incluir um eco mensagem no final do script informando quantas VMs foram implantadas. Existe uma maneira de ter isso surgido no final? Toda vez que o comando é executado, o cloudstack fornece um erro ou uma mensagem de sucesso. Existe uma maneira de incorporar a mensagem "error" ou "jobid" em uma instrução IF para o último eco do meu roteiro?

Se a VM for implantada, o cloudstack retornará o seguinte:

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

Se a VM falhar devido a um erro, ou seja, o mesmo nome de VM cloudstack retornará o seguinte:

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

Se a VM falhar devido a um tempo limite da API, a pilha da nuvem retornará o seguinte:

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

Meu script

#!/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
RomeNYRR
fonte

Respostas:

1

Supondo que o script Cloudstack saia com um status apropriado (0 para sucesso, ≥1 para falha), isso funcionará:

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

(Nota: (( )) é um bashismo, por isso vai funcionar apenas enquanto você tiver bash no #! linha.)

grawity
fonte
Oi Grawity, atualizei meu script acima para incluir seus ajustes e adicionei um pouco mais de informação. A VM ainda está implantada, mas eu não estou recebendo o ECHO no final
RomeNYRR
0

1. As mensagens não foram exibidas porque $ JOBID e $ ERROR não estão definidos, mas com base na descrição da tarefa, nenhuma variável é necessária até aqueles estão definidos.

2. O loop só é executado uma vez, não é possível implantar o CloudStack 4 vezes.

3. O último E se bloco deve ser dobrado para o anterior.

4 $ HOSTNAME está definido para a cadeia "HOSTNAME", (não uma variável). Configurá-lo para "$ HOSTNAME" funcionaria, mas é redundante.

Revisão sugerida (mas sem alterações na parte do CloudStack, que precisa de ajuda, mais tarde ...):

#!/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
agc
fonte