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 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.
Done when every check holds: the validator exits 0 on the exact file being delivered; cloud-init schema -c passes on every #cloud-config file; every key exists in the target release's schema (24.04 lacks kernel-crash-dumps and zdevs, which only warn, and identity.groups, which fails validation); the seed has meta-data; and the boot line carries both autoinstall and the config source.
#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. An unknown or misspelled top-level key only warns in v1 and the key is ignored; an unknown sub-key of identity, refresh-installer, keyboard or active-directory fails validation. Every key, with sub-keys, defaults and release gating, is in references/schema.md §1 — read it before using any key this file does not show.
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 # no country-mirror swap (the lookup itself still runs)
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.
geoip: false does not stop the request to geoip.ubuntu.com: Subiquity sendsit as soon as the network is up, bypassing proxy. Offline it fails harmlessly; block it at the firewall if no request may leave the segment.
apt.fallback ∈ abort | offline-install | continue-anyway. The docs disagreeon the default, but the installer's effective default is offline-install: with the key unset, an unreachable mirror silently yields an ISO-only install — always set it explicitly. 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.
layout: without match: installs to the largest disk,which on a server is often the data disk, and the autoinstall keyword removes the only confirmation. On any multi-disk host, pin the target (match: {serial: ...}, {ssd: true}, {size: smallest}). Never make an autoinstall PXE entry the default boot item on a shared network: every host that netboots gets wiped.
#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.
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.references/sources.md — the upstream file, tag and line behind each version orbehaviour claim; read it only to re-check a claim before changing it.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.