Используя тропосферу для формирования облаков, как добавить "распространение при запуске" в теги


Я использую модуль Python troposphere для генерации тегов в моем шаблоне формирования облака. Текущий скрипт генерирует:

       "Tags": [{"Key":"Name", "Value":"MyTagName"}, 
                {"Key":"Version", "Value":"123456"}]

Но мне нужно сгенерировать

       "Tags":[{"Key":"Name", "Value":"MyTagName", "PropagateAtLaunch":"true"},
               {"Key":"Version", "Value":"123456", "PropagateAtLaunch":"true"}]

Часть сценария, которая применяется:

    asg = autoscaling.AutoScalingGroup("MyASG")
    asg.Tags = Tags(Name = "MyTagName", Version = "123456")
    t.add_resource(asg)
1 4

1 ответ:

---- обновление ---

Функция добавлена в главную ветку, я просто оставляю свой предыдущий ответ Для справки и на случай, если у вас нет доступа к последней версии troposphere (т. е. если вы не клонируете репозиторий). Вы все еще можете использовать короткую функцию в своем коде (3-й вариант), тем не менее, она будет работать.

Класс справки "Теги" (из модуля troposphere) не может генерировать списки тегов ASG (ключ / значение / распространение), только основные списки тегов (ключ / значение - например, для EC2). Вы можете использовать тропосферу .автоматическое масштабирование.Вместо этого класс Tags , который имитирует последний, с добавлением свойства "propagate".

Вы можете использовать его следующим образом:

    asg.Tags = autoscaling.Tags(Name = 'MyTagName', Version = '123456')

Все ваши теги будут иметь свойство PropagateAtLaunch, равное true. Если вы хотите другое свойство PropagateAtLaunch, просто напишите так:

    asg.Tags = autoscaling.Tags(Name = 'MyTagName', Version = '123456', 
      NonPropagatedTag=('fail',False))

Тег NonPropagatedTag не будет распространяться (сюрприз!) и имеют значение "провалиться".


Предыдущий ответ:

Вы не можете использовать вспомогательный класс "Теги" (из модуля troposphere) для создания списков тегов ASG (key/value/propagate), только основные списки тегов (key/value). Быстрый взгляд на исходный код покажет вам, почему (https://github.com/cloudtools/troposphere/blob/master/troposphere/init.py)

Это оставляет вам три варианта:

  • Длинный и трудный путь: список тегов ASG (в тропосфере) - это просто список python из диктовок с тремя ключами: Name, Value и PropagateAtLaunch. Таким образом, ваш код будет выглядеть следующим образом:

    asg.Tags= [{'Key':'Name','Value':'MyTagName','PropagateAtLaunch':'true'}, 
      {'Key':'Version','Value':'123456','PropagateAtLaunch':'true'}]
    

    Да, некрасиво.

  • Чуть короче: вместо диктов вы можете использовать автоматическое масштабирование.Помощник тэг класс, который принимает 3 параметра : ключ тег, значение тега, распространяются. Вам придется кодировать:

    asg.Tags= [autoscaling.Tag('Name','MyTagName','true'),
      autoscaling.Tag('Version','123456','true')]
    

    Если у вас не так много тегов или вы просто используете их в одном месте, это нормально. Но вспомогательный класс тегов так хорош...

  • Используйте другой вспомогательный класс, чтобы создавать специальные ПГС список тегов. Я просто сделал запрос на репозиторий GitHub для тропосферы это небольшое дополнение :

    class TagsASG(troposphere.AWSHelperFn):
        defaultPropagateAtLaunch=True
        manyType=[type([]), type(())]
    
        def __init__(self, **kwargs):
            self.tags = []
            for k, v in sorted(kwargs.iteritems()):
                if type(v) in self.manyType:
                  propagate=str(v[1]).lower()
                  v=v[0]
                else:
                  propagate=str(self.defaultPropagateAtLaunch).lower()
                self.tags.append({
                    'Key': k,
                    'Value': v,
                    'PropagateAtLaunch':propagate,
                })
    
        def JSONrepr(self):
            return self.tags
    

Теперь вы можете использовать его следующим образом:

    asg.Tags = TagsASG(Name = 'MyTagName', Version = '123456')

Все ваши теги будут иметь свойство PropagateAtLaunch, равное true. Если вы хотите другое свойство PropagateAtLaunch, просто напишите так:

    asg.Tags = TagsASG(Name = 'MyTagName', Version = '123456', 
      NonPropagatedTag=('fail',False))

Тег NonPropagatedTag не будет распространяться (сюрприз!) и имеют значение 'fail'.