#cloud-config autoinstall: version: 1 # ── Locale & keyboard ────────────────────────── locale: en_IN.UTF-8 keyboard: layout: us # ── Network: keep installer boot simple; write final netplan ourselves ─ # Subiquity was repeatedly bringing the target system up without the default # route, even when the static gateway was supplied. Use DHCP only for the # installer environment, then write the final static netplan file directly # into the installed system in late-commands. network: network: version: 2 ethernets: any-en: dhcp4: true match: name: "en*" any-eth: dhcp4: true match: name: "eth*" # ── Storage: LVM using ALL disk space ───────── storage: layout: name: lvm match: size: largest # ── Identity ────────────────────────────────── identity: hostname: cezenai username: cezen # Password: cezen@123 password: "$6$I5VA.42G1xTeVhCv$KCLzqIKg/kbNHZyiTEMAY4FZsJMDDwoS90k6Ffb9VEwmcK.wuzlJNe3ceiEfLrzYzXEvqjYsLc7klAbeGPGab." # ── SSH ─────────────────────────────────────── ssh: install-server: true allow-pw: true # ── Base packages ───────────────────────────── packages: - git - curl - wget - python3 - whiptail - openssh-server # ── Late commands ───────────────────────────── late-commands: # Extend LVM to use 100% of available disk space - lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv || true - resize2fs /dev/ubuntu-vg/ubuntu-lv || true # Allow cezen passwordless sudo (needed for install.sh) - echo "cezen ALL=(ALL) NOPASSWD:ALL" > /target/etc/sudoers.d/cezen - chmod 440 /target/etc/sudoers.d/cezen # Replace the installer-generated network config with a simple DHCP target # config. The console wizard can later switch this to static if desired. - rm -f /target/etc/netplan/50-cloud-init.yaml /target/etc/netplan/00-installer-config.yaml || true - | cat > /target/etc/netplan/99-cezen-dhcp.yaml << 'EOF' network: version: 2 ethernets: any-en: dhcp4: true match: name: "en*" any-eth: dhcp4: true match: name: "eth*" EOF # Disable the installer media APT source so post-install apt uses network # mirrors instead of the custom ISO content. - sed -i 's/^deb cdrom:/# deb cdrom:/' /target/etc/apt/sources.list || true # Pull the Nexus One AI installer from cgit. The ISO intentionally does not # bundle the full package, keeping the image small and the installed code # current at deployment time. - mkdir -p /target/opt/aipackage - git clone https://cgit.cezentech.com/jinojose/aipackage.git /target/opt/aipackage # Deploy the console setup wizard - mkdir -p /target/opt/cezen - cp /target/opt/aipackage/autoinstall/firstboot-setup.sh /target/opt/cezen/firstboot-setup.sh - chmod +x /target/opt/cezen/firstboot-setup.sh # Set hostname to cezenai. mDNS is installed later by our own stack setup # instead of during Subiquity's package phase, which has been flaky. - echo "cezenai" > /target/etc/hostname - sed -i 's/aiserver/cezenai/g' /target/etc/hosts || true # Create cezen-setup console UI systemd service on tty1 - | cat > /target/etc/systemd/system/cezen-setup.service << 'EOF' [Unit] Description=Nexus One AI — Console Setup Wizard After=cloud-final.service cloud-init.target network-online.target Wants=cloud-init.target network-online.target ConditionPathExists=!/opt/cezen/.setup-done OnFailure=getty@tty1.service [Service] Type=oneshot WorkingDirectory=/opt/cezen ExecStartPre=-/bin/systemctl stop getty@tty1.service ExecStartPre=-/usr/bin/chvt 1 ExecStart=/bin/bash -lc 'clear >/dev/tty1 2>/dev/null || true; /usr/bin/openvt -c 1 -f -w -- env TERM=linux /opt/cezen/firstboot-setup.sh' ExecStartPost=-/bin/systemctl start getty@tty1.service StandardOutput=journal+console StandardError=journal+console Restart=no [Install] WantedBy=cloud-init.target EOF - curtin in-target -- systemctl enable ssh - curtin in-target -- systemctl enable cezen-setup.service # ── Skip confirmations ───────────────────────── user-data: disable_root: false