2014-12-26 24 views
3

我正在使用python模块对流层在我的云形成模板中生成标签。当前脚本生成:使用对流层形成云,我如何在标签上添加“在发射时传播”

 "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) 
+0

您测试过以下吗?asg.Tags = Tags(Name =“MyTagName”,Version =“123456”,“PropagateAtLaunch”=“true”) –

+0

看起来它会添加第三个列表元素'{“Key”:“PropogateAtLaunch”,“Value “:”真“}',不幸的是。 –

回答

1

---- UPDATE ---

该功能已被添加到主分支,我只是离开我的以前的回答仅供参考,如果您无法访问最新版本的对流层(即,如果您不克隆存储库)。你仍然可以在你的代码中使用简短的函数(第三选项),它仍然可以工作。

“标签”帮助类(来自对流层模块)不能生成ASG标签列表(键/值/传播),只有基本标签列表(键/值 - 例如EC2)。 您可以使用troposphere.autoscaling.Tags类,它会模仿最新的类,并增加“传播”属性。

您可以使用它像这样:

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

你所有的标签将有PropagateAtLaunch属性设置为“真”。如果你想有一个不同的PropagateAtLaunch财产,只是这样写:

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

的NonPropagatedTag标签将不会传播和拥有的“失败”的值(惊喜!)。


以前的答案:

不能使用“标签”的辅助类(从对流层模块)来产生ASG标签列表(键/值/传播),只有基本的标签列表(键/值) 。快速查看源代码,会告诉你为什么(https://github.com/cloudtools/troposphere/blob/master/troposphere/init.py

它让你有三个选择:

  • 长&硬的方式:一个ASG标签列表(在对流层)仅仅是一个Python列表具有三个键的字典:名称,值和PropagateAtLaunch。因此,您的代码将如下所示:

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

    是的,很难看。

  • 只是稍微缩短了一点:您可以使用autoscaling.Tag帮助程序类,它采用3个参数:标记键,标记值,传播,而不是字典。你将不得不代码:

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

    ,如果你没有太多的标签,或者只是用它在一个地方,那也无妨。但标签助手类非常好...

  • 使用另一个辅助类来生成ASG特定标记列表。我只是做了对流层的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标签将不会传播和拥有的“失败”的值(惊喜!)。

+0

选项2(autoscaling.Tag)就像一个魅力。谢谢。选项3看起来像更好的解决方案,但我想我会等到拉申请被应用。 – efreedom

+1

已将它合并到主分支中。希望答案有帮助,如果是这种情况,请不要忘记投票...... :) – huelbois

相关问题