Skip to content

Instantly share code, notes, and snippets.

@cmcconnell1
Created June 14, 2017 22:51
Show Gist options
  • Save cmcconnell1/aede4a19a2a41ab2850d55c16ee523f3 to your computer and use it in GitHub Desktop.
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
#!/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()
@einarc
Copy link

einarc commented Jan 17, 2018

@cmcconnell1
Hi, You forgot to put the region as an argument. Or is it embedded in the AZ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment