diff options
author | Will Thames <will@thames.id.au> | 2017-06-20 14:31:31 +0200 |
---|---|---|
committer | Ryan Brown <sb@ryansb.com> | 2017-06-20 14:31:31 +0200 |
commit | f3c98f482a833daefc8d0f7074b39edb4df58b68 (patch) | |
tree | f1dc4bcd32edc3a659f32e657eef42a849300000 /lib | |
parent | [cloud] iam_cert return arn and allow use with ansible vault (#20787) (diff) | |
download | ansible-f3c98f482a833daefc8d0f7074b39edb4df58b68.tar.xz ansible-f3c98f482a833daefc8d0f7074b39edb4df58b68.zip |
[cloud] New module ec2_vpc_endpoint_facts for AWS EC2 VPC Endpoints (#20211)
* New facts module for AWS EC2 VPC Endpoints
* ec2_vpc_endpoint_facts - meet latest Ansible standards
Fix exception syntax and use of `iteritems` for python3
Fix undefined `ec2` variable (should have been `connection`
Address various flake8 issues
Use `ansible_dict_to_boto3_filter_list` rather than
duplicating its implementation
* Remove max_items and next_token from vpc_endpoint_facts
max_items and next_token should be a module concern, not
a caller concern. It would be very difficult for a module
consumer to use next_token properly, whereas it's easy for
the module to handle it.
* ec2_vpc_endpoint_facts trivially supports check mode
Add supports_check_mode=True to the argument spec.
* Improve RETURN documentation for ec2_vpc_endpoint_facts
Fix bug in EXAMPLE documentation too
* fix return type for validate-modules
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ansible/modules/cloud/amazon/ec2_vpc_endpoint_facts.py | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/lib/ansible/modules/cloud/amazon/ec2_vpc_endpoint_facts.py b/lib/ansible/modules/cloud/amazon/ec2_vpc_endpoint_facts.py new file mode 100644 index 0000000000..6505414cdf --- /dev/null +++ b/lib/ansible/modules/cloud/amazon/ec2_vpc_endpoint_facts.py @@ -0,0 +1,205 @@ +#!/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 <http://www.gnu.org/licenses/>. + +ANSIBLE_METADATA = {'metadata_version': '1.0', + 'status': ['preview'], + 'supported_by': 'community'} + +DOCUMENTATION = ''' +module: ec2_vpc_endpoint_facts +short_description: Retrieves AWS VPC endpoints details using AWS methods. +description: + - Gets various details related to AWS VPC Endpoints +version_added: "2.4" +requirements: [ boto3 ] +options: + query: + description: + - Specifies the query action to take. Services returns the supported + AWS services that can be specified when creating an endpoint. + required: True + choices: + - services + - endpoints + vpc_endpoint_ids: + description: + - Get details of specific endpoint IDs + - Provide this value as a list + required: false + default: None + filters: + description: + - A dict of filters to apply. Each dict item consists of a filter key and a filter value. + See U(http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcEndpoints.html) + for possible filters. + required: false + default: None +author: Karen Cheng(@Etherdaemon) +extends_documentation_fragment: aws +''' + +EXAMPLES = ''' +# Simple example of listing all support AWS services for VPC endpoints +- name: List supported AWS endpoint services + ec2_vpc_endpoint_facts: + query: services + region: ap-southeast-2 + register: supported_endpoint_services + +- name: Get all endpoints in ap-southeast-2 region + ec2_vpc_endpoint_facts: + query: endpoints + region: ap-southeast-2 + register: existing_endpoints + +- name: Get all endpoints with specific filters + ec2_vpc_endpoint_facts: + query: endpoints + region: ap-southeast-2 + filters: + vpc-id: + - vpc-12345678 + - vpc-87654321 + vpc-endpoint-state: + - available + - pending + register: existing_endpoints + +- name: Get details on specific endpoint + ec2_vpc_endpoint_facts: + query: endpoints + region: ap-southeast-2 + vpc_endpoint_ids: + - vpce-12345678 + register: endpoint_details +''' + +RETURN = ''' +service_names: + description: AWS VPC endpoint service names + returned: I(query) is C(services) + type: list + sample: + service_names: + - com.amazonaws.ap-southeast-2.s3 +vpc_endpoints: + description: + - A list of endpoints that match the query. Each endpoint has the keys creation_timestamp, + policy_document, route_table_ids, service_name, state, vpc_endpoint_id, vpc_id. + returned: I(query) is C(endpoints) + type: list + sample: + vpc_endpoints: + - creation_timestamp: "2017-02-16T11:06:48+00:00" + policy_document: > + "{\"Version\":\"2012-10-17\",\"Id\":\"Policy1450910922815\", + \"Statement\":[{\"Sid\":\"Stmt1450910920641\",\"Effect\":\"Allow\", + \"Principal\":\"*\",\"Action\":\"s3:*\",\"Resource\":[\"arn:aws:s3:::*/*\",\"arn:aws:s3:::*\"]}]}" + route_table_ids: + - rtb-abcd1234 + service_name: "com.amazonaws.ap-southeast-2.s3" + state: "available" + vpc_endpoint_id: "vpce-abbad0d0" + vpc_id: "vpc-1111ffff" +''' + +import json + +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.ec2 import ec2_argument_spec, boto3_conn, get_aws_connection_info +from ansible.module_utils.ec2 import ansible_dict_to_boto3_filter_list, HAS_BOTO3 +from ansible.module_utils.ec2 import camel_dict_to_snake_dict + + +try: + import botocore +except ImportError: + pass # will be picked up from imported HAS_BOTO3 + + +def date_handler(obj): + return obj.isoformat() if hasattr(obj, 'isoformat') else obj + + +def get_supported_services(client, module): + results = list() + params = dict() + while True: + response = client.describe_vpc_endpoint_services(**params) + results.extend(response['ServiceNames']) + if 'NextToken' in response: + params['NextToken'] = response['NextToken'] + else: + break + return dict(service_names=results) + + +def get_endpoints(client, module): + results = list() + params = dict() + params['Filters'] = ansible_dict_to_boto3_filter_list(module.params.get('filters')) + if module.params.get('vpc_endpoint_ids'): + params['VpcEndpointIds'] = module.params.get('vpc_endpoint_ids') + while True: + response = client.describe_vpc_endpoints(**params) + results.extend(response['VpcEndpoints']) + if 'NextToken' in response: + params['NextToken'] = response['NextToken'] + else: + break + try: + results = json.loads(json.dumps(results, default=date_handler)) + except Exception as e: + module.fail_json(msg=str(e.message)) + return dict(vpc_endpoints=[camel_dict_to_snake_dict(result) for result in results]) + + +def main(): + argument_spec = ec2_argument_spec() + argument_spec.update( + dict( + query=dict(choices=['services', 'endpoints'], required=True), + filters=dict(default={}, type='dict'), + vpc_endpoint_ids=dict(type='list'), + ) + ) + + module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) + + # Validate Requirements + if not HAS_BOTO3: + module.fail_json(msg='botocore and boto3 are required.') + + try: + region, ec2_url, aws_connect_params = get_aws_connection_info(module, boto3=True) + if region: + connection = boto3_conn(module, conn_type='client', resource='ec2', region=region, endpoint=ec2_url, **aws_connect_params) + else: + module.fail_json(msg="region must be specified") + except botocore.exceptions.NoCredentialsError as e: + module.fail_json(msg=str(e)) + + invocations = { + 'services': get_supported_services, + 'endpoints': get_endpoints, + } + results = invocations[module.params.get('query')](connection, module) + + module.exit_json(**results) + + +if __name__ == '__main__': + main() |