Skip to content
Snippets Groups Projects
Commit 6bfcfcdc authored by Rafael Guterres Jeffman's avatar Rafael Guterres Jeffman
Browse files

dnsconfig: add support for 'action: member'.

This patch adds support for 'action: member' for ipadnsconfig plugin,
impacting management of DNS forwarders setting.

Use of 'state: absent' now requires 'action: member'. With 'state:
present', orwarders can be either defined through 'action: dnsconfig'
or added using 'action: member'.

Tests have been updated to reflec the new behavior.
parent 3a0a1a75
Branches
Tags
No related merge requests found
...@@ -71,6 +71,7 @@ Example playbook to ensure a global forwarder, with a custom port, is absent: ...@@ -71,6 +71,7 @@ Example playbook to ensure a global forwarder, with a custom port, is absent:
forwarders: forwarders:
- ip_address: 2001:4860:4860::8888 - ip_address: 2001:4860:4860::8888
port: 53 port: 53
action: member
state: absent state: absent
``` ```
...@@ -130,7 +131,8 @@ Variable | Description | Required ...@@ -130,7 +131,8 @@ Variable | Description | Required
  | `port` - The custom port that should be used on this server. | no   | `port` - The custom port that should be used on this server. | no
`forward_policy` | The global forwarding policy. It can be one of `only`, `first`, or `none`. | no `forward_policy` | The global forwarding policy. It can be one of `only`, `first`, or `none`. | no
`allow_sync_ptr` | Allow synchronization of forward (A, AAAA) and reverse (PTR) records (bool). | yes `allow_sync_ptr` | Allow synchronization of forward (A, AAAA) and reverse (PTR) records (bool). | yes
`state` | The state to ensure. It can be one of `present` or `absent`, default: `present`. | yes `action` | Work on dnsconfig or member level. It can be one of `member` or `dnsconfig` and defaults to `dnsconfig`. Only `forwarders` can be managed with `action: member`. | no
`state` | The state to ensure. It can be one of `present` or `absent`, default: `present`. `absent` can only be used with `action: member` and `forwarders`. | yes
Authors Authors
......
...@@ -59,8 +59,16 @@ options: ...@@ -59,8 +59,16 @@ options:
Allow synchronization of forward (A, AAAA) and reverse (PTR) records. Allow synchronization of forward (A, AAAA) and reverse (PTR) records.
required: false required: false
type: bool type: bool
action:
description: |
Work on dnsconfig or member level. It can be one of `member` or
`dnsconfig`. Only `forwarders` can be managed with `action: member`.
default: "dnsconfig"
choices: ["member", "dnsconfig"]
state: state:
description: State to ensure description: |
The state to ensure. It can be one of `present` or `absent`.
`absent` can only be used with `action: member` and `forwarders`.
default: present default: present
choices: ["present", "absent"] choices: ["present", "absent"]
""" """
...@@ -83,6 +91,7 @@ EXAMPLES = """ ...@@ -83,6 +91,7 @@ EXAMPLES = """
- ip_address: 2001:4860:4860::8888 - ip_address: 2001:4860:4860::8888
port: 53 port: 53
state: absent state: absent
action: member
# Disable PTR record synchronization. # Disable PTR record synchronization.
- ipadnsconfig: - ipadnsconfig:
...@@ -118,7 +127,7 @@ def find_dnsconfig(module): ...@@ -118,7 +127,7 @@ def find_dnsconfig(module):
return None return None
def gen_args(module, state, dnsconfig, forwarders, forward_policy, def gen_args(module, state, action, dnsconfig, forwarders, forward_policy,
allow_sync_ptr): allow_sync_ptr):
_args = {} _args = {}
...@@ -137,15 +146,20 @@ def gen_args(module, state, dnsconfig, forwarders, forward_policy, ...@@ -137,15 +146,20 @@ def gen_args(module, state, dnsconfig, forwarders, forward_policy,
global_forwarders = dnsconfig.get('idnsforwarders', []) global_forwarders = dnsconfig.get('idnsforwarders', [])
if state == 'absent': if state == 'absent':
if action == "member":
_args['idnsforwarders'] = [ _args['idnsforwarders'] = [
fwd for fwd in global_forwarders if fwd not in _forwarders] fwd for fwd in global_forwarders if fwd not in _forwarders]
# When all forwarders should be excluded, use an empty string (''). # When all forwarders should be excluded,
# use an empty string ('').
if not _args['idnsforwarders']: if not _args['idnsforwarders']:
_args['idnsforwarders'] = [''] _args['idnsforwarders'] = ['']
elif state == 'present': elif state == 'present':
if action == "member":
_args['idnsforwarders'] = \ _args['idnsforwarders'] = \
list(set(list(_forwarders) + list(global_forwarders))) list(set(list(_forwarders) + list(global_forwarders)))
else:
_args['idnsforwarders'] = _forwarders
# If no forwarders should be added, remove argument. # If no forwarders should be added, remove argument.
if not _args['idnsforwarders']: if not _args['idnsforwarders']:
del _args['idnsforwarders'] del _args['idnsforwarders']
...@@ -179,6 +193,8 @@ def main(): ...@@ -179,6 +193,8 @@ def main():
allow_sync_ptr=dict(type='bool', required=False, default=None), allow_sync_ptr=dict(type='bool', required=False, default=None),
# general # general
action=dict(type="str", default="dnsconfig",
choices=["member", "dnsconfig"]),
state=dict(type="str", default="present", state=dict(type="str", default="present",
choices=["present", "absent"]), choices=["present", "absent"]),
) )
...@@ -191,11 +207,17 @@ def main(): ...@@ -191,11 +207,17 @@ def main():
forward_policy = ansible_module.params_get('forward_policy') forward_policy = ansible_module.params_get('forward_policy')
allow_sync_ptr = ansible_module.params_get('allow_sync_ptr') allow_sync_ptr = ansible_module.params_get('allow_sync_ptr')
action = ansible_module.params_get('action')
state = ansible_module.params_get('state') state = ansible_module.params_get('state')
# Check parameters. # Check parameters.
invalid = [] invalid = []
if state == "present" and action == "member":
invalid = ['forward_policy', 'allow_sync_ptr']
if state == 'absent': if state == 'absent':
if action != "member":
ansible_module.fail_json(
msg="State 'absent' is only valid with action 'member'.")
invalid = ['forward_policy', 'allow_sync_ptr'] invalid = ['forward_policy', 'allow_sync_ptr']
ansible_module.params_fail_used_invalid(invalid, state) ansible_module.params_fail_used_invalid(invalid, state)
...@@ -208,7 +230,7 @@ def main(): ...@@ -208,7 +230,7 @@ def main():
with ansible_module.ipa_connect(): with ansible_module.ipa_connect():
res_find = find_dnsconfig(ansible_module) res_find = find_dnsconfig(ansible_module)
args = gen_args(ansible_module, state, res_find, forwarders, args = gen_args(ansible_module, state, action, res_find, forwarders,
forward_policy, allow_sync_ptr) forward_policy, allow_sync_ptr)
# Execute command only if configuration changes. # Execute command only if configuration changes.
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
- ip_address: 2001:4860:4860::8888 - ip_address: 2001:4860:4860::8888
port: 53 port: 53
state: absent state: absent
action: member
# Tests. # Tests.
- name: Set config to invalid IPv4. - name: Set config to invalid IPv4.
...@@ -74,23 +75,72 @@ ...@@ -74,23 +75,72 @@
register: result register: result
failed_when: result.changed or result.failed failed_when: result.changed or result.failed
- name: Ensure forwarder is absent. - name: Ensure forwarder 8.8.8.8 is absent.
ipadnsconfig: ipadnsconfig:
ipaadmin_password: SomeADMINpassword ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}" ipaapi_context: "{{ ipa_context | default(omit) }}"
forwarders: forwarders:
- ip_address: 8.8.8.8 - ip_address: 8.8.8.8
state: absent state: absent
action: member
register: result register: result
failed_when: not result.changed or result.failed failed_when: not result.changed or result.failed
- name: Ensure forwarder is absent, again. - name: Ensure forwarder 8.8.8.8 is absent, again.
ipadnsconfig: ipadnsconfig:
ipaadmin_password: SomeADMINpassword ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}" ipaapi_context: "{{ ipa_context | default(omit) }}"
forwarders: forwarders:
- ip_address: 8.8.8.8 - ip_address: 8.8.8.8
state: absent state: absent
action: member
register: result
failed_when: result.changed or result.failed
- name: Ensure forwarder 8.8.4.4 is present.
ipadnsconfig:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
forwarders:
- ip_address: 8.8.4.4
register: result
failed_when: not result.changed or result.failed
- name: Ensure forwarder 8.8.8.8 is present.
ipadnsconfig:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
forwarders:
- ip_address: 8.8.8.8
register: result
failed_when: not result.changed or result.failed
- name: Ensure forwarder 8.8.4.4 is present.
ipadnsconfig:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
forwarders:
- ip_address: 8.8.4.4
register: result
failed_when: not result.changed or result.failed
- name: Ensure forwarders are absent.
ipadnsconfig:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
forwarders:
- ip_address: 8.8.4.4
- ip_address: 8.8.8.8
register: result
failed_when: not result.changed or result.failed
- name: Ensure forwarders are absent, again.
ipadnsconfig:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
forwarders:
- ip_address: 8.8.4.4
- ip_address: 8.8.8.8
register: result register: result
failed_when: result.changed or result.failed failed_when: result.changed or result.failed
...@@ -168,6 +218,7 @@ ...@@ -168,6 +218,7 @@
- ip_address: 2001:4860:4860::8888 - ip_address: 2001:4860:4860::8888
port: 53 port: 53
state: absent state: absent
action: member
register: result register: result
failed_when: not result.changed or result.failed failed_when: not result.changed or result.failed
...@@ -181,6 +232,7 @@ ...@@ -181,6 +232,7 @@
- ip_address: 2001:4860:4860::8888 - ip_address: 2001:4860:4860::8888
port: 53 port: 53
state: absent state: absent
action: member
register: result register: result
failed_when: result.changed or result.failed failed_when: result.changed or result.failed
...@@ -193,6 +245,16 @@ ...@@ -193,6 +245,16 @@
register: result register: result
failed_when: not result.changed or result.failed failed_when: not result.changed or result.failed
- name: Ensure forwarders is not present.
ipadnsconfig:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
forwarders:
- ip_address: 8.8.4.4
check_mode: yes
register: result
failed_when: not result.changed or result.failed
- name: Ensure forwarders are present. - name: Ensure forwarders are present.
ipadnsconfig: ipadnsconfig:
ipaadmin_password: SomeADMINpassword ipaadmin_password: SomeADMINpassword
...@@ -200,6 +262,7 @@ ...@@ -200,6 +262,7 @@
forwarders: forwarders:
- ip_address: 8.8.4.4 - ip_address: 8.8.4.4
- ip_address: 8.8.8.8 - ip_address: 8.8.8.8
action: member
register: result register: result
failed_when: not result.changed or result.failed failed_when: not result.changed or result.failed
...@@ -210,6 +273,7 @@ ...@@ -210,6 +273,7 @@
forwarders: forwarders:
- ip_address: 8.8.4.4 - ip_address: 8.8.4.4
- ip_address: 8.8.8.8 - ip_address: 8.8.8.8
action: member
register: result register: result
failed_when: result.changed or result.failed failed_when: result.changed or result.failed
...@@ -219,6 +283,7 @@ ...@@ -219,6 +283,7 @@
ipaapi_context: "{{ ipa_context | default(omit) }}" ipaapi_context: "{{ ipa_context | default(omit) }}"
forwarders: forwarders:
- ip_address: 8.8.4.4 - ip_address: 8.8.4.4
action: member
register: result register: result
failed_when: result.changed or result.failed failed_when: result.changed or result.failed
...@@ -229,6 +294,7 @@ ...@@ -229,6 +294,7 @@
forwarders: forwarders:
- ip_address: 8.8.4.4 - ip_address: 8.8.4.4
- ip_address: 8.8.8.8 - ip_address: 8.8.8.8
action: member
register: result register: result
failed_when: result.changed or result.failed failed_when: result.changed or result.failed
...@@ -244,3 +310,4 @@ ...@@ -244,3 +310,4 @@
- ip_address: 2001:4860:4860::8888 - ip_address: 2001:4860:4860::8888
port: 53 port: 53
state: absent state: absent
action: member
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment