mirror of https://github.com/ansible/ansible.git
[ec2_ami_facts] new boto3-based module as a replacement for ec2_ami_find (#32252)
* [ec2_ami_facts] new boto3-based module as a replacement for ec2_ami_find - new boto3-based module to gather facts about ec2 images - intended to replace ec2_ami_find which uses boto - an ami find task (using new module) added to the ec2_ami integration test * [ec2_ami_facts] Use AnsibleAWSModule. Catch BotoCoreError. * add ec2_ami_facts alias to tests * [ec2_ami_facts] return ami launch permissions as wellpull/32475/head
parent
e33c24f585
commit
86141c3e03
@ -0,0 +1,236 @@
|
||||
#!/usr/bin/python
|
||||
# Copyright: Ansible Project
|
||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
|
||||
|
||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
||||
'status': ['preview'],
|
||||
'supported_by': 'community'}
|
||||
|
||||
|
||||
DOCUMENTATION = '''
|
||||
---
|
||||
module: ec2_ami_facts
|
||||
version_added: '2.5'
|
||||
short_description: Gather facts about ec2 AMIs
|
||||
description: Gather facts about ec2 AMIs
|
||||
author:
|
||||
- Prasad Katti, @prasadkatti
|
||||
requirements: [ boto3 ]
|
||||
options:
|
||||
image_ids:
|
||||
description: One or more image IDs.
|
||||
aliases: [image_id]
|
||||
filters:
|
||||
description:
|
||||
- A dict of filters to apply. Each dict item consists of a filter key and a filter value.
|
||||
- See U(https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImages.html) for possible filters.
|
||||
- Filter names and values are case sensitive.
|
||||
owners:
|
||||
description:
|
||||
- Filter the images by the owner. Valid options are an AWS account ID, self,
|
||||
- or an AWS owner alias ( amazon | aws-marketplace | microsoft ).
|
||||
aliases: [owner]
|
||||
executable_users:
|
||||
description:
|
||||
- Filter images by users with explicit launch permissions. Valid options are an AWS account ID, self, or all (public AMIs).
|
||||
aliases: [executable_user]
|
||||
|
||||
extends_documentation_fragment:
|
||||
- aws
|
||||
- ec2
|
||||
'''
|
||||
|
||||
EXAMPLES = '''
|
||||
# Note: These examples do not set authentication details, see the AWS Guide for details.
|
||||
|
||||
- name: gather facts about an AMI using ami-id
|
||||
ec2_ami_facts:
|
||||
image_ids: ami-5b488823
|
||||
|
||||
- name: gather facts about all AMIs with tag key Name and value webapp
|
||||
ec2_ami_facts:
|
||||
filters:
|
||||
"tag:Name": webapp
|
||||
|
||||
- name: gather facts about an AMI with 'AMI Name' equal to foobar
|
||||
ec2_ami_facts:
|
||||
filters:
|
||||
name: foobar
|
||||
|
||||
- name: gather facts about Ubuntu 17.04 AMIs published by Canonical (099720109477)
|
||||
ec2_ami_facts:
|
||||
owners: 099720109477
|
||||
filters:
|
||||
name: "ubuntu/images/ubuntu-zesty-17.04-*"
|
||||
'''
|
||||
|
||||
RETURN = '''
|
||||
images:
|
||||
description: a list of images
|
||||
returned: always
|
||||
type: complex
|
||||
contains:
|
||||
architecture:
|
||||
description: The architecture of the image
|
||||
returned: always
|
||||
type: string
|
||||
sample: x86_64
|
||||
block_device_mappings:
|
||||
description: Any block device mapping entries
|
||||
returned: always
|
||||
type: complex
|
||||
contains:
|
||||
device_name:
|
||||
description: The device name exposed to the instance
|
||||
returned: always
|
||||
type: string
|
||||
sample: /dev/sda1
|
||||
ebs:
|
||||
description: EBS volumes
|
||||
returned: always
|
||||
type: complex
|
||||
creation_date:
|
||||
description: The date and time the image was created
|
||||
returned: always
|
||||
type: string
|
||||
sample: '2017-10-16T19:22:13.000Z'
|
||||
description:
|
||||
description: The description of the AMI
|
||||
returned: always
|
||||
type: string
|
||||
sample: ''
|
||||
ena_support:
|
||||
description: whether enhanced networking with ENA is enabled
|
||||
returned: always
|
||||
type: bool
|
||||
sample: true
|
||||
hypervisor:
|
||||
description: The hypervisor type of the image
|
||||
returned: always
|
||||
type: string
|
||||
sample: xen
|
||||
image_id:
|
||||
description: The ID of the AMI
|
||||
returned: always
|
||||
type: string
|
||||
sample: ami-5b466623
|
||||
image_location:
|
||||
description: The location of the AMI
|
||||
returned: always
|
||||
type: string
|
||||
sample: 408466080000/Webapp
|
||||
image_type:
|
||||
description: The type of image
|
||||
returned: always
|
||||
type: string
|
||||
sample: machine
|
||||
launch_permissions:
|
||||
description: launch permissions of the ami
|
||||
returned: always
|
||||
type: complex
|
||||
sample: [{"group": "all"}, {"user_id": "408466080000"}]
|
||||
name:
|
||||
description: The name of the AMI that was provided during image creation
|
||||
returned: always
|
||||
type: string
|
||||
sample: Webapp
|
||||
owner_id:
|
||||
description: The AWS account ID of the image owner
|
||||
returned: always
|
||||
type: string
|
||||
sample: '408466080000'
|
||||
public:
|
||||
description: whether the image has public launch permissions
|
||||
returned: always
|
||||
type: bool
|
||||
sample: true
|
||||
root_device_name:
|
||||
description: The device name of the root device
|
||||
returned: always
|
||||
type: string
|
||||
sample: /dev/sda1
|
||||
root_device_type:
|
||||
description: The type of root device used by the AMI
|
||||
returned: always
|
||||
type: string
|
||||
sample: ebs
|
||||
sriov_net_support:
|
||||
description: whether enhanced networking is enabled
|
||||
returned: always
|
||||
type: string
|
||||
sample: simple
|
||||
state:
|
||||
description: The current state of the AMI
|
||||
returned: always
|
||||
type: string
|
||||
sample: available
|
||||
tags:
|
||||
description: Any tags assigned to the image
|
||||
returned: always
|
||||
type: complex
|
||||
virtualization_type:
|
||||
description: The type of virtualization of the AMI
|
||||
returned: always
|
||||
type: string
|
||||
sample: hvm
|
||||
'''
|
||||
|
||||
try:
|
||||
from botocore.exceptions import ClientError, BotoCoreError
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
from ansible.module_utils.aws.core import AnsibleAWSModule
|
||||
from ansible.module_utils.ec2 import (boto3_conn, ec2_argument_spec, get_aws_connection_info, ansible_dict_to_boto3_filter_list,
|
||||
camel_dict_to_snake_dict, boto3_tag_list_to_ansible_dict)
|
||||
|
||||
|
||||
def list_ec2_images(ec2_client, module):
|
||||
|
||||
image_ids = module.params.get("image_ids")
|
||||
filters = ansible_dict_to_boto3_filter_list(module.params.get("filters"))
|
||||
owners = module.params.get("owners")
|
||||
executable_users = module.params.get("executable_users")
|
||||
|
||||
try:
|
||||
images = ec2_client.describe_images(ImageIds=image_ids, Filters=filters, Owners=owners, ExecutableUsers=executable_users)
|
||||
images = [camel_dict_to_snake_dict(image) for image in images["Images"]]
|
||||
for image in images:
|
||||
launch_permissions = ec2_client.describe_image_attribute(Attribute='launchPermission', ImageId=image['image_id'])['LaunchPermissions']
|
||||
image['launch_permissions'] = [camel_dict_to_snake_dict(perm) for perm in launch_permissions]
|
||||
except (ClientError, BotoCoreError) as err:
|
||||
module.fail_json_aws(err, msg="error describing images")
|
||||
|
||||
for image in images:
|
||||
image['tags'] = boto3_tag_list_to_ansible_dict(image.get('tags', []), 'key', 'value')
|
||||
|
||||
module.exit_json(images=images)
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
argument_spec = ec2_argument_spec()
|
||||
argument_spec.update(
|
||||
dict(
|
||||
image_ids=dict(default=[], type='list', aliases=['image_id']),
|
||||
filters=dict(default={}, type='dict'),
|
||||
owners=dict(default=[], type='list', aliases=['owner']),
|
||||
executable_users=dict(default=[], type='list', aliases=['executable_user'])
|
||||
)
|
||||
)
|
||||
|
||||
module = AnsibleAWSModule(argument_spec=argument_spec, supports_check_mode=True)
|
||||
|
||||
region, ec2_url, aws_connect_params = get_aws_connection_info(module, boto3=True)
|
||||
|
||||
if region:
|
||||
ec2_client = 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")
|
||||
|
||||
list_ec2_images(ec2_client, module)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -1,2 +1,3 @@
|
||||
cloud/aws
|
||||
posix/ci/cloud/group1/aws
|
||||
ec2_ami_facts
|
||||
|
Loading…
Reference in New Issue