canonical / canonical/cloud-init

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

Open
#6,680 1 comment 1 reaction 0 assignees View on GitHub
bug
Dominant language
Python
Stars
3.8k
Forks
1.1k
Avg merge
2d 23h
Merged PRs (30d)
18

Description

# 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:

```console
nobody@f1d64ba0f772:/$ cloud-init schema
Traceback (most recent call last):
File "/usr/bin/cloud-init", line 33, in
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

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.