ec2标有以下内容:
的env,项目,目的
有一个属于项目和环境的实例列表。
conn = ec2.connect_to_region(region,aws_access_key_id=access_key,aws_secret_access_key=secret_key)
reservations = conn.get_all_instances(filters={"tag:env":env, "tag:project":project})
instances = [i for r in reservations for i in r.instances]
instances_id = [i.id for i in instances]
现在需要一种方法来获取标记的价值'目的'对于列表instance_id中的每个实例。
这样我就可以根据目的采取行动。
我正在浏览boto的get_all_tags函数,但我无法弄清楚如何在函数的过滤器中获取每个instance_id。还有一件事我只需要用于目的的唯一值。
我如何完成这项工作?
答案 0 :(得分:1)
我认为您需要一种方法来根据目标标记的值对所有实例进行分组。
def get_instances_by_purpose(access_key,secret_key,region,env,project):
conn = ec2.connect_to_region(region,aws_access_key_id=access_key,aws_secret_access_key=secret_key)
reservations = conn.get_all_instances(filters={"tag:env":env, "tag:project":project})
instances = [i for r in reservations for i in r.instances]
instances_by_purpose = {}
[instances_by_purpose.setdefault(i.tags.get('purpose'), []).append(i.id) for i in instances]
return instances_by_purpose
instances_by_purpose
变量包含一个字典,其中的键是所有可能的目标值,每个目的的值都是具有该目的的所有实例的列表。
e.g。目的值=" webserver"," backupserver"," logging" 输出将是 {"网络服务器":[" I-sdfsfd"" I-sdfsfd"" I-sdfsfd&#34], " backupserver将":[" I-werwer"" I-erwer"" I-3242erds&#34], ..... }
您可以对此进行更改,使其成为公共IP或私有IP的列表,或者您可以从实例对象中提取的任何其他属性。 例如如果您需要公共IP,请按如下所示更改列表推导:
[instances_by_purpose.setdefault(i.tags.get('purpose'), []).append(i.ip_address) for i in instances]
然后,您可以将其提供给另一个根据目的处理此有效负载的函数。
答案 1 :(得分:0)
试试这个:
for inst in instances:
if 'purpose' in inst.tags:
print "%s -> %s" % (inst.id, inst.tags['purpose'])
输出:
i-0123abcd -> foo
i-0123abcf -> bar