ansible_modules
ansible_modules copied to clipboard
[Bug]: KeyError returned from virtual_machine module
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.