Work with custom module failed after upgrade ansible core 2.15 -> 2.17

Hello.
I have a custom module, called “cloudninja” which can works with our private cloud and make some tasks.
When I upgraded in requirements.yml version of ansible-core 2.15 to 2.17, I got an error

ModuleNotFoundError: No module named 'ansible.module_utils.common.yaml'

Full text here:

[Step 4/11] fatal: [localhost]: FAILED! => {"changed": false, "module_stderr": "Traceback (most recent call last): 
File "/home/*******/.ansible/tmp/ansible-tmp-1741550629.2001305-5810-138810944062998/AnsiballZ_cloudninja.py", line 107, in _ansiballz_main()
File "/home/*******/.ansible/tmp/ansible-tmp-1741550629.2001305-5810-138810944062998/AnsiballZ_cloudninja.py", line 99, in _ansiballz_main invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)
File "/home/*******/.ansible/tmp/ansible-tmp-1741550629.2001305-5810-138810944062998/AnsiballZ_cloudninja.py", line 47, in шnvoke_module\runpy.run_module(mod_name='ansible_collections.cloud.openstack.plugins.modules.cloudninja', init_globals=dict(_module_fqn='ansible_collections.cloud.openstack.plugins.modules.cloudninja', _modlib_path=modlib_path),
File "", line 226, in run_module
File "", line 98, in _run_module_code
File "", line 88, in _run_code
File"/opt/TeamCity/temp/buildTmp/ansible_cloud.openstack.cloudninja_payload_oayqdo0i/ansible_cloud.openstack.cloudninja_payload.zip/ansible_collections/cloud/openstack/plugins/modules/cloudninja.py", line 133, in
File "/opt/TeamCity/work/3245234523sdfsdf/ansible/lib64/python3.11/site-packages/ansible/utils/py3compat.py", line 12, in from ansible.utils.display import Display
File "/opt/TeamCity/work/3245234523sdfsdf/ansible/lib64/python3.11/site-packages/ansible/utils/display.py", line 49, in from ansible import constants as C
File "/opt/TeamCity/work/3245234523sdfsdf/ansible/lib64/python3.11/site-packages/ansible/constants.py", line 11, in from ansible.config.manager import ConfigManager
File "/opt/TeamCity/work/3245234523sdfsdf/ansible/lib64/python3.11/site-packages/ansible/config/manager.py", line 20, in from ansible.module_utils.common.yaml import yaml_load
ModuleNotFoundError: No module named 'ansible.module_utils.common.yaml'", 
"module_stdout": ""
"msg": "MODULE FAILURE See stdout/stderr for the exact error", "rc": 1}

Part of python code from module looks like:

from ansible.module_utils.basic import AnsibleModule
from ansible.utils import py3compat
from ansible.errors import AnsibleError
from ansible_collections.cloud.openstack.plugins.module_utils.cloudninja import Cloudninja

and worked with Ansible-core until 2.15.
Dear sirs, could you help me please to solve this error?

You cannot use those imports within a module.

Modules can only import from ansible.module_utils or module_utils from a collection.

Dear @sivel could you answer, please, what I need to do with this string?

from ansible.utils import py3compat

Because in a code below this I found usage

def _get_openstack_connection(cloud):
    os_cloud = py3compat.environ.get("OS_CLOUD", cloud)
    if not os_cloud:
        raise AnsibleError("OpenStack cloud is not defined")

    return openstack.connect(cloud=os_cloud)

ansible-core 2.17 no longer supports Python 2.7 as an execution target, so there’s no point in keeping compatibility hacks in your module. Just use os.environ directly.

Thank you for reply.
I did:

  1. Changed
    from ansible.utils import py3compat
    to
    import os
  2. Changed
    os_cloud = py3compat.environ.get("OS_CLOUD", cloud)
    to
    os_cloud = os.environ.get("OS_CLOUD", cloud)
    and looks like it works.
    @flowerysong @sivel many thanks!