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

0

Estou trabalhando no meu primeiro script bash que implantará 4 VMs em um ambiente de nuvem. Gostaria de incluir uma mensagem echo 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 echo do meu script?

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
    
por RomeNYRR 03.11.2013 / 11:46

2 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: (( )) é uma base, por isso funcionará apenas enquanto você tiver o bash na linha #! .)

    
por 03.11.2013 / 12:16
0

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

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

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

4. $ HOSTNAME é definido como a string "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
    
por 16.04.2016 / 16:30

Tags