Skip to content

cloud-init schema tries to read /run/cloud-init/cloud.cfg and fails if it can't #6680

@evgeni

Description

@evgeni

Bug report

I'd like to validate a static cloud-init config file using cloud-init schema --config-file filename without having root privileges, but it fails with the following backtrace:

nobody@f1d64ba0f772:/$ cloud-init schema
Traceback (most recent call last):
  File "/usr/bin/cloud-init", line 33, in <module>
    sys.exit(load_entry_point('cloud-init==25.1.4', 'console_scripts', 'cloud-init')())
             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/lib/python3/dist-packages/cloudinit/cmd/main.py", line 1256, in main
    schema_parser(parser_schema)
    ~~~~~~~~~~~~~^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/cloudinit/config/schema.py", line 1235, in get_parser
    f"{read_cfg_paths().get_runpath('instance_data')}"
       ~~~~~~~~~~~~~~^^
  File "/usr/lib/python3/dist-packages/cloudinit/cmd/devel/__init__.py", line 22, in read_cfg_paths
    init.read_cfg()
    ~~~~~~~~~~~~~^^
  File "/usr/lib/python3/dist-packages/cloudinit/stages.py", line 278, in read_cfg
    self._cfg = self._read_cfg(extra_fns)
                ~~~~~~~~~~~~~~^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/cloudinit/stages.py", line 288, in _read_cfg
    initial_config = self._read_bootstrap_cfg(extra_fns, {})
  File "/usr/lib/python3/dist-packages/cloudinit/stages.py", line 308, in _read_bootstrap_cfg
    base_cfg=fetch_base_config(
             ~~~~~~~~~~~~~~~~~^
        no_cfg_paths.run_dir, instance_data_file=instance_data_file
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ),
    ^
  File "/usr/lib/python3/dist-packages/cloudinit/stages.py", line 1154, in fetch_base_config
    read_runtime_config(run_dir),
    ~~~~~~~~~~~~~~~~~~~^^^^^^^^^
  File "/usr/lib/python3/dist-packages/cloudinit/stages.py", line 1141, in read_runtime_config
    return util.read_conf(os.path.join(run_dir, "cloud.cfg"))
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 324, in read_conf
    config_file = load_text_file(fname)
  File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 1583, in load_text_file
    return decode_binary(load_binary_file(fname, read_cb=read_cb, quiet=quiet))
                         ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 1567, in load_binary_file
    with open(fname, "rb") as ifh:
         ~~~~^^^^^^^^^^^^^
PermissionError: [Errno 13] Permission denied: '/run/cloud-init/cloud.cfg'

This only happens if

  • /run/cloud-init exists
  • /run/cloud-init is not readable by the user calling cloud-init schema (like deployed by the Fedora packages)

I guess it is related, but not the same as #6592

Steps to reproduce the problem

  1. sudo apt install cloud-init
  2. sudo mkdir -p /run/cloud-init
  3. sudo chmod 700 /run/cloud-init
  4. cloud-init schema

Environment details

  • Cloud-init version: 23.2, 24.4, 25.1.4, 25.2
  • Operating System Distribution: Debian, Ubuntu, Fedora

Thanks to snapshot.debian.org I know that 22.4.2 works fine, while 23.2 and newer does not.
Debian doesn't have any versions between those two in the archive to test.

cloud-init logs

N/A

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working correctly

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions