diff --git a/cloud/amazon/elasticache_subnet_group.py b/cloud/amazon/elasticache_subnet_group.py new file mode 100644 index 00000000000..5956fa37e83 --- /dev/null +++ b/cloud/amazon/elasticache_subnet_group.py @@ -0,0 +1,163 @@ +#!/usr/bin/python +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +DOCUMENTATION = ''' +--- +module: elasticache_subnet_group +version_added: "2.0" +short_description: manage Elasticache subnet groups +description: + - Creates, modifies, and deletes Elasticache subnet groups. This module has a dependency on python-boto >= 2.5. +options: + state: + description: + - Specifies whether the subnet should be present or absent. + required: true + default: present + aliases: [] + choices: [ 'present' , 'absent' ] + name: + description: + - Database subnet group identifier. + required: true + default: null + aliases: [] + description: + description: + - Elasticache subnet group description. Only set when a new group is added. + required: false + default: null + aliases: [] + subnets: + description: + - List of subnet IDs that make up the Elasticache subnet group. + required: false + default: null + aliases: [] + region: + description: + - The AWS region to use. If not specified then the value of the AWS_REGION or EC2_REGION environment variable, if any, is used. + required: true + default: null + aliases: ['aws_region', 'ec2_region'] +author: Tim Mahoney +extends_documentation_fragment: aws +''' + +EXAMPLES = ''' +# Add or change a subnet group +- elasticache_subnet_group + state: present + name: norwegian-blue + description: My Fancy Ex Parrot Subnet Group + subnets: + - subnet-aaaaaaaa + - subnet-bbbbbbbb + +# Remove a subnet group +- elasticache_subnet_group: + state: absent + name: norwegian-blue +''' + +try: + import boto + from boto.elasticache.layer1 import ElastiCacheConnection + from boto.regioninfo import RegionInfo + from boto.exception import BotoServerError + HAS_BOTO = True +except ImportError: + HAS_BOTO = False + +def main(): + argument_spec = ec2_argument_spec() + argument_spec.update(dict( + state = dict(required=True, choices=['present', 'absent']), + name = dict(required=True), + description = dict(required=False), + subnets = dict(required=False, type='list'), + ) + ) + module = AnsibleModule(argument_spec=argument_spec) + + if not HAS_BOTO: + module.fail_json(msg='boto required for this module') + + state = module.params.get('state') + group_name = module.params.get('name').lower() + group_description = module.params.get('description') + group_subnets = module.params.get('subnets') or {} + + if state == 'present': + for required in ['name', 'description', 'subnets']: + if not module.params.get(required): + module.fail_json(msg = str("Parameter %s required for state='present'" % required)) + else: + for not_allowed in ['description', 'subnets']: + if module.params.get(not_allowed): + module.fail_json(msg = str("Parameter %s not allowed for state='absent'" % not_allowed)) + + # Retrieve any AWS settings from the environment. + region, ec2_url, aws_connect_kwargs = get_aws_connection_info(module) + + if not region: + module.fail_json(msg = str("Either region or AWS_REGION or EC2_REGION environment variable or boto config aws_region or ec2_region must be set.")) + + + """Get an elasticache connection""" + try: + endpoint = "elasticache.%s.amazonaws.com" % region + connect_region = RegionInfo(name=region, endpoint=endpoint) + conn = ElastiCacheConnection(region=connect_region, **aws_connect_kwargs) + except boto.exception.NoAuthHandlerFound, e: + module.fail_json(msg=e.message) + + try: + changed = False + exists = False + + try: + matching_groups = conn.describe_cache_subnet_groups(group_name, max_records=100) + exists = len(matching_groups) > 0 + except BotoServerError, e: + if e.error_code != 'CacheSubnetGroupNotFoundFault': + module.fail_json(msg = e.error_message) + + if state == 'absent': + if exists: + conn.delete_cache_subnet_group(group_name) + changed = True + else: + if not exists: + new_group = conn.create_cache_subnet_group(group_name, cache_subnet_group_description=group_description, subnet_ids=group_subnets) + changed = True + else: + changed_group = conn.modify_cache_subnet_group(group_name, cache_subnet_group_description=group_description, subnet_ids=group_subnets) + changed = True + + except BotoServerError, e: + if e.error_message != 'No modifications were requested.': + module.fail_json(msg = e.error_message) + else: + changed = False + + module.exit_json(changed=changed) + +# import module snippets +from ansible.module_utils.basic import * +from ansible.module_utils.ec2 import * + +main() \ No newline at end of file