2016-07-05 11 views
1

Ich habe einen Code, der einen Snapshot erstellt und dann überprüft, ob es fertig ist, schrieb ich den folgenden Code, aber aus irgendeinem Grund aktualisiert es nicht die Variable state und die While-Schleifen weiterhin drucken gleiche auch wenn der Snapshot wurde completedWhile-Schleife bei gleicher Bedingung stecken

Im folgenden ist der Code:

def call_creater(): 
    regions = ['eu-central-1'] 
    for region in regions: 
     ec2 = boto3.resource('ec2', region, aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY,) 
     snapshot = ec2.create_snapshot(VolumeId='vol-f9e7d220', Description='fra01-he-trial-ansible01') 
     while snapshot.state != 'completed': 
      print snapshot.state 
      print "Snapshot under creation" 
      time.sleep(10) 
     else: 
      print "snapshot READY" 

OUTPUT:

pending 
Snapshot under creation 
pending 
Snapshot under creation 
pending 
Snapshot under creation 
pending 
Snapshot under creation 

Diese druckt nur noch die "Snapshot under creation", obwohl der Schnappschuss abgeschlossen ist. Der Grund dafür ist, ich bin nicht in der Lage, meinen Zustand zu aktualisieren variable ich glaube, bitte helfen Sie mir wie?

+0

Sie können auch snapshot.state für jede Iteration drucken. Ich würde gerne sehen, ob der Wert "abgeschlossen" oder etwas anderes ist. –

+0

okay, ich bearbeite den Code und drucke die neue Ausgabe, bitte überprüfen Sie – Kittystone

+0

Zu viele Druckanweisungen sind verwirrend. Können Sie nur snapshot.state innerhalb der while-Schleife drucken, aber außerhalb von if-else. Sie können auch eine break-Anweisung innerhalb der Bedingung hinzufügen. –

Antwort

1
snapshot = ec2.create_snapshot(VolumeId='vol-f9e7d220', Description='fra01-he-trial-ansible01') 

Diese Linie wird einmal und in diesem Fall nur dann ausgeführt, die statepending“ ist. Sie müssen den Status der Variablen snapshot erneut in der while-Schleife überprüfen.

Sie aktualisieren snapshot Variable nirgends in Ihrem Code oder while Schleife.

Sie müssen so etwas in Ihrer while-Schleife tun.

snapshot = conn.get_all_snapshots(snapshot_ids=[<YOUR SNAPSHOT ID>])[0] 

Überprüfen Sie die Boto-Bibliothek und wie Sie den Status von Snapshot mit ID erhalten.

+0

aus, wie Sie das im Code implementieren? – Kittystone

+0

das ist boto2 ich nehme an, was kann ich für boto3 tun – Kittystone

1

Wie Pratik erwähnt, wird Ihre Anweisung nur einmal ausgeführt und nie aktualisiert. Sie können Ihre Ressource mit .load() aktualisieren. Aber noch besser, ich empfehle Ihnen, die waiter zu verwenden. Dies wird alle Wartelogik für Sie behandeln und zurückkehren, wenn Ihr Snapshot abgeschlossen ist. Für diese Ressource würden Sie verwenden: snapshot.wait_until_completed().

Verwandte Themen