Фильтровать экземпляры на основе имени тега и печатать определенное значение тега в Python - PullRequest
0 голосов
/ 29 мая 2019

Я хотел отфильтровать свои экземпляры на основе значения тега. Это завершено, и я получаю несколько ключей и значений тегов для каждого экземпляра.

Код:

client = boto3.client("ec2")
response = client.describe_instances(
    Filters=[
        {
            'Name': 'tag:Name',
            'Values': [
                'myapp-*'
            ]
        },
        {
            'Name': 'instance-state-name',
            'Values': [
                'running',
            ]
        }
    ]
)['Reservations']

for ec2_reservation in response:
    for ec2_instance in ec2_reservation["Instances"]:
       print(ec2_instance)

Ответ: (Я намеренно удалил все остальные поля и вставил только теги ниже)

'Tags': [{'Key': 'Patch group', 'Value': 'Amazon-Linux'},
          {'Key': 'Name', 'Value': 'myapp-mgmt-1'},
          {'Key': 'environment', 'Value': 'devl'},
          {'Key': 'ssm-managed', 'Value': 'true'},

'Tags': [{'Key': 'Patch group', 'Value': 'Amazon-Linux'},
          {'Key': 'Name', 'Value': 'myapp-web-1'},
          {'Key': 'environment', 'Value': 'devl'},
          {'Key': 'ssm-managed', 'Value': 'true'},

Теперь, когда я пытался напечатать значение key-name, я не могу его сделать. Ниже я попробовал. Можете ли вы помочь мне разобраться с этим. Может быть продублирован, но не смог найти подходящую ссылку из других сообщений.

print(ec2_instance["Tags"][0][{'Name':'tag-key', 'Values':['Name']}])

TypeError: unhashable type: 'dict'

Я ожидаю вывод как:

'myapp-mgmt-1'
'myapp-web-1'

1 Ответ

0 голосов
/ 11 июня 2019

Через некоторое время я это разобрался. Вот полный код для вашей справки:

Примечание: используя boto3.resource, мне приходилось переключаться между экземплярами, чтобы получить их имена тегов.

client = boto3.client("ec2")
resource = boto3.resource("ec2")

response = client.describe_instances(
    Filters=[
        {
            'Name': 'tag:Name',
            'Values': [
                'myapp-*'
            ]
        },
        {
            'Name': 'instance-state-name',
            'Values': [
                'running',
            ]
        }
    ]
)['Reservations']

instanceList = []
for reservation in response:
    ec2_instances = reservation["Instances"]
    for instance in ec2_instances:
        InstanceId = (instance['InstanceId'])
        #InstanceState = (instance['State']['Name'])
        #InstanceLaunchTime = (instance['LaunchTime'])

        ec2instance = resource.Instance(InstanceId)
        InstanceName = []
        for tags in ec2instance.tags:
            if tags["Key"] == 'Name':
                InstanceName = tags['Value']

        fInstance = (InstanceName, InstanceId)
        InstanceDetails = (",".join(fInstance))
        instanceList.append(fInstance)

print(json.dumps(instanceList, indent=4))

На данный момент это работает для меня. Пожалуйста, дайте мне знать, если у вас есть какой-нибудь лучший способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...