def main(): module = AnsibleModule( argument_spec=dict( type=dict(required=True, type='str'), zone=dict(required=True, type='str'), name=dict(required=True, type='str'), data=dict(default=[], type='dict'), state=dict(default='present', choices=['present', 'absent'], type='str') ), supports_check_mode=True, required_if=([ ('state', 'present', ['data']) ]) ) if not HAVE_UNIVENTION: module.fail_json(msg="This module requires univention python bindings") type = module.params['type'] zone = module.params['zone'] name = module.params['name'] data = module.params['data'] state = module.params['state'] changed = False diff = None obj = list(ldap_search( '(&(objectClass=dNSZone)(zoneName={0})(relativeDomainName={1}))'.format(zone, name), attr=['dNSZone'] )) exists = bool(len(obj)) container = 'zoneName={0},cn=dns,{1}'.format(zone, base_dn()) dn = 'relativeDomainName={0},{1}'.format(name, container) if state == 'present': try: if not exists: so = forward_zone.lookup( config(), uldap(), '(zone={0})'.format(zone), scope='domain', ) or reverse_zone.lookup( config(), uldap(), '(zone={0})'.format(zone), scope='domain', ) obj = umc_module_for_add('dns/{0}'.format(type), container, superordinate=so[0]) else: obj = umc_module_for_edit('dns/{0}'.format(type), dn) obj['name'] = name for k, v in data.items(): obj[k] = v diff = obj.diff() changed = obj.diff() != [] if not module.check_mode: if not exists: obj.create() else: obj.modify() except Exception as e: module.fail_json( msg='Creating/editing dns entry {0} in {1} failed: {2}'.format(name, container, e) ) if state == 'absent' and exists: try: obj = umc_module_for_edit('dns/{0}'.format(type), dn) if not module.check_mode: obj.remove() changed = True except Exception as e: module.fail_json( msg='Removing dns entry {0} in {1} failed: {2}'.format(name, container, e) ) module.exit_json( changed=changed, name=name, diff=diff, container=container )
def main(): module = AnsibleModule( argument_spec=dict( type=dict(required=True, type='str'), zone=dict(required=True, type='str'), name=dict(required=True, type='str'), data=dict(default={}, type='dict'), state=dict(default='present', choices=['present', 'absent'], type='str') ), supports_check_mode=True, required_if=([ ('state', 'present', ['data']) ]) ) if not HAVE_UNIVENTION: module.fail_json(msg="This module requires univention python bindings") type = module.params['type'] zone = module.params['zone'] name = module.params['name'] data = module.params['data'] state = module.params['state'] changed = False diff = None workname = name if type == 'ptr_record': if not HAVE_IPADDRESS: module.fail_json(msg=missing_required_lib('ipaddress')) try: if 'arpa' not in zone: raise Exception("Zone must be reversed zone for ptr_record. (e.g. 1.1.192.in-addr.arpa)") ipaddr_rev = ipaddress.ip_address(name).reverse_pointer subnet_offset = ipaddr_rev.find(zone) if subnet_offset == -1: raise Exception("reversed IP address {0} is not part of zone.".format(ipaddr_rev)) workname = ipaddr_rev[0:subnet_offset - 1] except Exception as e: module.fail_json( msg='handling PTR record for {0} in zone {1} failed: {2}'.format(name, zone, e) ) obj = list(ldap_search( '(&(objectClass=dNSZone)(zoneName={0})(relativeDomainName={1}))'.format(zone, workname), attr=['dNSZone'] )) exists = bool(len(obj)) container = 'zoneName={0},cn=dns,{1}'.format(zone, base_dn()) dn = 'relativeDomainName={0},{1}'.format(workname, container) if state == 'present': try: if not exists: so = forward_zone.lookup( config(), uldap(), '(zone={0})'.format(zone), scope='domain', ) or reverse_zone.lookup( config(), uldap(), '(zoneName={0})'.format(zone), scope='domain', ) if len(so) == 0: raise Exception("Did not find zone '{0}' in Univention".format(zone)) obj = umc_module_for_add('dns/{0}'.format(type), container, superordinate=so[0]) else: obj = umc_module_for_edit('dns/{0}'.format(type), dn) if type == 'ptr_record': obj['ip'] = name obj['address'] = workname else: obj['name'] = name for k, v in data.items(): obj[k] = v diff = obj.diff() changed = obj.diff() != [] if not module.check_mode: if not exists: obj.create() else: obj.modify() except Exception as e: module.fail_json( msg='Creating/editing dns entry {0} in {1} failed: {2}'.format(name, container, e) ) if state == 'absent' and exists: try: obj = umc_module_for_edit('dns/{0}'.format(type), dn) if not module.check_mode: obj.remove() changed = True except Exception as e: module.fail_json( msg='Removing dns entry {0} in {1} failed: {2}'.format(name, container, e) ) module.exit_json( changed=changed, name=name, diff=diff, container=container )