theforeman / foreman-ansible-modules

Ansible modules for interacting with the Foreman API and various plugin APIs such as Katello
GNU General Public License v3.0
147 stars 163 forks source link

Getting `KeyError: 'parameter_type'` when trying to set build status to a host #1480

Closed jhutar closed 2 years ago

jhutar commented 2 years ago
SUMMARY

I was trying to set build status for a host and it fails with python traceback.

ISSUE TYPE
ANSIBLE VERSION
ansible [core 2.12.7]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/jhutar/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.10/site-packages/ansible
  ansible collection location = /home/jhutar/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.10.6 (main, Aug  2 2022, 00:00:00) [GCC 12.1.1 20220507 (Red Hat 12.1.1-1)]
  jinja version = 3.0.3
  libyaml = True
COLLECTION VERSION
# /usr/lib/python3.10/site-packages/ansible_collections
Collection                    Version
----------------------------- -------
amazon.aws                    2.3.0  
ansible.netcommon             2.6.1  
ansible.posix                 1.4.0  
ansible.utils                 2.6.1  
ansible.windows               1.10.0 
arista.eos                    3.1.0  
awx.awx                       19.4.0 
azure.azcollection            1.13.0 
check_point.mgmt              2.3.0  
chocolatey.chocolatey         1.2.0  
cisco.aci                     2.2.0  
cisco.asa                     2.1.0  
cisco.dnac                    6.4.0  
cisco.intersight              1.0.19 
cisco.ios                     2.8.1  
cisco.iosxr                   2.9.0  
cisco.ise                     1.2.1  
cisco.meraki                  2.6.2  
cisco.mso                     1.4.0  
cisco.nso                     1.0.3  
cisco.nxos                    2.9.1  
cisco.ucs                     1.8.0  
cloud.common                  2.1.1  
cloudscale_ch.cloud           2.2.2  
community.aws                 2.5.0  
community.azure               1.1.0  
community.ciscosmb            1.0.5  
community.crypto              2.3.2  
community.digitalocean        1.19.0 
community.dns                 2.2.0  
community.docker              2.6.0  
community.fortios             1.0.0  
community.general             4.8.2  
community.google              1.0.0  
community.grafana             1.4.0  
community.hashi_vault         2.5.0  
community.hrobot              1.4.0  
community.kubernetes          2.0.1  
community.kubevirt            1.0.0  
community.libvirt             1.1.0  
community.mongodb             1.4.0  
community.mysql               2.3.8  
community.network             3.3.0  
community.okd                 2.2.0  
community.postgresql          1.7.4  
community.proxysql            1.4.0  
community.rabbitmq            1.2.1  
community.routeros            2.1.0  
community.sap                 1.0.0  
community.sap_libs            1.1.0  
community.skydive             1.0.0  
community.sops                1.2.2  
community.vmware              1.18.0 
community.windows             1.10.0 
community.zabbix              1.7.0  
containers.podman             1.9.3  
cyberark.conjur               1.1.0  
cyberark.pas                  1.0.14 
dellemc.enterprise_sonic      1.1.1  
dellemc.openmanage            4.4.0  
dellemc.os10                  1.1.1  
dellemc.os6                   1.0.7  
dellemc.os9                   1.0.4  
f5networks.f5_modules         1.17.0 
fortinet.fortimanager         2.1.5  
fortinet.fortios              2.1.6  
frr.frr                       1.0.4  
gluster.gluster               1.0.2  
google.cloud                  1.0.2  
hetzner.hcloud                1.6.0  
hpe.nimble                    1.1.4  
ibm.qradar                    1.0.3  
infinidat.infinibox           1.3.3  
infoblox.nios_modules         1.2.2  
inspur.sm                     1.3.0  
junipernetworks.junos         2.10.0 
kubernetes.core               2.3.1  
mellanox.onyx                 1.0.0  
netapp.aws                    21.7.0 
netapp.azure                  21.10.0
netapp.cloudmanager           21.17.0
netapp.elementsw              21.7.0 
netapp.ontap                  21.19.1
netapp.storagegrid            21.10.0
netapp.um_info                21.8.0 
netapp_eseries.santricity     1.3.0  
netbox.netbox                 3.7.1  
ngine_io.cloudstack           2.2.4  
ngine_io.exoscale             1.0.0  
ngine_io.vultr                1.1.1  
openstack.cloud               1.8.0  
openvswitch.openvswitch       2.1.0  
ovirt.ovirt                   1.6.6  
purestorage.flasharray        1.13.0 
purestorage.flashblade        1.9.0  
sensu.sensu_go                1.13.1 
servicenow.servicenow         1.0.6  
splunk.es                     1.0.2  
t_systems_mms.icinga_director 1.29.0 
theforeman.foreman            2.2.0  
vmware.vmware_rest            2.1.5  
vyos.vyos                     2.8.0  
wti.remote                    1.0.3  

