Created
June 14, 2017 22:51
-
-
Save cmcconnell1/aede4a19a2a41ab2850d55c16ee523f3 to your computer and use it in GitHub Desktop.
Ansible 2.3.1 create_rds module creates rds instance using gp2 where ansible rds module only supports either magnetic or io1 with min iops=1,000 which is way overkill for use case
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# -*- coding: utf-8 -*- | |
# Ansible 2.3.1 create_rds module | |
# creates rds instance using gp2 disk | |
# Why? because ansible rds module currently only supports either magnetic (default) or io1 min iops=1,000 | |
# Note: the boto3 module returns stdout which causes ansible to consider it a failure | |
# I tried using json and got errors that boto3 stdout was not json serializable | |
# also tried following https://docs.python.org/2.7/howto/logging.html#configuring-logging-for-a-library | |
# using: logging.getLogger('foo').addHandler(logging.NullHandler()) | |
# as well as numerous other methods to prevent boto3 from returning stdout | |
import traceback | |
import boto3 | |
from ansible.module_utils._text import to_native | |
def create_rds_instance(db_name, db_instance_id, db_alloc_storage, db_instance_class, | |
db_engine, db_master_username, db_master_password, vpc_sec_group_ids, | |
az_zone, db_sub_group_name, pref_maint_window, | |
db_backup_retention, db_backup_window, db_port, db_multi_az, | |
db_minor_auto_upgrade, db_license_model, db_public_access, db_tags, | |
db_storage_type, db_copy_tags_to_snap, db_monitor_interval): | |
rds = boto3.client('rds') | |
try: | |
response = rds.create_db_instance( | |
DBName=db_name, | |
DBInstanceIdentifier=db_instance_id, | |
AllocatedStorage=db_alloc_storage, | |
DBInstanceClass=db_instance_class, | |
Engine=db_engine, | |
MasterUsername=db_master_username, | |
MasterUserPassword=db_master_password, | |
VpcSecurityGroupIds=vpc_sec_group_ids, | |
AvailabilityZone=az_zone, | |
DBSubnetGroupName=db_sub_group_name, | |
PreferredMaintenanceWindow=pref_maint_window, | |
BackupRetentionPeriod=db_backup_retention, | |
PreferredBackupWindow=db_backup_window, | |
Port=db_port, | |
MultiAZ=db_multi_az, | |
AutoMinorVersionUpgrade=db_minor_auto_upgrade, | |
LicenseModel=db_license_model, | |
PubliclyAccessible=db_public_access, | |
Tags=db_tags, | |
StorageType=db_storage_type, | |
CopyTagsToSnapshot=db_copy_tags_to_snap, | |
MonitoringInterval=db_monitor_interval) | |
except Exception as error: | |
#print error | |
pass | |
def main(): | |
module = AnsibleModule( | |
argument_spec=dict( | |
db_name=dict(type="str"), | |
db_instance_id=dict(type="str"), | |
db_alloc_storage=dict(default="50", type="int"), | |
db_instance_class=dict(default="db.t2.small", type="str"), | |
db_engine=dict(default="postgres", type="str"), | |
db_master_username=dict(default="postgres", type="str"), | |
db_master_password=dict(default="postgres", type="str"), | |
vpc_sec_group_ids=dict(type="list"), | |
az_zone=dict(default="us-west-1a", type="str"), | |
db_sub_group_name=dict(default="default-vpc-cbb87ca3", type="str"), | |
pref_maint_window=dict(default="sat:10:15-sat:10:45", type="str"), | |
db_backup_retention=dict(default=7, type="int"), | |
db_backup_window=dict(default="09:15-09:45", type="str"), | |
db_port=dict(default="5432", type="int"), | |
db_multi_az=dict(default=False, type="bool"), | |
db_minor_auto_upgrade=dict(default=True, type="bool"), | |
db_license_model=dict(default="postgresql-license", type="str"), | |
db_public_access=dict(default=False, type="bool"), | |
# Ansible default passes as a dict, but the boto3 module requires a list we had to manually configure vars/rds.yml with 'Key' and 'Value' to satisfy boto3 requirements | |
# i.e.: db_tags: Key: 'Name', Value: "{{ db_instance_id }}" | |
db_tags=dict(required=False, type='list', default={}), | |
db_storage_type=dict(default="gp2", type="str"), | |
db_copy_tags_to_snap=dict(default=True, type="bool"), | |
db_monitor_interval=dict(default="0", type="int") | |
), | |
supports_check_mode=True | |
) | |
if module.check_mode: | |
module.exit_json(changed=False) | |
db_name = module.params["db_name"] | |
db_instance_id = module.params["db_instance_id"] | |
db_alloc_storage = module.params["db_alloc_storage"] | |
db_instance_class = module.params["db_instance_class"] | |
db_engine = module.params["db_engine"] | |
db_master_username = module.params["db_master_username"] | |
db_master_password = module.params["db_master_password"] | |
vpc_sec_group_ids = module.params["vpc_sec_group_ids"] | |
az_zone = module.params["az_zone"] | |
db_sub_group_name = module.params["db_sub_group_name"] | |
pref_maint_window = module.params["pref_maint_window"] | |
db_backup_retention = module.params["db_backup_retention"] | |
db_backup_window = module.params["db_backup_window"] | |
db_port = module.params["db_port"] | |
db_multi_az = module.params["db_multi_az"] | |
db_minor_auto_upgrade = module.params["db_minor_auto_upgrade"] | |
db_license_model = module.params["db_license_model"] | |
db_public_access = module.params["db_public_access"] | |
db_tags = module.params["db_tags"] | |
db_storage_type = module.params["db_storage_type"] | |
db_copy_tags_to_snap = module.params["db_copy_tags_to_snap"] | |
db_monitor_interval = module.params["db_monitor_interval"] | |
create_rds_instance(db_name, db_instance_id, db_alloc_storage, db_instance_class, | |
db_engine, db_master_username, db_master_password, vpc_sec_group_ids, | |
az_zone, db_sub_group_name, pref_maint_window, | |
db_backup_retention, db_backup_window, db_port, db_multi_az, db_minor_auto_upgrade, | |
db_license_model, db_public_access, db_tags, db_storage_type, | |
db_copy_tags_to_snap, db_monitor_interval) | |
from ansible.module_utils.basic import * | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@cmcconnell1
Hi, You forgot to put the region as an argument. Or is it embedded in the AZ?