When applying pfsensible.core.pfsense_dns_resolver task without specifying domainoverrides parameter, the error 'NoneType' object is not iterable is raised when applying the playbook
---
- hosts: pfsense
gather_facts: True
become_method: sudo
tasks:
- name: Configure internal dns
pfsensible.core.pfsense_dns_resolver:
hosts: []
The full traceback is:
Traceback (most recent call last):
File "/root/.ansible/tmp/ansible-tmp-1760515062.4647708-2185299-124234949543862/AnsiballZ_pfsense_dns_resolver.py", line 107, in <module>
_ansiballz_main()
File "/root/.ansible/tmp/ansible-tmp-1760515062.4647708-2185299-124234949543862/AnsiballZ_pfsense_dns_resolver.py", line 99, in _ansiballz_main
invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)
File "/root/.ansible/tmp/ansible-tmp-1760515062.4647708-2185299-124234949543862/AnsiballZ_pfsense_dns_resolver.py", line 47, in invoke_module
runpy.run_module(mod_name='ansible_collections.pfsensible.core.plugins.modules.pfsense_dns_resolver', init_globals=dict(_module_fqn='ansible_collections.pfsensible.core.plugins.modules.pfsense_dns_resolver', _modlib_path=modlib_path),
File "<frozen runpy>", line 226, in run_module
File "<frozen runpy>", line 98, in _run_module_code
File "<frozen runpy>", line 88, in _run_code
File "/tmp/ansible_pfsensible.core.pfsense_dns_resolver_payload_9p8tg5yy/ansible_pfsensible.core.pfsense_dns_resolver_payload.zip/ansible_collections/pfsensible/core/plugins/modules/pfsense_dns_resolver.py", line 582, in <module>
File "/tmp/ansible_pfsensible.core.pfsense_dns_resolver_payload_9p8tg5yy/ansible_pfsensible.core.pfsense_dns_resolver_payload.zip/ansible_collections/pfsensible/core/plugins/modules/pfsense_dns_resolver.py", line 577, in main
File "/tmp/ansible_pfsensible.core.pfsense_dns_resolver_payload_9p8tg5yy/ansible_pfsensible.core.pfsense_dns_resolver_payload.zip/ansible_collections/pfsensible/core/plugins/module_utils/module_base.py", line 444, in run
File "/tmp/ansible_pfsensible.core.pfsense_dns_resolver_payload_9p8tg5yy/ansible_pfsensible.core.pfsense_dns_resolver_payload.zip/ansible_collections/pfsensible/core/plugins/modules/pfsense_dns_resolver.py", line 484, in _validate_params
TypeError: 'NoneType' object is not iterable
fatal: [10.120.230.9]: FAILED! => {
"changed": false,
"module_stderr": "OpenSSH_9.6p1 Ubuntu-3ubuntu13.14, OpenSSL 3.0.13 30 Jan 2024\r\ndebug1: Reading configuration data /home/yakky/.ssh/config\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug1: /etc/ssh/ssh_config line 19: Applying options for *\r\ndebug2: resolve_canonicalize: hostname 10.120.230.9 is address\r\ndebug3: expanded UserKnownHostsFile '~/.ssh/known_hosts' -> '/home/yakky/.ssh/known_hosts'\r\ndebug3: expanded UserKnownHostsFile '~/.ssh/known_hosts2' -> '/home/yakky/.ssh/known_hosts2'\r\ndebug1: auto-mux: Trying existing masterat '/home/yakky/.ansible/cp/76750d2e5b'\r\ndebug2: fd 3 setting O_NONBLOCK\r\ndebug2: mux_client_hello_exchange: master version 4\r\ndebug3: mux_client_forwards: request forwardings: 0 local, 0 remote\r\ndebug3: mux_client_request_session: entering\r\ndebug3: mux_client_request_alive: entering\r\ndebug3: mux_client_request_alive: done pid = 2175809\r\ndebug3: mux_client_request_session: session request sent\r\ndebug1: mux_client_request_session: master session id: 2\r\ndebug3: mux_client_read_packet_timeout: read header failed: Broken pipe\r\ndebug2: Receivedexit status from master 1\r\nShared connection to 10.120.230.9 closed.\r\n",
"module_stdout": "Traceback (most recent call last):\r\n File \"/root/.ansible/tmp/ansible-tmp-1760515062.4647708-2185299-124234949543862/AnsiballZ_pfsense_dns_resolver.py\", line 107, in <module>\r\n _ansiballz_main()\r\n File \"/root/.ansible/tmp/ansible-tmp-1760515062.4647708-2185299-124234949543862/AnsiballZ_pfsense_dns_resolver.py\", line 99, in _ansiballz_main\r\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n File \"/root/.ansible/tmp/ansible-tmp-1760515062.4647708-2185299-124234949543862/AnsiballZ_pfsense_dns_resolver.py\", line 47, in invoke_module\r\n runpy.run_module(mod_name='ansible_collections.pfsensible.core.plugins.modules.pfsense_dns_resolver', init_globals=dict(_module_fqn='ansible_collections.pfsensible.core.plugins.modules.pfsense_dns_resolver', _modlib_path=modlib_path),\r\n File \"<frozen runpy>\", line 226, in run_module\r\n File \"<frozen runpy>\", line 98, in _run_module_code\r\n File \"<frozen runpy>\", line 88, in _run_code\r\n File \"/tmp/ansible_pfsensible.core.pfsense_dns_resolver_payload_9p8tg5yy/ansible_pfsensible.core.pfsense_dns_resolver_payload.zip/ansible_collections/pfsensible/core/plugins/modules/pfsense_dns_resolver.py\", line 582, in <module>\r\n File \"/tmp/ansible_pfsensible.core.pfsense_dns_resolver_payload_9p8tg5yy/ansible_pfsensible.core.pfsense_dns_resolver_payload.zip/ansible_collections/pfsensible/core/plugins/modules/pfsense_dns_resolver.py\", line 577, in main\r\n File \"/tmp/ansible_pfsensible.core.pfsense_dns_resolver_payload_9p8tg5yy/ansible_pfsensible.core.pfsense_dns_resolver_payload.zip/ansible_collections/pfsensible/core/plugins/module_utils/module_base.py\", line 444, in run\r\n File \"/tmp/ansible_pfsensible.core.pfsense_dns_resolver_payload_9p8tg5yy/ansible_pfsensible.core.pfsense_dns_resolver_payload.zip/ansible_collections/pfsensible/core/plugins/modules/pfsense_dns_resolver.py\", line 484, in _validate_params\r\nTypeError: 'NoneType' object is not iterable\r\n",
"msg": "MODULE FAILURE: No start of json char found\nSee stdout/stderr for the exact error",
"rc": 1
}
Apparently the problem is that, if domainoverrides is not specified, it's populated with null value and line params.get("domainoverrides", []) return None instead of [] because the default argument of dictionary get function is used only when the key is not found, not in case it has a None value
Describe the bug
When applying pfsensible.core.pfsense_dns_resolver task without specifying domainoverrides parameter, the error 'NoneType' object is not iterable is raised when applying the playbook
Expected behavior
The playbook is applied without error
Playbook
Output
Please paste the ansible output run with
-vv:Environment
Additional context
Apparently the problem is that, if domainoverrides is not specified, it's populated with null value and line
params.get("domainoverrides", [])returnNoneinstead of[]because thedefaultargument of dictionarygetfunction is used only when the key is not found, not in case it has aNonevalueThis has been changed in #192, but line 484 should be changed to
for domain in params.get("domainoverrides", []) or []:to allow providing an empty list as fallback. I can prepare a PR if needed