FreeIPA: Add dynamic update to zones in IPA (#59489)

This feature add a new option to `ipa_dnszone` called
**dynamicupdate** as requested by issue #46768.

It allow user to change between default option `false`
to `true` if user/sysadmin wishes to make zone dynamically
updated.

Fixes #46768

Signed-off-by: Alexandre Mulatinho <alex@mulatinho.net>
This commit is contained in:
Alexandre Mulatinho 2019-08-14 07:08:06 -03:00 committed by Abhijeet Kasurde
parent 7b0a5fb487
commit b2f1993b20

View file

@ -29,6 +29,12 @@ options:
required: false required: false
default: present default: present
choices: ["present", "absent"] choices: ["present", "absent"]
dynamicupdate:
description: Apply dynamic update to zone
required: false
default: "false"
choices: ["false", "true"]
version_added: "2.9"
extends_documentation_fragment: ipa.documentation extends_documentation_fragment: ipa.documentation
version_added: "2.5" version_added: "2.5"
''' '''
@ -41,6 +47,14 @@ EXAMPLES = '''
state: present state: present
zone_name: example.com zone_name: example.com
# Ensure dns zone is present and is dynamic update
- ipa_dnszone:
ipa_host: spider.example.com
ipa_pass: Passw0rd!
state: present
zone_name: example.com
dynamicupdate: true
# Ensure that dns zone is removed # Ensure that dns zone is removed
- ipa_dnszone: - ipa_dnszone:
zone_name: example.com zone_name: example.com
@ -66,18 +80,26 @@ class DNSZoneIPAClient(IPAClient):
def __init__(self, module, host, port, protocol): def __init__(self, module, host, port, protocol):
super(DNSZoneIPAClient, self).__init__(module, host, port, protocol) super(DNSZoneIPAClient, self).__init__(module, host, port, protocol)
def dnszone_find(self, zone_name): def dnszone_find(self, zone_name, details=None):
itens = {'idnsname': zone_name}
if details is not None:
itens.update(details)
return self._post_json( return self._post_json(
method='dnszone_find', method='dnszone_find',
name=zone_name, name=zone_name,
item={'idnsname': zone_name} item=itens
) )
def dnszone_add(self, zone_name=None, details=None): def dnszone_add(self, zone_name=None, details=None):
itens = {}
if details is not None:
itens.update(details)
return self._post_json( return self._post_json(
method='dnszone_add', method='dnszone_add',
name=zone_name, name=zone_name,
item={} item=itens
) )
def dnszone_del(self, zone_name=None, record_name=None, details=None): def dnszone_del(self, zone_name=None, record_name=None, details=None):
@ -88,6 +110,7 @@ class DNSZoneIPAClient(IPAClient):
def ensure(module, client): def ensure(module, client):
zone_name = module.params['zone_name'] zone_name = module.params['zone_name']
state = module.params['state'] state = module.params['state']
dynamicupdate = module.params['dynamicupdate']
ipa_dnszone = client.dnszone_find(zone_name) ipa_dnszone = client.dnszone_find(zone_name)
@ -96,7 +119,7 @@ def ensure(module, client):
if not ipa_dnszone: if not ipa_dnszone:
changed = True changed = True
if not module.check_mode: if not module.check_mode:
client.dnszone_add(zone_name=zone_name) client.dnszone_add(zone_name=zone_name, details={'idnsallowdynupdate': dynamicupdate})
else: else:
changed = False changed = False
else: else:
@ -112,6 +135,7 @@ def main():
argument_spec = ipa_argument_spec() argument_spec = ipa_argument_spec()
argument_spec.update(zone_name=dict(type='str', required=True), argument_spec.update(zone_name=dict(type='str', required=True),
state=dict(type='str', default='present', choices=['present', 'absent']), state=dict(type='str', default='present', choices=['present', 'absent']),
dynamicupdate=dict(type='str', required=False, default='false', choices=['true', 'false']),
) )
module = AnsibleModule(argument_spec=argument_spec, module = AnsibleModule(argument_spec=argument_spec,