ubuntu-autoinstall — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited ubuntu-autoinstall (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Autoinstall is the configuration format for Ubuntu Server's Subiquity installer. A version: 1 document tells the installer how to partition, install, and configure the system unattended. This skill is authoring-led (produce a correct autoinstall config from a description) with a strong validation/debug path, aimed at unattended on-prem / air-gapped Ubuntu Server LTS installs.
Autoinstall nests the other two domains:
network: key is netplan v2 → use the ubuntu-netplan skill;user-data: key is cloud-config for the installed system → use theubuntu-cloud-init skill;
See The two delegation boundaries and Delivery.
seed on the ISO/USB or an HTTP seed.
version is the only schema-required key, butidentity is required at runtime unless user-data: is present.
Air-gapped essentials section below for the exact keys).
first-boot config under user-data: (ubuntu-cloud-init skill).
validate-autoinstall-user-data.py (seeValidation — the script ships in the installer source, not in this skill).
for true zero-touch.
#cloud-config
# (1) top-level cloud-config here configures the EPHEMERAL installer environment
autoinstall: # processed by Subiquity → configures the TARGET system
version: 1
network: # (2) netplan v2 → ubuntu-netplan skill
version: 2
ethernets: { ... }
identity: { ... }
user-data: # (3) cloud-config → ubuntu-cloud-init skill
# runs on the INSTALLED system's FIRST BOOT (not at install time)
packages: [ ... ]en*/eth*.match: inside ethernets accepts only name/macaddress/driver. (A rarely-used double-wrapped network: {network: {...}} form also validates; prefer the plain form.)
installer-generated user-data. Timing matters: users from identity are created during install; users defined in user-data are created on first boot. Supplying user-data makes identity optional — but then ensure a login path exists. Don't define the same user in both.
Autoinstall config reaches the installer in two families:
#cloud-config firstline and the config nested under a top-level autoinstall: key.
autoinstall.yaml — here theautoinstall: wrapper is optional (a bare version: 1 ... works). This wrapper acceptance for on-media files arrived in 24.04.
Precedence — the installer uses the FIRST that exists:
--autoinstall <path> CLI arg (empty string explicitly disables autoinstall)subiquity.autoinstallpath=...autoinstall.yaml at the root of the install systemrun/subiquity/cloud.autoinstall.yamlcdrom/autoinstall.yaml baked into the ISOSo kernel cmdline and on-media files outrank cloud-config.
NoCloud seeding (the on-prem workhorse — see the ubuntu-cloud-init skill for full NoCloud detail):
autoinstall ds=nocloud-net;s=http://SERVER:PORT/,serving user-data + meta-data (+ optional network-config) at that base URL.
cloud-localds seed.iso user-data meta-data;cloud-init finds it by the cidata/CIDATA filesystem label. meta-data must exist (may be empty: touch meta-data).
ds= — it suppressesthe interactive "Continue with autoinstall?" disk-wipe confirmation. True zero-touch needs both the config delivery and autoinstall on the cmdline.
-append '... ds=nocloud-net;s=...' — ; is a shellmetacharacter (and ends a GRUB statement).
Full delivery/seeding detail (precedence source, ISO remastering, the on-media "only the autoinstall key" rule) is in references/delivery-and-seeding.md.
Only version is schema-required; unknown keys produce a warning in v1 (will be fatal in a future version). Common keys:
| Key | Purpose | |||
|---|---|---|---|---|
version | Must be 1. Required. | |||
identity | Initial user {realname, username, hostname, password}. Required at runtime unless user-data: present. | |||
storage | Disk layout — `layout: {name: lvm\ | direct\ | zfs\ | hybrid}` or a curtin action list. |
network | netplan v2 (→ ubuntu-netplan skill). | |||
ssh | {install-server, authorized-keys, allow-pw}. | |||
apt | Mirror selection, proxy, components, fallback (air-gapped core). | |||
proxy | HTTP proxy for install + target apt/snapd. | |||
packages / snaps | Extra packages / snaps to install. | |||
user-data | cloud-config for the installed system (→ ubuntu-cloud-init skill). | |||
late-commands | Commands after install (target mounted at `/target`). | |||
early-commands | Commands before probing (config is re-read after). | |||
interactive-sections | Sections to still prompt for; must be a list (['*'], not '*'). | |||
updates | security (default) or all. | |||
refresh-installer | {update: bool, channel} — installer self-update (set false air-gapped). | |||
kernel | {package} or {flavor}. | |||
timezone, locale, keyboard, source, drivers, codecs, oem, reporting, error-commands | see references/schema.md. | |||
kernel-crash-dumps, zdevs | 24.10+ only — not in 24.04. |
Full per-key reference (storage layouts, apt mirror-selection details, identity, ssh, command timing) is in references/schema.md.
refresh-installer:
update: false # don't try to self-update from the snap store
proxy: http://proxy.internal:3128 # NOT applied to the geoip lookup
apt:
geoip: false # disable geoip.ubuntu.com lookup (10s hang otherwise)
preserve_sources_list: false
mirror-selection:
primary:
- uri: "http://mirror.internal/ubuntu"
arches: [amd64]
fallback: abort # set explicitly; don't silently go offline-from-ISO
updates: securityprimary inside mirror-selection enables Subiquity's mirror probing(picks the first usable). A bare primary: list uses legacy curtin behavior.
apt.fallback ∈ abort | offline-install | continue-anyway. The docs disagreeon the default — always set it explicitly. offline-install falls back to the ISO's seed; continue-anyway is not recommended.
snaps:. source.id: ubuntu-server-minimal reduces footprint.
storage:
layout:
name: lvm # lvm | direct | zfs | hybrid
password: LUKS_PASSPHRASE # LVM + LUKS
sizing-policy: all # use whole VG ('scaled' default leaves snapshot room)Pick a disk with match: {ssd: true} / {serial: ...} / {size: largest}. For advanced partitioning use a curtin config: action list (when layout is present, config is ignored). See references/schema.md.
# validate-autoinstall-user-data.py ships in the subiquity SOURCE repo — it is NOT
# bundled in this skill. Get it with: git clone https://github.com/canonical/subiquity
# && cd subiquity && make install_deps. Run from that checkout, NEVER as sudo:
python3 scripts/validate-autoinstall-user-data.py user-data # #cloud-config-wrapped
python3 scripts/validate-autoinstall-user-data.py --no-expect-cloudconfig autoinstall.yaml
cloud-init schema -c user-data # validate the cloud-config bodyInstall logs live in /var/log/installer/; the delivered autoinstall (with password hash) is saved to /var/log/installer/autoinstall-user-data. Full validation workflow, the JSON schema location, and common pitfalls are in references/validation-and-debugging.md.
#cloud-config header, or a misspelled autoinstall: key → the installergoes interactive instead of crashing.
autoinstall.yaml, no other top-level keys may sit besideautoinstall: — it's fatal. (The #cloud-config delivery is the opposite: top-level cloud-config configures the installer env.)
late-commands run in the installer environment; the target is at /target.Use curtin in-target -- <cmd> to run inside the installed system.
interactive-sections: '*' (string) fails schema — use ['*']. If any interactivesection is set, reporting is ignored.
-append string.kernel: together with oem.install: true (conflicting requirements).references/schema.md — full top-level key reference: storage layouts & curtinactions, apt mirror-selection, identity/ssh, command timing, all keys. (Has a TOC.)
references/delivery-and-seeding.md — delivery precedence, NoCloud seeds, ISO/USB,HTTP serving, zero-touch, the on-media rules.
references/validation-and-debugging.md — the validator script, JSON schema, logs,pitfalls, and 24.04-vs-26.04 version notes.
references/examples.md — minimal config + a complete air-gapped server install.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.