def main(): module = AnsibleModule( argument_spec = dict( account_email = dict(required=False), account_api_token = dict(required=False, no_log=True), domain = dict(required=False), record = dict(required=False), record_ids = dict(required=False, type='list'), type = dict(required=False, choices=['A', 'ALIAS', 'CNAME', 'MX', 'SPF', 'URL', 'TXT', 'NS', 'SRV', 'NAPTR', 'PTR', 'AAAA', 'SSHFP', 'HINFO', 'POOL']), ttl = dict(required=False, default=3600, type='int'), value = dict(required=False), priority = dict(required=False, type='int'), state = dict(required=False, choices=['present', 'absent']), solo = dict(required=False, type='bool'), ), required_together = ( ['record', 'value'] ), supports_check_mode = True, ) if not HAS_DNSIMPLE: module.fail_json(msg="dnsimple required for this module") account_email = module.params.get('account_email') account_api_token = module.params.get('account_api_token') domain = module.params.get('domain') record = module.params.get('record') record_ids = module.params.get('record_ids') record_type = module.params.get('type') ttl = module.params.get('ttl') value = module.params.get('value') priority = module.params.get('priority') state = module.params.get('state') is_solo = module.params.get('solo') if account_email and account_api_token: client = DNSimple(email=account_email, api_token=account_api_token) elif os.environ.get('DNSIMPLE_EMAIL') and os.environ.get('DNSIMPLE_API_TOKEN'): client = DNSimple(email=os.environ.get('DNSIMPLE_EMAIL'), api_token=os.environ.get('DNSIMPLE_API_TOKEN')) else: client = DNSimple() try: # Let's figure out what operation we want to do # No domain, return a list if not domain: domains = client.domains() module.exit_json(changed=False, result=[d['domain'] for d in domains]) # Domain & No record if domain and record is None and not record_ids: domains = [d['domain'] for d in client.domains()] if domain.isdigit(): dr = next((d for d in domains if d['id'] == int(domain)), None) else: dr = next((d for d in domains if d['name'] == domain), None) if state == 'present': if dr: module.exit_json(changed=False, result=dr) else: if module.check_mode: module.exit_json(changed=True) else: module.exit_json(changed=True, result=client.add_domain(domain)['domain']) elif state == 'absent': if dr: if not module.check_mode: client.delete(domain) module.exit_json(changed=True) else: module.exit_json(changed=False) else: module.fail_json(msg="'%s' is an unknown value for the state argument" % state) # need the not none check since record could be an empty string if domain and record is not None: records = [r['record'] for r in client.records(str(domain))] if not record_type: module.fail_json(msg="Missing the record type") if not value: module.fail_json(msg="Missing the record value") rr = next((r for r in records if r['name'] == record and r['record_type'] == record_type and r['content'] == value), None) if state == 'present': changed = False if is_solo: # delete any records that have the same name and record type same_type = [r['id'] for r in records if r['name'] == record and r['record_type'] == record_type] if rr: same_type = [rid for rid in same_type if rid != rr['id']] if same_type: if not module.check_mode: for rid in same_type: client.delete_record(str(domain), rid) changed = True if rr: # check if we need to update if rr['ttl'] != ttl or rr['prio'] != priority: data = {} if ttl: data['ttl'] = ttl if priority: data['prio'] = priority if module.check_mode: module.exit_json(changed=True) else: module.exit_json(changed=True, result=client.update_record(str(domain), str(rr['id']), data)['record']) else: module.exit_json(changed=changed, result=rr) else: # create it data = { 'name': record, 'record_type': record_type, 'content': value, } if ttl: data['ttl'] = ttl if priority: data['prio'] = priority if module.check_mode: module.exit_json(changed=True) else: module.exit_json(changed=True, result=client.add_record(str(domain), data)['record']) elif state == 'absent': if rr: if not module.check_mode: client.delete_record(str(domain), rr['id']) module.exit_json(changed=True) else: module.exit_json(changed=False) else: module.fail_json(msg="'%s' is an unknown value for the state argument" % state) # Make sure these record_ids either all exist or none if domain and record_ids: current_records = [str(r['record']['id']) for r in client.records(str(domain))] wanted_records = [str(r) for r in record_ids] if state == 'present': difference = list(set(wanted_records) - set(current_records)) if difference: module.fail_json(msg="Missing the following records: %s" % difference) else: module.exit_json(changed=False) elif state == 'absent': difference = list(set(wanted_records) & set(current_records)) if difference: if not module.check_mode: for rid in difference: client.delete_record(str(domain), rid) module.exit_json(changed=True) else: module.exit_json(changed=False) else: module.fail_json(msg="'%s' is an unknown value for the state argument" % state) except DNSimpleException: e = get_exception() module.fail_json(msg="Unable to contact DNSimple: %s" % e.message) module.fail_json(msg="Unknown what you wanted me to do")
def main(): module = AnsibleModule( argument_spec=dict( account_email=dict(required=False), account_api_token=dict(required=False, no_log=True), domain=dict(required=False), record=dict(required=False), record_ids=dict(required=False, type='list'), type=dict(required=False, choices=[ 'A', 'ALIAS', 'CNAME', 'MX', 'SPF', 'URL', 'TXT', 'NS', 'SRV', 'NAPTR', 'PTR', 'AAAA', 'SSHFP', 'HINFO', 'POOL' ]), ttl=dict(required=False, default=3600, type='int'), value=dict(required=False), priority=dict(required=False, type='int'), state=dict(required=False, choices=['present', 'absent']), solo=dict(required=False, type='bool'), ), required_together=(['record', 'value']), supports_check_mode=True, ) if not HAS_DNSIMPLE: module.fail_json(msg="dnsimple required for this module") account_email = module.params.get('account_email') account_api_token = module.params.get('account_api_token') domain = module.params.get('domain') record = module.params.get('record') record_ids = module.params.get('record_ids') record_type = module.params.get('type') ttl = module.params.get('ttl') value = module.params.get('value') priority = module.params.get('priority') state = module.params.get('state') is_solo = module.params.get('solo') if account_email and account_api_token: client = DNSimple(email=account_email, api_token=account_api_token) elif os.environ.get('DNSIMPLE_EMAIL') and os.environ.get( 'DNSIMPLE_API_TOKEN'): client = DNSimple(email=os.environ.get('DNSIMPLE_EMAIL'), api_token=os.environ.get('DNSIMPLE_API_TOKEN')) else: client = DNSimple() try: # Let's figure out what operation we want to do # No domain, return a list if not domain: domains = client.domains() module.exit_json(changed=False, result=[d['domain'] for d in domains]) # Domain & No record if domain and record is None and not record_ids: domains = [d['domain'] for d in client.domains()] if domain.isdigit(): dr = next((d for d in domains if d['id'] == int(domain)), None) else: dr = next((d for d in domains if d['name'] == domain), None) if state == 'present': if dr: module.exit_json(changed=False, result=dr) else: if module.check_mode: module.exit_json(changed=True) else: module.exit_json( changed=True, result=client.add_domain(domain)['domain']) elif state == 'absent': if dr: if not module.check_mode: client.delete(domain) module.exit_json(changed=True) else: module.exit_json(changed=False) else: module.fail_json( msg="'%s' is an unknown value for the state argument" % state) # need the not none check since record could be an empty string if domain and record is not None: records = [r['record'] for r in client.records(str(domain))] if not record_type: module.fail_json(msg="Missing the record type") if not value: module.fail_json(msg="Missing the record value") rr = next( (r for r in records if r['name'] == record and r['record_type'] == record_type and r['content'] == value), None) if state == 'present': changed = False if is_solo: # delete any records that have the same name and record type same_type = [ r['id'] for r in records if r['name'] == record and r['record_type'] == record_type ] if rr: same_type = [ rid for rid in same_type if rid != rr['id'] ] if same_type: if not module.check_mode: for rid in same_type: client.delete_record(str(domain), rid) changed = True if rr: # check if we need to update if rr['ttl'] != ttl or rr['prio'] != priority: data = {} if ttl: data['ttl'] = ttl if priority: data['prio'] = priority if module.check_mode: module.exit_json(changed=True) else: module.exit_json(changed=True, result=client.update_record( str(domain), str(rr['id']), data)['record']) else: module.exit_json(changed=changed, result=rr) else: # create it data = { 'name': record, 'record_type': record_type, 'content': value, } if ttl: data['ttl'] = ttl if priority: data['prio'] = priority if module.check_mode: module.exit_json(changed=True) else: module.exit_json(changed=True, result=client.add_record( str(domain), data)['record']) elif state == 'absent': if rr: if not module.check_mode: client.delete_record(str(domain), rr['id']) module.exit_json(changed=True) else: module.exit_json(changed=False) else: module.fail_json( msg="'%s' is an unknown value for the state argument" % state) # Make sure these record_ids either all exist or none if domain and record_ids: current_records = [ str(r['record']['id']) for r in client.records(str(domain)) ] wanted_records = [str(r) for r in record_ids] if state == 'present': difference = list(set(wanted_records) - set(current_records)) if difference: module.fail_json(msg="Missing the following records: %s" % difference) else: module.exit_json(changed=False) elif state == 'absent': difference = list(set(wanted_records) & set(current_records)) if difference: if not module.check_mode: for rid in difference: client.delete_record(str(domain), rid) module.exit_json(changed=True) else: module.exit_json(changed=False) else: module.fail_json( msg="'%s' is an unknown value for the state argument" % state) except DNSimpleException as e: module.fail_json(msg="Unable to contact DNSimple: %s" % e.message) module.fail_json(msg="Unknown what you wanted me to do")
class DNSimpleV1(): """class which uses dnsimple-python < 2""" def __init__(self, account_email, account_api_token, sandbox, module): """init""" self.module = module self.account_email = account_email self.account_api_token = account_api_token self.sandbox = sandbox self.dnsimple_client() def dnsimple_client(self): """creates a dnsimple client object""" if self.account_email and self.account_api_token: self.client = DNSimple(sandbox=self.sandbox, email=self.account_email, api_token=self.account_api_token) else: self.client = DNSimple(sandbox=self.sandbox) def get_all_domains(self): """returns a list of all domains""" domain_list = self.client.domains() return [d['domain'] for d in domain_list] def get_domain(self, domain): """returns a single domain by name or id""" try: dr = self.client.domain(domain)['domain'] except DNSimpleException as e: exception_string = str(e.args[0]['message']) if re.match(r"^Domain .+ not found$", exception_string): dr = None else: raise return dr def create_domain(self, domain): """create a single domain""" return self.client.add_domain(domain)['domain'] def delete_domain(self, domain): """delete a single domain""" self.client.delete(domain) def get_records(self, domain, dnsimple_filter=None): """return dns ressource records which match a specified filter""" return [r['record'] for r in self.client.records(str(domain), params=dnsimple_filter)] def delete_record(self, domain, rid): """delete a single dns ressource record""" self.client.delete_record(str(domain), rid) def update_record(self, domain, rid, ttl=None, priority=None): """update a single dns ressource record""" data = {} if ttl: data['ttl'] = ttl if priority: data['priority'] = priority return self.client.update_record(str(domain), str(rid), data)['record'] def create_record(self, domain, name, record_type, content, ttl=None, priority=None): """create a single dns ressource record""" data = { 'name': name, 'type': record_type, 'content': content, } if ttl: data['ttl'] = ttl if priority: data['priority'] = priority return self.client.add_record(str(domain), data)['record']