agentsclimarketplace

Ubuntu autoinstall

Skill air-gapped/skills/.claude/skills/ubuntu-autoinstall

Claude Code plugin marketplace — 58 installable reference skills across vLLM/SGLang inference, Kubernetes & Harvester, GPU host bring-up, observability, security, and agent workflows.

Install
npx -y skills add air-gapped/skills --skill ubuntu-autoinstall

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Author, validate, and debug Ubuntu Server autoinstall configuration (the Subiquity installer's `autoinstall:` schema, version 1) for Ubuntu Server LTS 24.04 and 26.04, focused on unattended on-premise and air-gapped installs — identity, storage (LVM/direct/ZFS/encryption/RAID), apt mirror-selection + proxy + offline fallback, ssh, packages, kernel, late-commands/early-commands, and zero-touch delivery via a NoCloud seed. The `network:` block is netplan v2 (use the ubuntu-netplan skill); the `user-data:` block is cloud-config for the installed system (use the ubuntu-cloud-init skill).

SKILL.md

11.0 KB, ~2.6k tokens by cl100k_base, as published. Nobody here has run it

ubuntu-autoinstall

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:

  • its network: key is netplan v2 → use the ubuntu-netplan skill;
  • its user-data: key is cloud-config for the installed system → use the ubuntu-cloud-init skill;
  • and the config is itself delivered via cloud-init NoCloud.

See The two delegation boundaries and Delivery.

Authoring workflow

  1. Pick the delivery method (Delivery, below). Air-gapped → usually a NoCloud seed on the ISO/USB or an HTTP seed.
  2. Write the version: 1 document. version is the only schema-required key, but identity is required at runtime unless user-data: is present.
  3. Set the air-gapped essentials — local mirror, proxy, offline fallback (see the Air-gapped essentials section below for the exact keys).
  4. Author network: as netplan v2 (ubuntu-netplan skill) and any installed-system first-boot config under user-data: (ubuntu-cloud-init skill).
  5. Validate with the subiquity repo's validate-autoinstall-user-data.py (see Validation — the script ships in the installer source, not in this skill).
  6. Boot with the autoinstall kernel keyword to skip the disk-wipe confirmation for true zero-touch.

The two delegation boundaries (critical)

#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: [ ... ]
  • network: is netplan v2 only. Default if omitted is DHCPv4 on en*/eth*. match: inside ethernets accepts only name/macaddress/driver. (A rarely-used double-wrapped network: {network: {...}} form also validates; prefer the plain form.)
  • user-data: is cloud-config for the installed system, merged with the 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.

Delivery & the NoCloud seed

Autoinstall config reaches the installer in two families:

  • Via cloud-init #cloud-config user-data — requires the #cloud-config first line and the config nested under a top-level autoinstall: key.
  • Directly on the install media as a file named autoinstall.yaml — here the autoinstall: 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:

  1. --autoinstall <path> CLI arg (empty string explicitly disables autoinstall)
  2. kernel cmdline subiquity.autoinstallpath=...
  3. autoinstall.yaml at the root of the install system
  4. cloud-config-supplied run/subiquity/cloud.autoinstall.yaml
  5. cdrom/autoinstall.yaml baked into the ISO

So 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):

  • HTTP seed: kernel cmdline autoinstall ds=nocloud-net;s=http://SERVER:PORT/, serving user-data + meta-data (+ optional network-config) at that base URL.
  • Volume seed (USB/ISO): build with 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).
  • The bare autoinstall kernel keyword is separate from ds= — it suppresses the interactive "Continue with autoinstall?" disk-wipe confirmation. True zero-touch needs both the config delivery and autoinstall on the cmdline.
  • Quote the whole kernel -append '... ds=nocloud-net;s=...'; is a shell metacharacter (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.

Top-level schema (version 1) — quick reference

Only version is schema-required; unknown keys produce a warning in v1 (will be fatal in a future version). Common keys:

KeyPurpose
versionMust be 1. Required.
identityInitial user {realname, username, hostname, password}. Required at runtime unless user-data: present.
storageDisk layout — layout: {name: lvm|direct|zfs|hybrid} or a curtin action list.
networknetplan v2 (→ ubuntu-netplan skill).
ssh{install-server, authorized-keys, allow-pw}.
aptMirror selection, proxy, components, fallback (air-gapped core).
proxyHTTP proxy for install + target apt/snapd.
packages / snapsExtra packages / snaps to install.
user-datacloud-config for the installed system (→ ubuntu-cloud-init skill).
late-commandsCommands after install (target mounted at /target).
early-commandsCommands before probing (config is re-read after).
interactive-sectionsSections to still prompt for; must be a list (['*'], not '*').
updatessecurity (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-commandssee references/schema.md.
kernel-crash-dumps, zdevs24.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.

Air-gapped essentials

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: security
  • Wrapping primary inside mirror-selection enables Subiquity's mirror probing (picks the first usable). A bare primary: list uses legacy curtin behavior.
  • apt.fallbackabort | offline-install | continue-anyway. The docs disagree on the default — always set it explicitly. offline-install falls back to the ISO's seed; continue-anyway is not recommended.
  • Snaps requiring the store fail offline — only ship snaps seeded on the ISO, or omit snaps:. source.id: ubuntu-server-minimal reduces footprint.

storage (quick)

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.

Validation & debugging

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

Install 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.

Common pitfalls

  • Missing #cloud-config header, or a misspelled autoinstall: key → the installer goes interactive instead of crashing.
  • In the on-media autoinstall.yaml, no other top-level keys may sit beside autoinstall: — 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 interactive section is set, reporting is ignored.
  • Quote the password hash and the kernel -append string.
  • Don't pin a kernel: together with oem.install: true (conflicting requirements).

Reference files

  • references/schema.md — full top-level key reference: storage layouts & curtin actions, 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.

What ships with it: 7 files

34.4 KB alongside SKILL.md

Keep looking

Skills are one crate of 327,132. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.