繁体   English   中英

使用 if 条件中断 while 循环

[英]break while loop whthin with a if condition

我正在做一个自动化 AMI 创建的项目。 要求: 1. 创建 AMI 2. 等到 AMI 创建 3. 如果 AMI 创建失败或成功,则中断循环 4. 对所有实例重复该过程

我们不想在创建 AMI 时重启实例。

问题:当我将 break 语句添加到 if 条件时,脚本不会终止内部 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"

您需要通过调用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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM