ansible_modules icon indicating copy to clipboard operation
ansible_modules copied to clipboard

[Bug]: KeyError returned from virtual_machine module

Open drew-cccs opened this issue 3 years ago • 0 comments

Ansible NetBox Collection version

v3.7.1

Ansible version

ansible [core 2.12.6]
  config file = /home/cccsdrewd/.ansible.cfg
  configured module search path = ['/home/cccsdrewd/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/cccsdrewd/.local/lib/python3.10/site-packages/ansible
  ansible collection location = /home/cccsdrewd/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.10.4 (main, Mar 25 2022, 00:00:00) [GCC 12.0.1 20220308 (Red Hat 12.0.1-0)]
  jinja version = 3.0.3
  libyaml = True

NetBox version

v3.2.6

Python version

3.8

Steps to Reproduce

Pull information from a BIG-IP LTM via the f5networks.f5_modules.bigip_device_info module:

  - name: collect device information
    f5networks.f5_modules.bigip_device_info:
      gather_subset:
        - devices
        - interfaces
      provider:
        server: "{{ ltm_server }}"
        user: "{{ lookup('env','F5_USER') }}"
        password: "{{ lookup('env','F5_PASSWORD') }}"
        validate_certs: no
    register: vcmp_info
    until: vcmp_info is defined
    retries: 5
    delay: 2

Create a single variable containing just the self device in the cluster:

  - name: extract {{ ltm_server }} and non-zero virtual servers from list
    set_fact:
      ltm_self: "{{ vcmp_info.devices | selectattr('self','eq','yes') | first }}"

Using the following code:

  - name: ltm -> netbox
    netbox.netbox.netbox_virtual_machine:
      netbox_url: https://netbox.cccs.edu
      netbox_token: "{{ lookup('env', 'NETBOX_TOKEN') }}"
      data:
        name: "{{ ltm_server | regex_replace('\\..*') | upper }}"
        cluster: >-
          {{
            'BIG-IP PROD' if ltm_server | regex_search('^XXXXXXXX')
            else 'BIG-IP DEV-TEST'
          }}
        platform: "{{ ltm_self.marketing_name }}"
        tenant: CCCS
        tags:
          - F5
        status: active
        virtual_machine_role: "{{ 'Active' if ltm_self.failover_state == 'active' else 'Standby' }}"
        custom_fields:
          configsync_address: "{{ query('netbox.netbox.nb_lookup', 'ip-addresses', api_filter='address=' ~ ltm_self.configsync_address, api_endpoint='https://netbox.cccs.edu', token=lookup('env', 'NETBOX_TOKEN'), raw_data=true) | map(attribute='id') | first | int }}"
          management_address: "{{ query('netbox.netbox.nb_lookup', 'ip-addresses', api_filter='address=' ~ ltm_self.management_address, api_endpoint='https://netbox.cccs.edu', token=lookup('env', 'NETBOX_TOKEN'), raw_data=true) | map(attribute='id') | first | int }}"
          f5_version: "{{ ltm_self.software_version | string }}"
      query_params:
        - name
    ignore_errors: true

Expected Behavior

The virtual machine is created and can be updated normally.

Observed Behavior

The virtual machine is created correctly with all defined fields populated, but Ansible throws the following error:

{
  "module_stdout": "",
  "module_stderr": "Traceback (most recent call last):\n  File \"<stdin>\", line 107, in <module>\n  File \"<stdin>\", line 99, in _ansiballz_main\n  File \"<stdin>\", line 47, in invoke_module\n  File \"/usr/lib64/python3.8/runpy.py\", line 207, in run_module\n    return _run_module_code(code, init_globals, run_name, mod_spec)\n  File \"/usr/lib64/python3.8/runpy.py\", line 97, in _run_module_code\n    _run_code(code, mod_globals, init_globals,\n  File \"/usr/lib64/python3.8/runpy.py\", line 87, in _run_code\n    exec(code, run_globals)\n  File \"/tmp/ansible_netbox.netbox.netbox_virtual_machine_payload_l_l18qf9/ansible_netbox.netbox.netbox_virtual_machine_payload.zip/ansible_collections/netbox/netbox/plugins/modules/netbox_virtual_machine.py\", line 229, in <module>\n  File \"/tmp/ansible_netbox.netbox.netbox_virtual_machine_payload_l_l18qf9/ansible_netbox.netbox.netbox_virtual_machine_payload.zip/ansible_collections/netbox/netbox/plugins/modules/netbox_virtual_machine.py\", line 225, in main\n  File \"/tmp/ansible_netbox.netbox.netbox_virtual_machine_payload_l_l18qf9/ansible_netbox.netbox.netbox_virtual_machine_payload.zip/ansible_collections/netbox/netbox/plugins/module_utils/netbox_virtualization.py\", line 69, in run\n  File \"/tmp/ansible_netbox.netbox.netbox_virtual_machine_payload_l_l18qf9/ansible_netbox.netbox.netbox_virtual_machine_payload.zip/ansible_collections/netbox/netbox/plugins/module_utils/netbox_utils.py\", line 1315, in _ensure_object_exists\n  File \"/tmp/ansible_netbox.netbox.netbox_virtual_machine_payload_l_l18qf9/ansible_netbox.netbox.netbox_virtual_machine_payload.zip/ansible_collections/netbox/netbox/plugins/module_utils/netbox_utils.py\", line 1248, in _update_netbox_object\n  File \"/usr/local/lib/python3.8/site-packages/pynetbox/core/response.py\", line 457, in serialize\n    ret[i] = flatten_custom(current_val)\n  File \"/usr/local/lib/python3.8/site-packages/pynetbox/core/response.py\", line 61, in flatten_custom\n    return {\n  File \"/usr/local/lib/python3.8/site-packages/pynetbox/core/response.py\", line 62, in <dictcomp>\n    k: v if not isinstance(v, dict) else v[\"value\"] for k, v in custom_dict.items()\nKeyError: 'value'\n",
  "exception": "Traceback (most recent call last):\n  File \"<stdin>\", line 107, in <module>\n  File \"<stdin>\", line 99, in _ansiballz_main\n  File \"<stdin>\", line 47, in invoke_module\n  File \"/usr/lib64/python3.8/runpy.py\", line 207, in run_module\n    return _run_module_code(code, init_globals, run_name, mod_spec)\n  File \"/usr/lib64/python3.8/runpy.py\", line 97, in _run_module_code\n    _run_code(code, mod_globals, init_globals,\n  File \"/usr/lib64/python3.8/runpy.py\", line 87, in _run_code\n    exec(code, run_globals)\n  File \"/tmp/ansible_netbox.netbox.netbox_virtual_machine_payload_l_l18qf9/ansible_netbox.netbox.netbox_virtual_machine_payload.zip/ansible_collections/netbox/netbox/plugins/modules/netbox_virtual_machine.py\", line 229, in <module>\n  File \"/tmp/ansible_netbox.netbox.netbox_virtual_machine_payload_l_l18qf9/ansible_netbox.netbox.netbox_virtual_machine_payload.zip/ansible_collections/netbox/netbox/plugins/modules/netbox_virtual_machine.py\", line 225, in main\n  File \"/tmp/ansible_netbox.netbox.netbox_virtual_machine_payload_l_l18qf9/ansible_netbox.netbox.netbox_virtual_machine_payload.zip/ansible_collections/netbox/netbox/plugins/module_utils/netbox_virtualization.py\", line 69, in run\n  File \"/tmp/ansible_netbox.netbox.netbox_virtual_machine_payload_l_l18qf9/ansible_netbox.netbox.netbox_virtual_machine_payload.zip/ansible_collections/netbox/netbox/plugins/module_utils/netbox_utils.py\", line 1315, in _ensure_object_exists\n  File \"/tmp/ansible_netbox.netbox.netbox_virtual_machine_payload_l_l18qf9/ansible_netbox.netbox.netbox_virtual_machine_payload.zip/ansible_collections/netbox/netbox/plugins/module_utils/netbox_utils.py\", line 1248, in _update_netbox_object\n  File \"/usr/local/lib/python3.8/site-packages/pynetbox/core/response.py\", line 457, in serialize\n    ret[i] = flatten_custom(current_val)\n  File \"/usr/local/lib/python3.8/site-packages/pynetbox/core/response.py\", line 61, in flatten_custom\n    return {\n  File \"/usr/local/lib/python3.8/site-packages/pynetbox/core/response.py\", line 62, in <dictcomp>\n    k: v if not isinstance(v, dict) else v[\"value\"] for k, v in custom_dict.items()\nKeyError: 'value'\n",
  "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
  "rc": 1,
  "_ansible_no_log": false,
  "changed": false
}

Afterwards, any attempts to update the device via Ansible fails with the same error, and no modifications are performed.

drew-cccs avatar Jul 13 '22 19:07 drew-cccs