Bash-Skript: Abschlussstatusmeldung wird nicht angezeigt

0

Ich arbeite an meinem ersten Bash- Skript, das 4 VMs in einer Cloudstack-Umgebung bereitstellt. Am Ende des Skripts möchte ich eine Echo- Nachricht einfügen, die angibt, wie viele VMs bereitgestellt wurden. Gibt es eine Möglichkeit, dies ganz zum Schluss kommen zu lassen? Bei jeder Ausführung des Befehls gibt cloudstack einen Fehler oder eine Erfolgsmeldung aus. Gibt es eine Möglichkeit, die Meldung "error" oder "jobid" für das allerletzte Echo meines Skripts in eine IF-Anweisung aufzunehmen ?

Wenn die VM bereitgestellt ist, gibt Cloudstack Folgendes zurück:

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

Wenn die VM aufgrund eines Fehlers ausfällt, dh derselbe VM-Name Cloudstack gibt Folgendes zurück:

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

Wenn die VM aufgrund eines API-Timeouts ausfällt, gibt der Cloud-Stack Folgendes zurück:

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

Mein Drehbuch

#!/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
quelle

Antworten:

1

Angenommen, das Cloudstack-Skript wird mit einem entsprechenden Status beendet (0 für Erfolg, ≥1 für Misserfolg), funktioniert Folgendes:

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

(Hinweis: (( ))Dies ist ein Bashismus, daher funktioniert er nur, solange Sie Bash in der #!Zeile haben.)

Grawity
quelle
Hallo Grawity, ich habe mein Skript so aktualisiert, dass es Ihre Optimierungen enthält, und ein bisschen mehr Informationen hinzugefügt. Die VM ist noch im Einsatz, aber ich bekomme das ECHO am Ende nicht
RomeNYRR
0

1. Die Meldungen wurden nicht angezeigt, da $ JOBID und $ ERROR nicht gesetzt sind. Aufgrund der Aufgabenbeschreibung wird jedoch keine Variable benötigt, bis diese gesetzt sind.

2. Die Schleife wird nur einmal ausgeführt. Sie kann CloudStack nicht viermal bereitstellen.

3. Der letzte if- Block sollte in den vorherigen Block eingeklappt werden.

4. $ HOSTNAME wird auf die Zeichenfolge "HOSTNAME" gesetzt (keine Variable). Das Setzen auf "$ HOSTNAME" würde funktionieren, ist aber überflüssig.

Vorgeschlagene Überarbeitung (aber keine Änderungen am CloudStack-Teil, der später Hilfe benötigt ...):

#!/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
quelle