# /home/jhutar/.ansible/collections/ansible_collections
Collection           Version
-------------------- -------
ansible.netcommon    2.1.0  
ansible.posix        1.3.0  
ansible.utils        2.2.0  
awx.awx              15.0.1 
community.general    3.6.0  
community.postgresql 1.3.0  
containers.podman    1.9.4  
ibm.cloudcollection  1.37.1 
theforeman.foreman   3.6.0  
KATELLO/FOREMAN VERSION

I do not have access to ssh to the Foreman, but UI says Version 1.19.1

STEPS TO REPRODUCE
    - name: "Set the host to build on reboot"
      theforeman.foreman.host:
        username: "{{ foreman_user }}"
        password: "{{ foreman_pass }}"
        server_url: "{{ foreman_protocol }}://{{ foreman_host }}"
        validate_certs: "{{ foreman_verify }}"
        build: yes
        name: "{{ item }}"
      loop: "{{ inventory_hosts }}"
EXPECTED RESULTS
ACTUAL RESULTS
failed: [localhost] (item=<host>) => {"ansible_loop_var": "item", "changed": false, "item": "<host>", "module_stderr": "/usr/lib/python3.10/site-packages/urllib3/connectionpool.py:1043: InsecureRequestWarning: Unverified HTTPS request is being made to host '<foreman_host>'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings\n  warnings.warn(\n/usr/lib/python3.10/site-packages/urllib3/connectionpool.py:1043: InsecureRequestWarning: Unverified HTTPS request is being made to host '<foreman_host>'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings\n  warnings.warn(\n/usr/lib/python3.10/site-packages/urllib3/connectionpool.py:1043: InsecureRequestWarning: Unverified HTTPS request is being made to host '<foreman_host>'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings\n  warnings.warn(\nTraceback (most recent call last):\n  File \"/home/jhutar/.ansible/tmp/ansible-tmp-1662550357.9303496-1309740-133651791133485/AnsiballZ_host.py\", line 107, in <module>\n    _ansiballz_main()\n  File \"/home/jhutar/.ansible/tmp/ansible-tmp-1662550357.9303496-1309740-133651791133485/AnsiballZ_host.py\", line 99, in _ansiballz_main\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n  File \"/home/jhutar/.ansible/tmp/ansible-tmp-1662550357.9303496-1309740-133651791133485/AnsiballZ_host.py\", line 47, in invoke_module\n    runpy.run_module(mod_name='ansible_collections.theforeman.foreman.plugins.modules.host', init_globals=dict(_module_fqn='ansible_collections.theforeman.foreman.plugins.modules.host', _modlib_path=modlib_path),\n  File \"/usr/lib64/python3.10/runpy.py\", line 224, in run_module\n    return _run_module_code(code, init_globals, run_name, mod_spec)\n  File \"/usr/lib64/python3.10/runpy.py\", line 96, in _run_module_code\n    _run_code(code, mod_globals, init_globals,\n  File \"/usr/lib64/python3.10/runpy.py\", line 86, in _run_code\n    exec(code, run_globals)\n  File \"/tmp/ansible_theforeman.foreman.host_payload_v75ryb8p/ansible_theforeman.foreman.host_payload.zip/ansible_collections/theforeman/foreman/plugins/modules/host.py\", line 535, in <module>\n  File \"/tmp/ansible_theforeman.foreman.host_payload_v75ryb8p/ansible_theforeman.foreman.host_payload.zip/ansible_collections/theforeman/foreman/plugins/modules/host.py\", line 525, in main\n  File \"/tmp/ansible_theforeman.foreman.host_payload_v75ryb8p/ansible_theforeman.foreman.host_payload.zip/ansible_collections/theforeman/foreman/plugins/module_utils/foreman_helper.py\", line 340, in run\n  File \"/tmp/ansible_theforeman.foreman.host_payload_v75ryb8p/ansible_theforeman.foreman.host_payload.zip/ansible_collections/theforeman/foreman/plugins/module_utils/foreman_helper.py\", line 217, in run\n  File \"/tmp/ansible_theforeman.foreman.host_payload_v75ryb8p/ansible_theforeman.foreman.host_payload.zip/ansible_collections/theforeman/foreman/plugins/module_utils/foreman_helper.py\", line 1754, in parameters_list_to_str_list\nKeyError: 'parameter_type'\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
evgeni commented 2 years ago

I am sorry, but Foreman 1.19 is not supported.

jhutar commented 2 years ago

I do not know if this is a correct fix, but I workarounded it with:

 def parameters_list_to_str_list(parameters):
     filtered_params = []
     for param in parameters:
         new_param = {k: v for (k, v) in param.items() if k in parameter_ansible_spec.keys()}
+        new_param['value'] = parameter_value_to_str(new_param['value'], new_param.get('parameter_type', 'string'))
-        new_param['value'] = parameter_value_to_str(new_param['value'], new_param['parameter_type'])
         filtered_params.append(new_param)
     return filtered_params
evgeni commented 2 years ago

it is not, no, as that would break the "default is string" behaviour on newer systems. (it might get you further, but given 1.19 is so old, I totally expect other parts of FAM being also broken with it)

jhutar commented 2 years ago

Agreed. Btw this fixed the issue for me and I'm now able to set build status and restart it via this Foreman which was mine end-goal.