Skip to content

Empty domainoverrides raises 'NoneType' object is not iterable #206

@yakky

Description

@yakky

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

---
- hosts: pfsense
  gather_facts: True
  become_method: sudo
  tasks:
    - name: Configure internal dns
      pfsensible.core.pfsense_dns_resolver:
        hosts: []

Output
Please paste the ansible output run with -vv:

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
}

Environment

  • What version of pfsensible.core? 0.7.0
  • What version of ansible? 11.11.0 (core 2.18.10)
  • What version of pfSense? 2.8.1

Additional context

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

This 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions