2016-04-22 14 views
1

私はAMI作成を自動化するプロジェクトに取り組んでいます。 要件:AMIは 3.ブレーク我々が再起動したくないAMIの作成が失敗した場合、ループや成功 4.を繰り返し、すべてのインスタンスブレークwhileループifth条件付き

するための手順を作成するまで1. AMIに 2.待機を作成しますAMIを作成するときのインスタンスです。

問題:if条件にbreakステートメントを追加すると、スクリプトが内部whileループを終了しません。誰かがコードを修正するのを助けてくれますか?

#!/usr/bin/env python 
import sys 
import boto 
import boto.ec2 
import datetime 
import time 

list_1 = ['instance1','instance2'] 
conn = boto.ec2.connect_to_region('us-west-1',aws_access_key_id = '<access_key>',aws_secret_access_key = '<secret_key>') 

def create_img(a, b): 
    try: 
     print "Starting AMI creation for : %s" % inst.tags['Name'] 
     img_id = conn.create_image(a, b, description='backup', no_reboot=True, dry_run=False) 
    except boto.exception.BotoServerError, e: 
     print e.error_message 
    return(img_id) 


reservations = conn.get_all_instances() 
for res in reservations: 
    for inst in res.instances: 
     if 'Name' in inst.tags and inst.tags['Name'] in list_1: 
      print "%s (%s) [%s]" % (inst.tags['Name'], inst.id, inst.state) 

      name = inst.tags['Name'] + '-' + datetime.datetime.now().strftime("%Y%m%d%H%M") 
      ami_id = create_img(inst.id, name) 
      img = conn.get_all_images(filters={'image_id' : ami_id})[0] 

      if img.state == 'failed': 
       print "AMI creation failed for instance: %s" % inst.tags['Name'] 
      elif img.state == 'pending': 
       while True: 
        if img.state == 'failed': 
         print "AMI creation failed for instance: %s" % inst.tags['Name'] 
         break 
        elif img.state == 'available': 
         print "AMI creation completed for instance: %s" % inst.tags['Name'] 
         break 
        else: 
         time.sleep(60) 
      elif img.state == 'available': 
       print "AMI creation completed for instance: %s" % inst.tags['Name'] 
      else: 
       print "Couldn't find the AMI" 
+0

印刷は何ですか? – stark

+0

AMIが作成されましたが、ループは終了せず、次のインスタンスには移動しませんでした。 出力 - > instance1(i-xxxxx)[実行中] インスタンス1のAMI作成の開始 – user6136315

答えて

1

img.update()を呼び出して状態を更新する必要があります。状態情報は自動的に更新されません。 AWSへの呼び出しは、boto API呼び出しに応答してのみ行われます。

 img = conn.get_all_images(filters={'image_id' : ami_id})[0] 

     if img.state == 'failed': 
      print "AMI creation failed for instance: %s" % inst.tags['Name'] 
     elif img.state == 'pending': 
      while True: 
       if img.state == 'failed': 
        print "AMI creation failed for instance: %s" % inst.tags['Name'] 
        break 
       elif img.state == 'available': 
        print "AMI creation completed for instance: %s" % inst.tags['Name'] 
        break 
       else: 
        time.sleep(60) 
        img.update() 
+0

これは良い発見です。どうもありがとうございます。 – user6136315