Installs into .claude/skills of the current project.
Are you the author of Cloud Init Knowledge Patch?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/nevaberry-cloud-init-knowledge-patch)
---
name: cloud-init-knowledge-patch
description: cloud-init
version: "26.1"
license: MIT
metadata:
author: Nevaberry
---
# cloud-init Knowledge Patch
Use this skill when changing cloud-init networking, datasource detection,
packaging, service integration, distribution support, templating, platform
detection, or reporting consumers. Start with the compatibility checks below,
then load the topic reference that matches the work.
## Reference index
| Reference | Topics |
| --- | --- |
| [networking-and-datasources.md](references/networking-and-datasources.md) | Network v1 devices, route metrics, OpenStack bond names and identity, Azure controls, OpenNebula, Scaleway |
| [packaging-runtime-and-services.md](references/packaging-runtime-and-services.md) | Installation layout, Meson migration, systemd overrides, Python support, Jinja, mounts, boot analysis |
| [platforms-and-reporting.md](references/platforms-and-reporting.md) | Distribution modules and defaults, platform detection, Raspberry Pi, CloudStack, Oracle, finish-event duration |
## How to apply this patch
- Establish the datasource identity before debugging metadata networking on a
non-x86 system.
- Audit package manifests, custom systemd units, and runtime selection when
moving an older downstream integration forward.
- Treat renderer features separately from datasource detection: support for a
device or route setting does not establish the cloud platform.
- Test custom Jinja templates against the sandbox before shipping an image.
- Check platform-specific defaults before adding generic fallback networking,
mirror configuration, or separate module bootstrapping.
- Keep reporting duration and conventional exit status intact for callers that
consume cloud-init results programmatically.
## Breaking changes and migration checks
### Non-x86 datasource identity is strict
Since 25.1.4, Ec2, OpenStack, and AltCloud systems without DMI do not fall back
to probing link-local metadata after networking. Cloud-init remains disabled
unless one of these identifies the datasource:
- DMI data
- a kernel `ds=` override
- `datasource_list` configuration
For OpenStack, a config drive can provide identification. An image intentionally
tied to OpenStack can force it in
`/etc/cloud/cloud.cfg.d/91_openstack.cfg`:
```yaml
datasource_list: [ OpenStack ]
```
Do not interpret successful networking or a later metadata response as proof
that the removed fallback should select the datasource.
### Custom Jinja templates run in a sandbox
Cloud-init renders Jinja templates in a sandbox. Revise custom templates that
depend on operations the sandbox forbids, and exercise them during image tests
rather than assuming an unrestricted rendering environment.
### Missing Azure custom data is a failure
The Azure datasource reports missing custom data as a provisioning failure
instead of silently continuing. Automation must handle that result as a failed
provisioning path.
### Installed paths and the build backend changed
Packaged files install under `/usr/lib`, not `/lib`, and cloud-init builds with
Meson rather than setuptools or distutils. Recheck build invocation, generated
paths, downstream manifests, patches with absolute paths, and image assembly
logic. Meson also supports BSD builds.
### Custom systemd commands need review
The systemd-unit socket protocol changed for compatibility with alternatives
such as `ncat -U`. Inspect the effective unit:
```sh
systemctl cat cloud-init.service
```
If a drop-in or replacement supplies `ExecStart=`, compare its command with the
current packaged unit and update it before deployment.
### Python 3.8 is unsupported
Do not select Python 3.8 for a current cloud-init build or package. Check both
the package build environment and the interpreter used by installed services.
## Networking quick reference
### Preserve Network v1 device capabilities
Network v1 renders bonds, bridges, and VLANs. `network-config` can express
`allow_accept_ra` for each of those device types. Keep the setting when
translating or generating Network v1 data.
### Use OpenStack bond names from metadata
OpenStack bond names come directly from `network_data.json`. Do not replace
them with sequential names such as `bond0` or `bond1`, predict names before
reading metadata, or hard-code `bondN` expectations in tests.
### Keep route metrics in NetworkManager output
The NetworkManager renderer carries route-metric settings into generated
connection profiles. Express competing-route preference in the network
configuration; a renderer-specific workaround is no longer needed.
### Apply Azure controls deliberately
Azure provides `apply_network_config_set_name` to disable application of
network-config `set-name` directives. Its experimental `skip_ready_report`
option suppresses the ready report. Treat these as separate controls and make
the experimental status visible in image policy.
### Preserve OpenNebula route metadata
OpenNebula accepts global `SEARCH_DOMAIN` data for all interfaces and
per-interface static routes through `ETHx_ROUTES`. Keep the global and
interface scopes distinct when translating metadata.
## Datasource metadata quick reference
### Scaleway
The Scaleway datasource exposes region and availability-zone fields. It no
longer handles private-IP metadata, so consumers must not depend on it to
populate that value.
### OpenStack identity triage
When an affected non-x86 OpenStack instance stays disabled, check in this
order:
1. Whether usable DMI identity exists.
2. Whether the kernel command line supplies a `ds=` override.
3. Whether `datasource_list` selects OpenStack.
4. Whether an OpenStack config drive is available.
Do not use a later link-local metadata response as evidence that selection
should have happened.
## Runtime and module quick reference
### Amazon Linux modules
Amazon Linux supports `yum_add_repo` and `ca_certs`. Images can configure Yum
repositories and trusted CA certificates through cloud-init without separate
bootstrap logic.
### Mount paths with special characters
The `mounts` module escapes special characters in mount paths written to
`fstab`. Preserve the escaped result rather than post-processing it back into
an invalid entry.
### Analyze boot exit status
`analyze_boot` returns an integer exit code. Callers can consume it as a
conventional process status and should not assume the result is non-numeric.
## Platform quick reference
### Raspberry Pi defaults
Raspberry Pi support includes keymap handling, USB-gadget handling, and a
systemd network service template. On this platform cloud-init also disables
fallback network configuration and removes APT mirror configuration. Account
for those defaults before diagnosing absent generic output.
### Distribution behavior
Current distribution behavior includes:
| Area | Behavior |
| --- | --- |
| Rocky Linux | `ca_certs` is supported. |
| openEuler | `cc_rh_subscription` does not handle the distribution. |
| RHEL | Local changes to `disable-sshd-keygen-if-cloud-init-active.conf` are preserved. |
| Azure Linux 4.0 | The distribution is supported. |
| Alpine | The CDN is the default APK mirror. |
| Debian Bullseye | Backports suite selection uses the updated behavior. |
Do not add package logic that restores the older RHEL overwrite behavior or
generic mirror defaults that conflict with the platform behavior.
### Detection updates
Cloud-init detects Tilaa and s390x LXD environments. CloudStack can discover
virtual-router information from NetworkManager leases, and Oracle dracut images
can detect an iSCSI root through iBFT. Recheck built-in detection before
carrying local workarounds forward.
## Reporting quick reference
Reporting finish events include duration. Keep the field through parsing,
storage, and export so consumers can obtain stage timing directly rather than
reconstructing it from separate timestamps.
## Review checklist
- Is a non-x86 Ec2, OpenStack, or AltCloud datasource explicitly identified?
- Does OpenStack preserve bond names from `network_data.json`?
- Does Network v1 retain bonds, bridges, VLANs, and `allow_accept_ra`?
- Do NetworkManager profiles retain configured route metrics?
- Are Azure rename, ready-report, and custom-data behaviors handled separately?
- Are OpenNebula search-domain and per-interface route scopes preserved?
- Do package manifests use `/usr/lib` and the Meson-produced layout?
- Do effective custom systemd commands follow the current socket protocol?
- Does the runtime avoid Python 3.8?
- Do sandboxed templates and escaped mount paths pass image tests?
- Do distribution conditionals match current module support and defaults?
- Do Raspberry Pi images respect networking and APT behavior?
- Do Scaleway consumers avoid removed private-IP metadata?
- Do detection paths account for CloudStack leases and Oracle iBFT?
- Do reporting consumers preserve finish-event duration and integer exit codes?