Beispiel #1
0
def should_format_volume(region, partition, erase_on_boot):
    """
We need to take a safe decision whether to format a volume or not
based on two inputs: value of user data flag and EBS volume tag.  The
tag can either be or not be there, which we model with values True and
False.  The user data flag can have 3 possible values: True, False and
None (when not given at all).

In the following table we mark the decision to format with exclamation
mark:

Data \ Tag | T | F
-----------+---+---
         T | ! | !
-----------+---+---
         F | - | -
-----------+---+---
         N | ! | -
    """
    erase_tag_set = False
    #
    # We should only try to query the EBS tags if user data doesn't
    # tell us anything: otherwise this will crash the instances which
    # don't have any role attached.
    #
    if erase_on_boot is None:
        ec2 = ec2_client(region)
        volumes = list(
            ec2.get_all_volumes(
                filters={
                    'attachment.instance-id': instance_id(),
                    'attachment.device': partition
                }))
        if volumes:
            volume_id = volumes[0].id
            logging.info("%s: volume_id=%s", partition, volume_id)

            tags = ec2.get_all_tags(
                filters={
                    'resource-id': volume_id,
                    'key': ERASE_ON_BOOT_TAG_NAME,
                    'value': 'True'
                })
            if list(tags):
                ec2.delete_tags(volume_id, [ERASE_ON_BOOT_TAG_NAME])
            erase_tag_set = True

    logging.info("%s: erase_on_boot=%s, erase_tag_set=%s", partition,
                 erase_on_boot, erase_tag_set)

    return erase_on_boot or (erase_on_boot is None and erase_tag_set)
Beispiel #2
0
def main():
    argument_spec = ec2_argument_spec()
    argument_spec.update(dict(
            resource = dict(required=True),
            tags = dict(),
            state = dict(default='present', choices=['present', 'absent', 'list']),
        )
    )
    module = AnsibleModule(argument_spec=argument_spec)

    resource = module.params.get('resource')
    tags = module.params.get('tags')
    state = module.params.get('state')
  
    ec2 = ec2_connect(module)
    
    # We need a comparison here so that we can accurately report back changed status.
    # Need to expand the gettags return format and compare with "tags" and then tag or detag as appropriate.
    filters = {'resource-id' : resource}
    gettags = ec2.get_all_tags(filters=filters)
   
    dictadd = {}
    dictremove = {}
    baddict = {}
    tagdict = {}
    for tag in gettags:
        tagdict[tag.name] = tag.value

    if state == 'present':
        if not tags:
            module.fail_json(msg="tags argument is required when state is present")
        if set(tags.items()).issubset(set(tagdict.items())):
            module.exit_json(msg="Tags already exists in %s." %resource, changed=False)
        else:
            for (key, value) in set(tags.items()): 
                if (key, value) not in set(tagdict.items()):
                    dictadd[key] = value
        tagger = ec2.create_tags(resource, dictadd)
        gettags = ec2.get_all_tags(filters=filters)
        module.exit_json(msg="Tags %s created for resource %s." % (dictadd,resource), changed=True)
 
    if state == 'absent':
        if not tags:
            module.fail_json(msg="tags argument is required when state is absent")
        for (key, value) in set(tags.items()):
            if (key, value) not in set(tagdict.items()):
                    baddict[key] = value
                    if set(baddict) == set(tags):
                        module.exit_json(msg="Nothing to remove here. Move along.", changed=False)
        for (key, value) in set(tags.items()):
            if (key, value) in set(tagdict.items()):
                    dictremove[key] = value
        tagger = ec2.delete_tags(resource, dictremove)
        gettags = ec2.get_all_tags(filters=filters)
        module.exit_json(msg="Tags %s removed for resource %s." % (dictremove,resource), changed=True)

    if state == 'list':
        module.exit_json(changed=False, tags=tagdict)
    sys.exit(0)
Beispiel #3
0
def delete_tags(ec2, resource_ids, tags):
    ec2.delete_tags(resource_ids, tags)
Beispiel #4
0
def main():
    argument_spec = ec2_argument_spec()
    argument_spec.update(dict(
            resource = dict(required=True),
            tags = dict(type='dict'),
            state = dict(default='present', choices=['present', 'absent', 'list']),
        )
    )
    module = AnsibleModule(argument_spec=argument_spec)

    if not HAS_BOTO:
        module.fail_json(msg='boto required for this module')

    resource = module.params.get('resource')
    tags = module.params.get('tags')
    state = module.params.get('state')
  
    ec2 = ec2_connect(module)
    
    # We need a comparison here so that we can accurately report back changed status.
    # Need to expand the gettags return format and compare with "tags" and then tag or detag as appropriate.
    filters = {'resource-id' : resource}
    gettags = ec2.get_all_tags(filters=filters)
   
    dictadd = {}
    dictremove = {}
    baddict = {}
    tagdict = {}
    for tag in gettags:
        tagdict[tag.name] = tag.value

    if state == 'present':
        if not tags:
            module.fail_json(msg="tags argument is required when state is present")
        if set(tags.items()).issubset(set(tagdict.items())):
            module.exit_json(msg="Tags already exists in %s." %resource, changed=False)
        else:
            for (key, value) in set(tags.items()): 
                if (key, value) not in set(tagdict.items()):
                    dictadd[key] = value
        tagger = ec2.create_tags(resource, dictadd)
        gettags = ec2.get_all_tags(filters=filters)
        module.exit_json(msg="Tags %s created for resource %s." % (dictadd,resource), changed=True)
 
    if state == 'absent':
        if not tags:
            module.fail_json(msg="tags argument is required when state is absent")
        for (key, value) in set(tags.items()):
            if (key, value) not in set(tagdict.items()):
                    baddict[key] = value
                    if set(baddict) == set(tags):
                        module.exit_json(msg="Nothing to remove here. Move along.", changed=False)
        for (key, value) in set(tags.items()):
            if (key, value) in set(tagdict.items()):
                    dictremove[key] = value
        tagger = ec2.delete_tags(resource, dictremove)
        gettags = ec2.get_all_tags(filters=filters)
        module.exit_json(msg="Tags %s removed for resource %s." % (dictremove,resource), changed=True)

    if state == 'list':
        module.exit_json(changed=False, tags=tagdict)
Beispiel #5
0
def delete_tags(ec2, resource_ids, tags):
    ec2.delete_tags(resource_ids, tags)