mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
rds_instance_facts module
Create rds_instance_facts module using boto3. Create common rds.py module_util library to be used by rds_instance_facts and future RDS modules. rds_instance_facts: use latest AWS helper methods * Use `module.client` with `retry` to create AWS connection * Return tags, using AWSRetry helper to backoff * Use paginator to describe DB instances * Further improve exception handling * Fix RETURN documentation update version_added Co-authored-by: Michael De La Rue <jababubic.margoteen@spamgourmet.com>
This commit is contained in:
parent
2f70360698
commit
42368ce310
1 changed files with 398 additions and 0 deletions
398
lib/ansible/modules/cloud/amazon/rds_instance_facts.py
Normal file
398
lib/ansible/modules/cloud/amazon/rds_instance_facts.py
Normal file
|
@ -0,0 +1,398 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
# Copyright (c) 2017, 2018 Michael De La Rue
|
||||||
|
# Copyright (c) 2017, 2018 Will Thames
|
||||||
|
# Copyright (c) 2017 Ansible Project
|
||||||
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
|
||||||
|
ANSIBLE_METADATA = {'status': ['preview'],
|
||||||
|
'supported_by': 'community',
|
||||||
|
'metadata_version': '1.1'}
|
||||||
|
|
||||||
|
DOCUMENTATION = '''
|
||||||
|
---
|
||||||
|
module: rds_instance_facts
|
||||||
|
version_added: "2.6"
|
||||||
|
short_description: obtain facts about one or more RDS instances
|
||||||
|
description:
|
||||||
|
- obtain facts about one or more RDS instances
|
||||||
|
options:
|
||||||
|
db_instance_identifier:
|
||||||
|
description:
|
||||||
|
- The RDS instance's unique identifier.
|
||||||
|
required: false
|
||||||
|
aliases:
|
||||||
|
- id
|
||||||
|
filters:
|
||||||
|
description:
|
||||||
|
- A filter that specifies one or more DB instances to describe.
|
||||||
|
See U(https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBInstances.html)
|
||||||
|
requirements:
|
||||||
|
- "python >= 2.7"
|
||||||
|
- "boto3"
|
||||||
|
author:
|
||||||
|
- "Will Thames (@willthames)"
|
||||||
|
- "Michael De La Rue (@mikedlr)"
|
||||||
|
extends_documentation_fragment:
|
||||||
|
- aws
|
||||||
|
- ec2
|
||||||
|
'''
|
||||||
|
|
||||||
|
EXAMPLES = '''
|
||||||
|
# Get facts about an instance
|
||||||
|
- rds_instance_facts:
|
||||||
|
name: new-database
|
||||||
|
register: new_database_facts
|
||||||
|
|
||||||
|
# Get all RDS instances
|
||||||
|
- rds_instance_facts:
|
||||||
|
'''
|
||||||
|
|
||||||
|
RETURN = '''
|
||||||
|
instances:
|
||||||
|
description: List of RDS instances
|
||||||
|
returned: always
|
||||||
|
type: complex
|
||||||
|
contains:
|
||||||
|
allocated_storage:
|
||||||
|
description: Gigabytes of storage allocated to the database
|
||||||
|
returned: always
|
||||||
|
type: int
|
||||||
|
sample: 10
|
||||||
|
auto_minor_version_upgrade:
|
||||||
|
description: Whether minor version upgrades happen automatically
|
||||||
|
returned: always
|
||||||
|
type: bool
|
||||||
|
sample: true
|
||||||
|
availability_zone:
|
||||||
|
description: Availability Zone in which the database resides
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: us-west-2b
|
||||||
|
backup_retention_period:
|
||||||
|
description: Days for which backups are retained
|
||||||
|
returned: always
|
||||||
|
type: int
|
||||||
|
sample: 7
|
||||||
|
ca_certificate_identifier:
|
||||||
|
description: ID for the CA certificate
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: rds-ca-2015
|
||||||
|
copy_tags_to_snapshot:
|
||||||
|
description: Whether DB tags should be copied to the snapshot
|
||||||
|
returned: always
|
||||||
|
type: bool
|
||||||
|
sample: false
|
||||||
|
db_instance_arn:
|
||||||
|
description: ARN of the database instance
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: arn:aws:rds:us-west-2:111111111111:db:helloworld-rds
|
||||||
|
db_instance_class:
|
||||||
|
description: Instance class of the database instance
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: db.t2.small
|
||||||
|
db_instance_identifier:
|
||||||
|
description: Database instance identifier
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: helloworld-rds
|
||||||
|
db_instance_port:
|
||||||
|
description: Port used by the database instance
|
||||||
|
returned: always
|
||||||
|
type: int
|
||||||
|
sample: 0
|
||||||
|
db_instance_status:
|
||||||
|
description: Status of the database instance
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: available
|
||||||
|
db_name:
|
||||||
|
description: Name of the database
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: management
|
||||||
|
db_parameter_groups:
|
||||||
|
description: List of database parameter groups
|
||||||
|
returned: always
|
||||||
|
type: complex
|
||||||
|
contains:
|
||||||
|
db_parameter_group_name:
|
||||||
|
description: Name of the database parameter group
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: psql-pg-helloworld
|
||||||
|
parameter_apply_status:
|
||||||
|
description: Whether the parameter group has been applied
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: in-sync
|
||||||
|
db_security_groups:
|
||||||
|
description: List of security groups used by the database instance
|
||||||
|
returned: always
|
||||||
|
type: list
|
||||||
|
sample: []
|
||||||
|
db_subnet_group:
|
||||||
|
description: list of subnet groups
|
||||||
|
returned: always
|
||||||
|
type: complex
|
||||||
|
contains:
|
||||||
|
db_subnet_group_description:
|
||||||
|
description: Description of the DB subnet group
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: My database subnet group
|
||||||
|
db_subnet_group_name:
|
||||||
|
description: Name of the database subnet group
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: my-subnet-group
|
||||||
|
subnet_group_status:
|
||||||
|
description: Subnet group status
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: Complete
|
||||||
|
subnets:
|
||||||
|
description: List of subnets in the subnet group
|
||||||
|
returned: always
|
||||||
|
type: complex
|
||||||
|
contains:
|
||||||
|
subnet_availability_zone:
|
||||||
|
description: Availability zone of the subnet
|
||||||
|
returned: always
|
||||||
|
type: complex
|
||||||
|
contains:
|
||||||
|
name:
|
||||||
|
description: Name of the availability zone
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: us-west-2c
|
||||||
|
subnet_identifier:
|
||||||
|
description: Subnet ID
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: subnet-abcd1234
|
||||||
|
subnet_status:
|
||||||
|
description: Subnet status
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: Active
|
||||||
|
vpc_id:
|
||||||
|
description: VPC id of the subnet group
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: vpc-abcd1234
|
||||||
|
dbi_resource_id:
|
||||||
|
description: AWS Region-unique, immutable identifier for the DB instance
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: db-AAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
domain_memberships:
|
||||||
|
description: List of domain memberships
|
||||||
|
returned: always
|
||||||
|
type: list
|
||||||
|
sample: []
|
||||||
|
endpoint:
|
||||||
|
description: Database endpoint
|
||||||
|
returned: always
|
||||||
|
type: complex
|
||||||
|
contains:
|
||||||
|
address:
|
||||||
|
description: Database endpoint address
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: helloworld-rds.ctrqpe3so1sf.us-west-2.rds.amazonaws.com
|
||||||
|
hosted_zone_id:
|
||||||
|
description: Route53 hosted zone ID
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: Z1PABCD0000000
|
||||||
|
port:
|
||||||
|
description: Database endpoint port
|
||||||
|
returned: always
|
||||||
|
type: int
|
||||||
|
sample: 5432
|
||||||
|
engine:
|
||||||
|
description: Database engine
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: postgres
|
||||||
|
engine_version:
|
||||||
|
description: Database engine version
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: 9.5.10
|
||||||
|
iam_database_authentication_enabled:
|
||||||
|
description: Whether database authentication through IAM is enabled
|
||||||
|
returned: always
|
||||||
|
type: bool
|
||||||
|
sample: false
|
||||||
|
instance_create_time:
|
||||||
|
description: Date and time the instance was created
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: '2017-10-10T04:00:07.434000+00:00'
|
||||||
|
kms_key_id:
|
||||||
|
description: KMS Key ID
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: arn:aws:kms:us-west-2:111111111111:key/abcd1234-0000-abcd-1111-0123456789ab
|
||||||
|
latest_restorable_time:
|
||||||
|
description: Latest time to which a database can be restored with point-in-time restore
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: '2018-05-17T00:03:56+00:00'
|
||||||
|
license_model:
|
||||||
|
description: License model
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: postgresql-license
|
||||||
|
master_username:
|
||||||
|
description: Database master username
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: dbadmin
|
||||||
|
monitoring_interval:
|
||||||
|
description: Interval, in seconds, between points when Enhanced Monitoring metrics are collected for the DB instance
|
||||||
|
returned: always
|
||||||
|
type: int
|
||||||
|
sample: 0
|
||||||
|
multi_az:
|
||||||
|
description: Whether Multi-AZ is on
|
||||||
|
returned: always
|
||||||
|
type: bool
|
||||||
|
sample: false
|
||||||
|
option_group_memberships:
|
||||||
|
description: List of option groups
|
||||||
|
returned: always
|
||||||
|
type: complex
|
||||||
|
contains:
|
||||||
|
option_group_name:
|
||||||
|
description: Option group name
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: default:postgres-9-5
|
||||||
|
status:
|
||||||
|
description: Status of option group
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: in-sync
|
||||||
|
pending_modified_values:
|
||||||
|
description: Modified values pending application
|
||||||
|
returned: always
|
||||||
|
type: complex
|
||||||
|
contains: {}
|
||||||
|
performance_insights_enabled:
|
||||||
|
description: Whether performance insights are enabled
|
||||||
|
returned: always
|
||||||
|
type: bool
|
||||||
|
sample: false
|
||||||
|
preferred_backup_window:
|
||||||
|
description: Preferred backup window
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: 04:00-05:00
|
||||||
|
preferred_maintenance_window:
|
||||||
|
description: Preferred maintenance window
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: mon:05:00-mon:05:30
|
||||||
|
publicly_accessible:
|
||||||
|
description: Whether the DB is publicly accessible
|
||||||
|
returned: always
|
||||||
|
type: bool
|
||||||
|
sample: false
|
||||||
|
read_replica_db_instance_identifiers:
|
||||||
|
description: List of database instance read replicas
|
||||||
|
returned: always
|
||||||
|
type: list
|
||||||
|
sample: []
|
||||||
|
storage_encrypted:
|
||||||
|
description: Whether the storage is encrypted
|
||||||
|
returned: always
|
||||||
|
type: bool
|
||||||
|
sample: true
|
||||||
|
storage_type:
|
||||||
|
description: Storage type of the Database instance
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: gp2
|
||||||
|
tags:
|
||||||
|
description: Tags used by the database instance
|
||||||
|
returned: always
|
||||||
|
type: complex
|
||||||
|
contains: {}
|
||||||
|
vpc_security_groups:
|
||||||
|
description: List of VPC security groups
|
||||||
|
returned: always
|
||||||
|
type: complex
|
||||||
|
contains:
|
||||||
|
status:
|
||||||
|
description: Status of the VPC security group
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: active
|
||||||
|
vpc_security_group_id:
|
||||||
|
description: VPC Security Group ID
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
sample: sg-abcd1234
|
||||||
|
'''
|
||||||
|
|
||||||
|
from ansible.module_utils.aws.core import AnsibleAWSModule
|
||||||
|
from ansible.module_utils.ec2 import ansible_dict_to_boto3_filter_list, boto3_tag_list_to_ansible_dict, AWSRetry, camel_dict_to_snake_dict
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
import botocore
|
||||||
|
except ImportError:
|
||||||
|
pass # handled by AnsibleAWSModule
|
||||||
|
|
||||||
|
|
||||||
|
def instance_facts(module, conn):
|
||||||
|
instance_name = module.params.get('db_instance_identifier')
|
||||||
|
filters = module.params.get('filters')
|
||||||
|
|
||||||
|
params = dict()
|
||||||
|
if instance_name:
|
||||||
|
params['DBInstanceIdentifier'] = instance_name
|
||||||
|
if filters:
|
||||||
|
params['Filters'] = ansible_dict_to_boto3_filter_list(filters)
|
||||||
|
|
||||||
|
paginator = conn.get_paginator('describe_db_instances')
|
||||||
|
try:
|
||||||
|
results = paginator.paginate(**params).build_full_result()['DBInstances']
|
||||||
|
except conn.exceptions.from_code('DBInstanceNotFound'):
|
||||||
|
results = []
|
||||||
|
except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e:
|
||||||
|
module.fail_json_aws(e, "Couldn't get instance information")
|
||||||
|
|
||||||
|
for instance in results:
|
||||||
|
try:
|
||||||
|
instance['Tags'] = boto3_tag_list_to_ansible_dict(conn.list_tags_for_resource(ResourceName=instance['DBInstanceArn'],
|
||||||
|
aws_retry=True)['TagList'])
|
||||||
|
except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e:
|
||||||
|
module.fail_json_aws(e, "Couldn't get tags for instance %s" % instance['DBInstanceIdentifier'])
|
||||||
|
|
||||||
|
return dict(changed=False, instances=[camel_dict_to_snake_dict(instance, ignore_list=['Tags']) for instance in results])
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
argument_spec = dict(
|
||||||
|
db_instance_identifier=dict(aliases=['id']),
|
||||||
|
filters=dict(type='dict')
|
||||||
|
)
|
||||||
|
|
||||||
|
module = AnsibleAWSModule(
|
||||||
|
argument_spec=argument_spec,
|
||||||
|
supports_check_mode=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
conn = module.client('rds', retry_decorator=AWSRetry.jittered_backoff(retries=10))
|
||||||
|
|
||||||
|
module.exit_json(**instance_facts(module, conn))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
Loading…
Add table
Reference in a new issue