2016-04-22 59 views
1

我正在开发一个AMI创建自动化项目。 要求:1,创建一个AMI 2.等待AMI创建 3.突破我们不想重新启动,如果AMI创建失败的循环或成功 4.重复所有实例break if while whthin if if条件

程序我们创建AMI时的实例。

问题:当我添加break语句到if条件时,脚本没有终止内循环。有人可以帮我修复代码。

#!/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)[运行] 开始创建AMI:instance1 – 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