I want to call the redhat_subscription module with consumer_type: rhui, but the playbook fails. With the default verbosity, the output reads: TASK [rhui_nodes : register with RHSM] ******************************************************************************************************************************************************* fatal: [ec2-52-51-130-154.eu-west-1.compute.amazonaws.com]: FAILED! => {"changed": false, "msg": "Failed to register with 'None': com.redhat.RHSM1.Error: {\"exception\": \"ValidationError\", \"severity\": \"error\", \"message\": \"Unknown arguments: dict_keys(['consumer_type'])\"}"} With -vvv: The full traceback is: File "/tmp/ansible_redhat_subscription_payload_nwgy781h/ansible_redhat_subscription_payload.zip/ansible_collections/community/general/plugins/modules/redhat_subscription.py", line 1205, in main File "/tmp/ansible_redhat_subscription_payload_nwgy781h/ansible_redhat_subscription_payload.zip/ansible_collections/community/general/plugins/modules/redhat_subscription.py", line 480, in register File "/tmp/ansible_redhat_subscription_payload_nwgy781h/ansible_redhat_subscription_payload.zip/ansible_collections/community/general/plugins/modules/redhat_subscription.py", line 683, in _register_using_dbus File "/usr/lib64/python3.6/site-packages/dbus/connection.py", line 651, in call_blocking message, timeout) fatal: [ec2-52-51-130-154.eu-west-1.compute.amazonaws.com]: FAILED! => { "changed": false, "invocation": { "module_args": { "activationkey": null, "auto_attach": null, "consumer_id": null, "consumer_name": null, "consumer_type": "rhui", "environment": null, "force_register": false, "org_id": null, "password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER", "pool": "^Red Hat Update Infrastructure", "pool_ids": [], "release": null, "rhsm_baseurl": null, "rhsm_repo_ca_cert": null, "server_hostname": null, "server_insecure": null, "server_port": null, "server_prefix": null, "server_proxy_hostname": null, "server_proxy_password": null, "server_proxy_port": null, "server_proxy_scheme": null, "server_proxy_user": null, "state": "present", "syspurpose": null, "token": null, "username": "rbiba_ccsp" } }, "msg": "Failed to register with 'None': com.redhat.RHSM1.Error: {\"exception\": \"ValidationError\", \"severity\": \"error\", \"message\": \"Unknown arguments: dict_keys(['consumer_type'])\"}" } The target node's OS is RHEL 8. It works when I edit the module to avoid dbus; basically I tried adding return False to _can_connect_to_dbus in /usr/lib/python3.11/site-packages/ansible_collections/community/general/plugins/modules/redhat_subscription.py, and it allowed the system to get registered as expected. Here's a relevant part from the rhsm.log file on the target system before the workaround: 2023-10-09 07:58:04,952 [ERROR] rhsm-service:16665:MainThread @util.py:41 - Unknown arguments: dict_keys(['consumer_type']) Traceback (most recent call last): File "/usr/lib64/python3.6/site-packages/rhsmlib/dbus/util.py", line 38, in dbus_handle_exceptions ret = func(*args, **kwargs) File "/usr/lib64/python3.6/site-packages/rhsmlib/dbus/objects/register.py", line 331, in Register consumer = register_service.register(org, **options) File "/usr/lib64/python3.6/site-packages/rhsmlib/services/register.py", line 45, in register raise exceptions.ValidationError(_("Unknown arguments: %s") % kwargs.keys()) rhsmlib.services.exceptions.ValidationError: Unknown arguments: dict_keys(['consumer_type']) Reproducible: Always Steps to Reproduce: 1. Have a playbook with the redhat_subscription module as follows: state: present username: ... password: ... consumer_type: rhui pool: '^Red Hat Update Infrastructure' 2. Run it. Actual Results: Error, as described in detail above. Expected Results: It works.
OK I took a closer look later this afternoon and here's the fix for this bug: --- /usr/lib/python3.11/site-packages/ansible_collections/community/general/plugins/modules/redhat_subscription.py.consumer_type 2023-10-09 16:38:08.951778928 +0200 +++ /usr/lib/python3.11/site-packages/ansible_collections/community/general/plugins/modules/redhat_subscription.py 2023-10-09 16:38:26.456963195 +0200 @@ -587,7 +587,7 @@ register_opts = {} if consumer_type: - register_opts['consumer_type'] = consumer_type + register_opts['type'] = consumer_type if consumer_name: register_opts['name'] = consumer_name if consumer_id:
Oh it's a little more complicated. register_opts['type'] must be used on RHEL 8 (which is the only version where RHUI is currently supported and where this consumer type makes sense) and in theory also on RHEL 7, but register_opts['consumer_type'] actually is the right thing to do if the target node is running RHEL 9. So the patch will have to take distro_id/distro_version into account as well, like: if consumer_type: if distro_id == 'rhel' and distro_version[0] <= 8: register_opts['type'] = consumer_type else: register_opts['consumer_type'] = consumer_type (if the consumer type makes sense outside RHEL at all)
Pino, do you have any insight here? I know you have been working on the redhat_subscription module upstream as of late. The reporter did not include the version of ansible that they have installed, but assuming it's the current ansible-7.7.0 in the F38 repos, the plugin is taken from community.general 6.6.2 (https://github.com/ansible-collections/community.general/blob/6.6.2/plugins/modules/redhat_subscription.py).
(In reply to Radek Bíba from comment #2) > Oh it's a little more complicated. register_opts['type'] must be used on > RHEL 8 (which is the only version where RHUI is currently supported and > where this consumer type makes sense) and in theory also on RHEL 7, but > register_opts['consumer_type'] actually is the right thing to do if the > target node is running RHEL 9. OMG, yet another incompatibility across versions present -- I was not aware of it. The 'type' parameter was renamed to 'consumer_type' to avoid a conflict with the builtin Python function, and this is present in subscription-manager >= 1.29.32. This version is available since RHEL 9.2 only, so... > So the patch will have to take > distro_id/distro_version into account as well, like: > > if consumer_type: > if distro_id == 'rhel' and distro_version[0] <= 8: > register_opts['type'] = consumer_type > else: > register_opts['consumer_type'] = consumer_type ... this is mostly correct, and the distro check will need to be more complex. > (if the consumer type makes sense outside RHEL at all) Yes, I do not think it has anything to do with the distro, it is simply an attribute of a system. (In reply to Maxwell G from comment #3) > I know you have been working on the redhat_subscription module upstream as of late. I'm the maintainer of this module, yes. > The reporter did not include > the version of ansible that they have installed, but assuming it's the > current ansible-7.7.0 in the F38 repos, the plugin is taken from > community.general 6.6.2 Hm or maybe it is installed from the separate ansible-collection-community-general package, currently version 6.6.0-1 in f38. I massaged a bit the code needed for this, modelling it according to what done for other bits in the module: https://github.com/ansible-collections/community.general/pull/7378 would you both please give it a look/try?
Oops, sorry about the missing information about the affected version. There was no template in the bug creation form to enter this data and I forgot. It's the stock package from Fedora 38, ansible-7.7.0-1.fc38.noarch. I'll take a closer look at the PR today. Many thanks for the quick response!
I'm getting: fatal: [ec2-99-81-46-143.eu-west-1.compute.amazonaws.com]: FAILED! => {"changed": false, "msg": "Failed to register with 'None': Don't know which D-Bus type to use to encode type \"NoneType\""} from RHEL 7, 8, and 9(.2).
Oh, I guess you meant: register_opts[consumer_type_key] = consumer_type rather than: register_opts[consumer_type_key] = environment in https://github.com/ansible-collections/community.general/pull/7378/files#diff-b354707cac5ffce6845c0ab9c2070a9063747f9a41d64c284194ce5ca2d982c3R602 .
(In reply to Radek Bíba from comment #7) > Oh, I guess you meant: > > register_opts[consumer_type_key] = consumer_type > > rather than: > > register_opts[consumer_type_key] = environment Oops, apologies, fixed, thanks. (AKA: why you should never do patches before 8 AM)
Thank you, Pino. It works.
(In reply to Radek Bíba from comment #9) > Thank you, Pino. It works. Thanks for testing! Would you please comment on the github PR?
Absolutely. Comment added.
FEDORA-2023-954e1db855 has been submitted as an update to Fedora 38. https://bodhi.fedoraproject.org/updates/FEDORA-2023-954e1db855
I backported the patch to ansible-collection-community-general. You can install that package alongside ansible and the module loader will pick up the updated redhat_subscription module from there. Is that okay? We avoid patching content within the ansible package where possible.
FEDORA-2023-e25f3ce991 has been submitted as an update to Fedora 40. https://bodhi.fedoraproject.org/updates/FEDORA-2023-e25f3ce991
FEDORA-2023-e25f3ce991 has been pushed to the Fedora 40 stable repository. If problem still persists, please make note of it in this bug report.
FEDORA-2023-954e1db855 has been pushed to the Fedora 38 testing repository. Soon you'll be able to install the update with the following command: `sudo dnf upgrade --enablerepo=updates-testing --refresh --advisory=FEDORA-2023-954e1db855` You can provide feedback for this update here: https://bodhi.fedoraproject.org/updates/FEDORA-2023-954e1db855 See also https://fedoraproject.org/wiki/QA:Updates_Testing for more information on how to test updates.
(In reply to Maxwell G from comment #13) > I backported the patch to ansible-collection-community-general. You can > install that package alongside ansible and the module loader will pick up > the updated redhat_subscription module from there. Is that okay? We avoid > patching content within the ansible package where possible. No problem at all. I reverted the local changes and installed ansible-collection-community-general-6.6.6-1.fc38.noarch from updates-testing, and it works. Thank you, Maxwell.
FEDORA-2023-954e1db855 has been pushed to the Fedora 38 stable repository. If problem still persists, please make note of it in this bug report.