使用Saltstack标记EC2实例

时间:2014-01-13 17:07:27

标签: amazon-ec2 salt-stack

我对使用saltstack相当新,我试图在配置期间让salt-cloud标记我的EC2实例。我认为这是需要在cloud.profiles中完成的事情。我一直在寻找文档和尝试在配置EC2实例时为其创建标记的具体示例。我发现创建后的标记实例可以通过以下命令行完成:
    salt-cloud -a set_tags mymachine tag1=somestuff tag2='Other stuff' 但是,我希望在创建实例时自动执行这些操作。

另一方面,我没有发现盐文档是最有帮助的。如果有一个教程或演练来帮助我更多地熟悉saltstack,我将非常感谢您的意见。

谢谢,

2 个答案:

答案 0 :(得分:2)

ec2.py云模块在配置文件中查找“标记”。

以下示例来自上述文件。

mysql_profile:
  provider: ec2
  size: 1024MB
  tags:
    tag1: somestuff
    tag2: "others stuff" 
  [...]

答案 1 :(得分:1)

salt.states.cloud文档谈论使用“cloud.tagged”Salt状态,但它似乎没有实现。

http://docs.saltstack.com/en/latest/ref/states/all/salt.states.cloud.html#using-states-instead-of-maps-to-deploy-clouds

创建实例时,似乎可以使用这样的标记属性:

my-server-name:
    cloud.present:
        - name: 'my-server-name'
        #...other properties
        - tag:
            'Env': 'auto-test'

这会在创建时应用标记,但如果实例已存在则不会更新它们。另外,我不知道如何在cloud.present中标记EBS卷。

您可以使用Python boto库重新标记SaltStack创建的实例并标记EBS卷。下面的示例代码 - 适用于实例和EBS卷。

def find_instance(instanceName, region):
    boto_ec2 = boto.ec2.connect_to_region(region)
    instances = boto_ec2.get_only_instances()
    for instance in instances:
        if instance.tags.get("Name", None) == instanceName:
            return instance
    return None



def ensure_instance_tags(instance, region, tags):
    newTags = {}    

    for tagName in tags:
        if instance.tags.get(tagName, None) != tags[tagName]:
            newTags[tagName] = tags[tagName]

    if bool(newTags):
        sys.stdout.write("Updating tags for instance " + instance.id + "\n")
        boto_ec2 = boto.ec2.connect_to_region(region)
        boto_ec2.create_tags(instance.id, newTags)