Динамическая инвентаризация скриптов экземпляров EC2 с именем тега Ansible на основе его значений

#python #boto3

#python #boto3

Вопрос:

Я пытаюсь написать пример кода на python, используя функцию Boto3, для проверки экземпляров Ec2 с именем тега ‘Ansible’ и его значением ‘DB’ или ‘APP’, он должен возвращать соответствующие частные IP-адреса значений этих тегов.

попытался изменить фильтр, добавив [] . В коде, который я нашел в ссылках youtube, нет [], даже после их добавления я получаю эту ошибку.

 #!/bin/python
import boto3
import json
def get_hosts(ec2,fv):
        f=[{'Name':'tag:Ansible','values':[fv]}]
        hosts=[]
        for each_in in ec2.instances.filter(Filters=[f]):
                print each_in.private_ip_address
                hosts.append(each_in.private_ip_address)
        return hosts

def main():
        ec2=boto3.resource("ec2")
        db_group = get_hosts(ec2,"db")
        app_group = get_hosts(ec2,"app")


if __name__ =="__main__":
        main()
  

Например, у меня есть 4 экземпляра с именем тега Ansible, которые имеют значения типа ‘db’ в виде 2 экземпляров и ‘app’ еще в виде 2 экземпляров.
Мой вывод должен быть следующим
db [172.31.24.232,172.31.21.244]
приложение [172.31.30.42,172.31.26.116]

Ответ №1:

 Below is the correct code and usage of filters.

#!/bin/python
import boto3
import json
def get_hosts(ec2,fv):
        #f=[{'Name':'tag:Ansible','values':[fv]}]
        hosts = []
        #for each_in in ec2.instances.filter[Filters=[f]]:
        #for each_in in ec2.describe_instances(Filters=[{'Name':'tag:Ansible','Values':[fv]}]):
        instances = ec2.instances.filter(Filters=[{'Name': 'tag:Ansible', 'Values': [fv]}])
        for instance in instances:
                #print instance.private_ip_address
                hosts.append(instance.private_ip_address)
        return hosts

def main():
        ec2=boto3.resource("ec2")
        db_group = get_hosts(ec2,"db")
        app_group = get_hosts(ec2,"app")
        print "db :", db_group
        print "app :",app_group

if __name__ =="__main__":
        main()