2016-07-05 4 views
1

У меня есть код, который создает моментальный снимок, а затем проверяет, выполнено ли это, я написал следующий код, но по какой-то причине он не обновляет переменную , а циклы while продолжают печатать То же самое, даже если снимок был completedв то время как петля застряла в том же состоянии

Ниже приведен код:

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" 

ВЫВОД:

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

Это просто продолжает печатать "Snapshot under creation", хотя моментальный снимок завершается. Причина этого в том, что я не могу обновить свое состояние variable, я верю, пожалуйста, помогите мне как?

+0

Можете ли вы также распечатать snapshot.state для каждой итерации. Я хотел бы узнать, является ли его значение «завершено» или что-то еще. –

+0

Хорошо, я редактирую код и печатаю новый вывод, пожалуйста, проверьте – Kittystone

+0

Слишком много заявлений на печать сбивают с толку. Можете ли вы просто распечатать snapshot.state внутри цикла while, но вне if-else. Также вы можете добавить оператор break внутри if condition. –

ответ

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

Эта строка выполняется только один раз, и в этом случае state является «pending». Вы должны снова проверить состояние переменной snapshot внутри цикла while.

Вы не обновляете snapshot переменную в любом месте вашего кода или while.

Вам нужно будет сделать что-то подобное внутри цикла while.

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

Проверьте библиотеку boto и как получить состояние моментального снимка с идентификатором.

+0

как реализовать это в коде? – Kittystone

+0

Это boto2, я думаю, что я могу сделать для boto3 – Kittystone

1

Как упоминал Пратик, ваше утверждение выполняется только один раз и никогда не обновляется. Вы можете обновить свой ресурс с помощью .load(). Тем не менее, я рекомендую вам использовать waiter. Это обработает всю логику ожидания для вас и вернется, когда ваш снимок будет завершен. Для этого ресурса вы должны использовать: snapshot.wait_until_completed().

Смежные вопросы