From 595ad16b63ced31ab15d4f6e8b7f8cdbff86cd77 Mon Sep 17 00:00:00 2001 From: Stanley-PH <272164670+Stanley-PH@users.noreply.github.com> Date: Fri, 29 May 2026 18:13:16 +0000 Subject: [PATCH] feat(deploy): add PXE controller role for multi-node netboot Port the pxe_controller Ansible role and pb-pxe-controller.yml playbook referenced by the Multi-AIPC PXE Netboot deployment guide. - Add the mount-local-disk.service.j2 / mount-local-disk.sh.j2 agent templates (with a .gitignore negation so the "*local*" rule does not drop them) that tasks/main.yml, chroot-setup.sh.j2 and k3s-auto-join.service depend on. - Keep all site-specific values operator-supplied: blank root password, empty SSH authorized_keys, and empty PXE/k3s server IPs, with a pre-flight assert that fails fast if the required IPs are unset or still placeholders. - Print accurate post-run next steps (no references to non-existent helper scripts) and frame the optional Cloudflare WARP module preload as out of scope for the base deployment. --- .gitignore | 3 + .../ansible/playbooks/pb-pxe-controller.yml | 93 ++++ .../roles/pxe_controller/defaults/main.yml | 138 +++++ .../files/r8125-9.016.01.tar.bz2 | Bin 0 -> 124146 bytes .../roles/pxe_controller/handlers/main.yml | 39 ++ .../roles/pxe_controller/tasks/main.yml | 525 ++++++++++++++++++ .../templates/chroot-setup.sh.j2 | 125 +++++ .../templates/dnsmasq-pxe.conf.j2 | 25 + .../pxe_controller/templates/grub.cfg.j2 | 11 + .../pxe_controller/templates/k3s-acl.conf.j2 | 4 + .../templates/k3s-auto-join.service.j2 | 13 + .../templates/k3s-auto-join.sh.j2 | 87 +++ .../templates/mount-local-disk.service.j2 | 12 + .../templates/mount-local-disk.sh.j2 | 25 + .../templates/pxelinux-default.cfg.j2 | 15 + .../templates/set-hostname.service.j2 | 12 + .../templates/set-hostname.sh.j2 | 7 + 17 files changed, 1134 insertions(+) create mode 100644 deploy/ansible/playbooks/pb-pxe-controller.yml create mode 100644 deploy/ansible/roles/pxe_controller/defaults/main.yml create mode 100644 deploy/ansible/roles/pxe_controller/files/r8125-9.016.01.tar.bz2 create mode 100644 deploy/ansible/roles/pxe_controller/handlers/main.yml create mode 100644 deploy/ansible/roles/pxe_controller/tasks/main.yml create mode 100644 deploy/ansible/roles/pxe_controller/templates/chroot-setup.sh.j2 create mode 100644 deploy/ansible/roles/pxe_controller/templates/dnsmasq-pxe.conf.j2 create mode 100644 deploy/ansible/roles/pxe_controller/templates/grub.cfg.j2 create mode 100644 deploy/ansible/roles/pxe_controller/templates/k3s-acl.conf.j2 create mode 100644 deploy/ansible/roles/pxe_controller/templates/k3s-auto-join.service.j2 create mode 100644 deploy/ansible/roles/pxe_controller/templates/k3s-auto-join.sh.j2 create mode 100644 deploy/ansible/roles/pxe_controller/templates/mount-local-disk.service.j2 create mode 100644 deploy/ansible/roles/pxe_controller/templates/mount-local-disk.sh.j2 create mode 100644 deploy/ansible/roles/pxe_controller/templates/pxelinux-default.cfg.j2 create mode 100644 deploy/ansible/roles/pxe_controller/templates/set-hostname.service.j2 create mode 100644 deploy/ansible/roles/pxe_controller/templates/set-hostname.sh.j2 diff --git a/.gitignore b/.gitignore index 0bb458a3..3b03455b 100644 --- a/.gitignore +++ b/.gitignore @@ -392,6 +392,9 @@ dockerfiles/Courses/DL/data/FashionMNIST/raw/ # Local config overrides (any file containing 'local') *local* *.local.* +# Exceptions: PXE agent disk-persistence templates would otherwise match *local* +!deploy/ansible/roles/pxe_controller/templates/mount-local-disk.service.j2 +!deploy/ansible/roles/pxe_controller/templates/mount-local-disk.sh.j2 # Offline bundle artifacts auplc-bundle-*/ diff --git a/deploy/ansible/playbooks/pb-pxe-controller.yml b/deploy/ansible/playbooks/pb-pxe-controller.yml new file mode 100644 index 00000000..78313de3 --- /dev/null +++ b/deploy/ansible/playbooks/pb-pxe-controller.yml @@ -0,0 +1,93 @@ +# Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +--- +- name: Setup PXE Controller for diskless k3s agent boot + hosts: pxe_controller + become: true + gather_facts: true + vars: + # ── config.env equivalent ────────────────────────────── + pxe_rootfs_force_rebuild: false + # Network + pxe_network_interface: "ens18" + pxe_subnet: "192.168.1.0/24" + pxe_gateway: "192.168.1.254" + pxe_dns_servers: "8.8.8.8,8.8.4.4" + + # PXE Controller -- REQUIRED: replace with your service host IP + pxe_controller_ip: "" + + # k3s Server Nodes -- REQUIRED: replace with your k3s server node IP(s) + pxe_k3s_server_ips: + - "" + + # Root password for PXE-booted machines (leave empty to disable password login) + # Use ansible-vault: ansible-vault encrypt_string 'MyPass' --name 'pxe_rootfs_password' + pxe_rootfs_password: "" + + # SSH keys for rootfs login (at least one required -- fill in before running). + # The playbook fails fast if this list is empty. + pxe_rootfs_authorized_keys: [] + # - "ssh-ed25519 AAAA... you@workstation" + # - "ssh-rsa AAAA... ci@runner" + + # APT Mirror + pxe_apt_mirror: "http://tw.archive.ubuntu.com/ubuntu" + + pxe_rootfs_packages: + - linux-image-6.14.0-1018-oem + - linux-headers-6.14.0-1018-oem + - initramfs-tools + - linux-firmware + - nfs-common + - overlayroot + - openssh-server + - curl + - net-tools + - iproute2 + - systemd-sysv + - sudo + - kmod + - pciutils + - e2fsprogs + - dkms + - build-essential + - libatomic1 + - libquadmath0 + + pxe_initramfs_modules: + - nfs + - nfsv3 + - overlay + - r8125 + - amdgpu + # See pxe_initramfs_modules notes in role defaults: the nft_reject + # modules must come from the initramfs because, on this NFS+overlayroot + # rootfs, modprobe at runtime fails with ESTALE on modules.dep.bin + # whenever the PXE controller has rebuilt the rootfs underneath a + # running node. Pre-loading from initramfs avoids that path entirely. + - nft_reject_inet + - nft_reject_ipv4 + - nft_reject_ipv6 + + pxe_k3s_data_dir: "/var/lib/rancher/k3s" + + roles: + - role: pxe_controller diff --git a/deploy/ansible/roles/pxe_controller/defaults/main.yml b/deploy/ansible/roles/pxe_controller/defaults/main.yml new file mode 100644 index 00000000..4fd657e0 --- /dev/null +++ b/deploy/ansible/roles/pxe_controller/defaults/main.yml @@ -0,0 +1,138 @@ +# Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +# Role defaults -- override these in the playbook vars: section. +# Maps 1:1 to config.env from the shell scripts. + +--- +# ============================================================ +# Network +# ============================================================ +pxe_network_interface: "ens18" +pxe_subnet: "192.168.1.0/24" +pxe_gateway: "192.168.1.254" +pxe_dns_servers: "8.8.8.8,8.8.4.4" + +# ============================================================ +# PXE Controller +# ============================================================ +# REQUIRED -- set to your PXE controller / service host IP in the playbook. +# Left empty on purpose so site addresses are not baked into the repo; +# the role asserts this is set before running. +pxe_controller_ip: "" + +# ============================================================ +# k3s Server Nodes +# ============================================================ +# REQUIRED -- set to your k3s server node IP(s) in the playbook. +# Left empty on purpose; the role asserts the list is non-empty. +pxe_k3s_server_ips: [] + +# ============================================================ +# Credentials +# ============================================================ + +# Root password for rootfs (optional -- leave empty to disable password login) +# Use ansible-vault to encrypt: ansible-vault encrypt_string 'MyPass' --name 'pxe_rootfs_password' +pxe_rootfs_password: "" + +# SSH public keys injected into rootfs /root/.ssh/authorized_keys. +# At least one key is REQUIRED (playbook will fail without it). +# pxe_rootfs_authorized_keys: +# - "ssh-ed25519 AAAA... you@workstation" +# - "ssh-rsa AAAA... ci@runner" +pxe_rootfs_authorized_keys: [] + +# ============================================================ +# APT Mirror +# ============================================================ +pxe_apt_mirror: "http://tw.archive.ubuntu.com/ubuntu" + +# ============================================================ +# Rootfs lifecycle +# ============================================================ +# Force delete + rebuild rootfs from scratch (debootstrap) +pxe_rootfs_force_rebuild: true +# Run apt-get upgrade inside rootfs during chroot setup +pxe_rootfs_upgrade: false + +# ============================================================ +# Paths +# ============================================================ +pxe_nfs_root: "/srv/nfs/rootfs" +pxe_tftp_root: "/srv/tftp" +pxe_web_root: "/var/www/html" + +# ============================================================ +# Rootfs build settings +# ============================================================ +pxe_ubuntu_codename: "noble" + +pxe_rootfs_packages: + - linux-image-6.14.0-1018-oem + - linux-headers-6.14.0-1018-oem + - initramfs-tools + - linux-firmware + - nfs-common + - overlayroot + - openssh-server + - curl + - net-tools + - iproute2 + - systemd-sysv + - sudo + - kmod + - pciutils + - e2fsprogs + - dkms + - build-essential + - libatomic1 + - libquadmath0 + +pxe_initramfs_modules: + - nfs + - nfsv3 + - overlay + - r8125 + - amdgpu + # nftables `reject` modules. Required by Cloudflare WARP firewall rules. + # Loaded from the initramfs (BEFORE pivot_root) so they end up resident in + # kernel memory before the overlayroot+NFS rootfs is mounted. This sidesteps + # an overlayfs failure mode where, after the PXE controller rebuilds the + # NFS rootfs, the overlay's cached inode of /lib/modules//modules.dep.bin + # becomes ESTALE and modprobe stops working entirely on running nodes. + - nft_reject_inet + - nft_reject_ipv4 + - nft_reject_ipv6 + +pxe_k3s_data_dir: "/var/lib/rancher/k3s" + +# ============================================================ +# Host packages (installed on the PXE controller itself) +# ============================================================ +pxe_host_packages: + - dnsmasq + - pxelinux + - syslinux-common + - apache2 + - nfs-kernel-server + - debootstrap + - qemu-guest-agent + - grub-efi-amd64-signed + - shim-signed diff --git a/deploy/ansible/roles/pxe_controller/files/r8125-9.016.01.tar.bz2 b/deploy/ansible/roles/pxe_controller/files/r8125-9.016.01.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..a5227097f47f9dae0bcb236cf7f12cad60fc4b48 GIT binary patch literal 124146 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

$<|ACHc{tQaXDL|n?1Cfp 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 0 + - "'<' not in (pxe_controller_ip | string)" + fail_msg: >- + pxe_controller_ip is not set. Set it to your PXE controller / service + host IP in the playbook vars (no value ships in the repo). + +- name: Assert k3s server node IPs are set + ansible.builtin.assert: + that: + - pxe_k3s_server_ips | default([]) | length > 0 + - pxe_k3s_server_ips | map('string') | select('match', '^<') | list | length == 0 + fail_msg: >- + pxe_k3s_server_ips is empty or still a placeholder. Set at least one + k3s server node IP in the playbook vars (no value ships in the repo). + +# ========================================================== +# 1. Install PXE controller host packages +# ========================================================== + +# - name: Install PXE controller packages +# ansible.builtin.apt: +# name: "{{ pxe_host_packages }}" +# state: present +# update_cache: true +# cache_valid_time: 3600 + +# ========================================================== +# 2. Build NFS rootfs with debootstrap +# ========================================================== + +- name: Stop NFS before rootfs rebuild + when: pxe_rootfs_force_rebuild | bool + ansible.builtin.systemd: + name: nfs-kernel-server + state: stopped + ignore_errors: true + +- name: Remove existing rootfs (force rebuild) + when: pxe_rootfs_force_rebuild | bool + ansible.builtin.shell: | + mountpoint -q {{ pxe_nfs_root }}/dev && umount {{ pxe_nfs_root }}/dev || true + mountpoint -q {{ pxe_nfs_root }}/sys && umount {{ pxe_nfs_root }}/sys || true + mountpoint -q {{ pxe_nfs_root }}/proc && umount {{ pxe_nfs_root }}/proc || true + rm -rf {{ pxe_nfs_root }} + changed_when: true + +- name: Check if NFS rootfs already exists + ansible.builtin.stat: + path: "{{ pxe_nfs_root }}/bin/bash" + register: _rootfs_exists + +- name: Build NFS rootfs + when: not _rootfs_exists.stat.exists + block: + - name: Create NFS root directory + ansible.builtin.file: + path: "{{ pxe_nfs_root }}" + state: directory + mode: "0755" + + - name: Run debootstrap to create base rootfs + ansible.builtin.command: + cmd: >- + debootstrap --arch=amd64 + {{ pxe_ubuntu_codename }} + {{ pxe_nfs_root }} + {{ pxe_apt_mirror }} + changed_when: true + +# ========================================================== +# 3. Deploy agent service files into rootfs +# ========================================================== + +- name: Create systemd directory in rootfs + ansible.builtin.file: + path: "{{ pxe_nfs_root }}/etc/systemd/system" + state: directory + mode: "0755" + +- name: Create bin directory in rootfs + ansible.builtin.file: + path: "{{ pxe_nfs_root }}/usr/local/bin" + state: directory + mode: "0755" + +- name: Deploy set-hostname service unit + ansible.builtin.template: + src: set-hostname.service.j2 + dest: "{{ pxe_nfs_root }}/etc/systemd/system/set-hostname.service" + mode: "0644" + +- name: Deploy set-hostname script + ansible.builtin.template: + src: set-hostname.sh.j2 + dest: "{{ pxe_nfs_root }}/usr/local/bin/set-hostname.sh" + mode: "0755" + +- name: Deploy k3s-auto-join service unit + ansible.builtin.template: + src: k3s-auto-join.service.j2 + dest: "{{ pxe_nfs_root }}/etc/systemd/system/k3s-auto-join.service" + mode: "0644" + +- name: Deploy k3s-auto-join script + ansible.builtin.template: + src: k3s-auto-join.sh.j2 + dest: "{{ pxe_nfs_root }}/usr/local/bin/k3s-auto-join.sh" + mode: "0755" + +- name: Deploy mount-local-disk service unit + ansible.builtin.template: + src: mount-local-disk.service.j2 + dest: "{{ pxe_nfs_root }}/etc/systemd/system/mount-local-disk.service" + mode: "0644" + +- name: Deploy mount-local-disk script + ansible.builtin.template: + src: mount-local-disk.sh.j2 + dest: "{{ pxe_nfs_root }}/usr/local/bin/mount-local-disk.sh" + mode: "0755" + +- name: Copy r8125 driver source tarball into rootfs + ansible.builtin.copy: + src: r8125-9.016.01.tar.bz2 + dest: "{{ pxe_nfs_root }}/tmp/r8125-9.016.01.tar.bz2" + mode: "0644" + +# ========================================================== +# 4. Configure initramfs modules in rootfs +# ========================================================== + +- name: Ensure initramfs modules directory exists + ansible.builtin.file: + path: "{{ pxe_nfs_root }}/etc/initramfs-tools" + state: directory + mode: "0755" + +- name: Add required modules to initramfs + ansible.builtin.lineinfile: + path: "{{ pxe_nfs_root }}/etc/initramfs-tools/modules" + line: "{{ item }}" + create: true + mode: "0644" + loop: "{{ pxe_initramfs_modules }}" + +# Eagerly load the nftables `reject` modules at boot. +# +# These modules are only needed if you later add an optional Cloudflare WARP +# egress proxy, which is OUT OF SCOPE for this base deployment (see the +# "Out Of Scope" section of the Multi-AIPC PXE deployment guide). WARP installs +# nftables rules using `ip protocol tcp reject with tcp reset`, provided by +# nft_reject_inet plus nf_reject_ipv4/ipv6. The .ko files already ship with +# linux-modules-, but on this overlayroot+tmpfs PXE rootfs udev +# demand-loading does not reliably fire, so we list them in modules-load.d for +# systemd-modules-load.service to load eagerly. Pre-loading is harmless when +# WARP is not used. modprobe pulls in nf_tables/nft_reject transitively, so +# listing the leaves is sufficient. +# +# This is deliberately written as a host-side task (not inside the chroot +# script) so it cannot perturb the r8125 DKMS build, which has shown to be +# sensitive to seemingly unrelated changes in the chroot environment. +- name: Ensure modules-load.d directory exists in rootfs + ansible.builtin.file: + path: "{{ pxe_nfs_root }}/etc/modules-load.d" + state: directory + mode: "0755" + +- name: Eagerly load nftables reject modules at boot (optional Cloudflare WARP egress) + ansible.builtin.copy: + dest: "{{ pxe_nfs_root }}/etc/modules-load.d/nf-reject.conf" + content: | + # Only needed by the optional Cloudflare WARP egress proxy, which is out + # of scope for the base deployment. Harmless to pre-load otherwise. + nft_reject_inet + nft_reject_ipv4 + nft_reject_ipv6 + mode: "0644" + +# ========================================================== +# 5. Run chroot setup (apt install, systemctl enable, initramfs) +# ========================================================== + +- name: Deploy chroot setup script + ansible.builtin.template: + src: chroot-setup.sh.j2 + dest: "{{ pxe_nfs_root }}/tmp/chroot-setup.sh" + mode: "0755" + +- name: Execute chroot setup + block: + - name: Mount virtual filesystems for chroot + ansible.builtin.shell: | + mountpoint -q {{ pxe_nfs_root }}/proc || mount --bind /proc {{ pxe_nfs_root }}/proc + mountpoint -q {{ pxe_nfs_root }}/sys || mount --bind /sys {{ pxe_nfs_root }}/sys + mountpoint -q {{ pxe_nfs_root }}/dev || mount --bind /dev {{ pxe_nfs_root }}/dev + changed_when: true + + - name: Run chroot setup script + ansible.builtin.command: + cmd: "chroot {{ pxe_nfs_root }} /tmp/chroot-setup.sh" + changed_when: true + register: _chroot_result + + always: + - name: Unmount virtual filesystems from chroot + ansible.builtin.shell: | + mountpoint -q {{ pxe_nfs_root }}/dev && umount {{ pxe_nfs_root }}/dev || true + mountpoint -q {{ pxe_nfs_root }}/sys && umount {{ pxe_nfs_root }}/sys || true + mountpoint -q {{ pxe_nfs_root }}/proc && umount {{ pxe_nfs_root }}/proc || true + changed_when: true + +- name: Remove chroot setup script + ansible.builtin.file: + path: "{{ pxe_nfs_root }}/tmp/chroot-setup.sh" + state: absent + +# ========================================================== +# 6. Copy kernel and initrd to TFTP +# ========================================================== + +- name: Find latest kernel in rootfs + ansible.builtin.shell: | + ls {{ pxe_nfs_root }}/boot/vmlinuz-* | sort -V | tail -1 | sed 's|.*/vmlinuz-||' + register: _kver + changed_when: false + +- name: Set kernel version fact + ansible.builtin.set_fact: + pxe_kernel_version: "{{ _kver.stdout }}" + +- name: Create TFTP directory structure + ansible.builtin.file: + path: "{{ item }}" + state: directory + mode: "0755" + loop: + - "{{ pxe_tftp_root }}" + - "{{ pxe_tftp_root }}/pxelinux.cfg" + - "{{ pxe_tftp_root }}/grub" + +- name: Copy kernel to TFTP root + ansible.builtin.copy: + src: "{{ pxe_nfs_root }}/boot/vmlinuz-{{ pxe_kernel_version }}" + dest: "{{ pxe_tftp_root }}/vmlinuz" + remote_src: true + mode: "0644" + +- name: Copy initrd to TFTP root + ansible.builtin.copy: + src: "{{ pxe_nfs_root }}/boot/initrd.img-{{ pxe_kernel_version }}" + dest: "{{ pxe_tftp_root }}/initrd.img" + remote_src: true + mode: "0644" + +- name: Copy pxelinux.0 bootloader + ansible.builtin.copy: + src: /usr/lib/PXELINUX/pxelinux.0 + dest: "{{ pxe_tftp_root }}/pxelinux.0" + remote_src: true + mode: "0644" + +- name: Copy syslinux menu modules + ansible.builtin.shell: | + cp /usr/lib/syslinux/modules/bios/ldlinux.c32 {{ pxe_tftp_root }}/ + cp /usr/lib/syslinux/modules/bios/menu.c32 {{ pxe_tftp_root }}/ + cp /usr/lib/syslinux/modules/bios/libutil.c32 {{ pxe_tftp_root }}/ + cp /usr/lib/syslinux/modules/bios/libcom32.c32 {{ pxe_tftp_root }}/ + changed_when: true + +- name: Copy GRUB EFI signed binary to TFTP root + ansible.builtin.copy: + src: /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed + dest: "{{ pxe_tftp_root }}/grubnetx64.efi" + remote_src: true + mode: "0644" + +# ========================================================== +# 7. Create PXE boot menus +# ========================================================== + +- name: Deploy BIOS PXE boot menu + ansible.builtin.template: + src: pxelinux-default.cfg.j2 + dest: "{{ pxe_tftp_root }}/pxelinux.cfg/default" + mode: "0644" + +- name: Deploy UEFI GRUB boot menu + ansible.builtin.template: + src: grub.cfg.j2 + dest: "{{ pxe_tftp_root }}/grub/grub.cfg" + mode: "0644" + +# ========================================================== +# 8. Configure NFS server +# ========================================================== + +- name: Add NFS export for rootfs + ansible.builtin.lineinfile: + path: /etc/exports + line: "{{ pxe_nfs_root }} {{ pxe_subnet }}(ro,sync,no_subtree_check,no_root_squash)" + regexp: "^{{ pxe_nfs_root | regex_escape }}\\s" + create: true + mode: "0644" + +- name: Re-export and restart NFS server + ansible.builtin.shell: | + exportfs -ra + systemctl restart nfs-kernel-server + changed_when: true + +- name: Enable NFS server + ansible.builtin.systemd: + name: nfs-kernel-server + enabled: true + +- name: Wait for NFS server to be ready + ansible.builtin.command: showmount -e localhost + register: _nfs_ready + retries: 5 + delay: 2 + until: _nfs_ready.rc == 0 + changed_when: false + +- name: Flush handlers for NFS + ansible.builtin.meta: flush_handlers + +- name: Verify NFS exports + ansible.builtin.command: showmount -e localhost + register: _nfs_exports + changed_when: false + +- name: Display NFS exports + ansible.builtin.debug: + var: _nfs_exports.stdout_lines + +# ========================================================== +# 9. Configure dnsmasq (Proxy DHCP + TFTP) +# ========================================================== + +- name: Deploy dnsmasq PXE configuration + ansible.builtin.template: + src: dnsmasq-pxe.conf.j2 + dest: /etc/dnsmasq.d/pxe.conf + mode: "0644" + notify: Restart dnsmasq + +- name: Enable and start dnsmasq + ansible.builtin.systemd: + name: dnsmasq + state: started + enabled: true + +- name: Flush handlers for dnsmasq + ansible.builtin.meta: flush_handlers + +- name: Verify TFTP boot files + ansible.builtin.stat: + path: "{{ pxe_tftp_root }}/{{ item }}" + loop: + - pxelinux.0 + - grubnetx64.efi + - vmlinuz + - initrd.img + - grub/grub.cfg + register: _tftp_files + +- name: Report TFTP boot file status + ansible.builtin.debug: + msg: "{{ item.item }}: {{ 'OK' if item.stat.exists else 'MISSING' }}" + loop: "{{ _tftp_files.results }}" + loop_control: + label: "{{ item.item }}" + +# ========================================================== +# 10. Inject SSH authorized keys into rootfs +# ========================================================== + +- name: Fail if no SSH keys provided + ansible.builtin.assert: + that: pxe_rootfs_authorized_keys | default([]) | length > 0 + fail_msg: "pxe_rootfs_authorized_keys is empty -- at least one SSH public key is required" + +- name: Create .ssh directory in rootfs + ansible.builtin.file: + path: "{{ pxe_nfs_root }}/root/.ssh" + state: directory + mode: "0700" + +- name: Inject authorized keys into rootfs + ansible.builtin.copy: + content: "{{ pxe_rootfs_authorized_keys | join('\n') }}\n" + dest: "{{ pxe_nfs_root }}/root/.ssh/authorized_keys" + mode: "0600" + +# ========================================================== +# 11. Prepare HTTP directory for k3s tokens +# ========================================================== + +- name: Create k3s token directory + ansible.builtin.file: + path: "{{ pxe_web_root }}/k3s" + state: directory + mode: "0755" + +- name: Deploy Apache ACL for k3s tokens + ansible.builtin.template: + src: k3s-acl.conf.j2 + dest: /etc/apache2/conf-available/k3s-acl.conf + mode: "0644" + notify: Restart apache2 + +- name: Enable k3s-acl Apache configuration + ansible.builtin.command: + cmd: a2enconf k3s-acl + register: _a2enconf + changed_when: "'Enabling' in _a2enconf.stdout" + notify: Restart apache2 + +- name: Enable and start Apache + ansible.builtin.systemd: + name: apache2 + state: started + enabled: true + +# ========================================================== +# 12. Verify PXE server status +# ========================================================== + +- name: Collect service status + ansible.builtin.service_facts: + +- name: Check critical services are active + ansible.builtin.assert: + that: + - ansible_facts.services[item + '.service'] is defined + - ansible_facts.services[item + '.service'].state in ['running', 'exited'] + - ansible_facts.services[item + '.service'].status == 'enabled' + fail_msg: "{{ item }} is NOT active (state: {{ ansible_facts.services[item + '.service'].state | default('unknown') }})" + success_msg: "{{ item }} is active ({{ ansible_facts.services[item + '.service'].state }})" + quiet: true + loop: + - dnsmasq + - apache2 + +- name: Check NFS export is active + ansible.builtin.command: showmount -e localhost + register: _verify_nfs + changed_when: false + +- name: Verify rootfs is exported + ansible.builtin.assert: + that: "pxe_nfs_root in _verify_nfs.stdout" + fail_msg: "NFS export for {{ pxe_nfs_root }} not found" + success_msg: "NFS export OK: {{ pxe_nfs_root }}" + +- name: Check TFTP boot files exist + ansible.builtin.stat: + path: "{{ pxe_tftp_root }}/{{ item }}" + loop: + - pxelinux.0 + - grubnetx64.efi + - vmlinuz + - initrd.img + - grub/grub.cfg + - pxelinux.cfg/default + register: _verify_tftp + +- name: Verify no TFTP files are missing + ansible.builtin.assert: + that: item.stat.exists + fail_msg: "MISSING: {{ item.item }}" + success_msg: "OK: {{ item.item }} ({{ item.stat.size | default(0) }} bytes)" + loop: "{{ _verify_tftp.results }}" + loop_control: + label: "{{ item.item }}" + +- name: Check HTTP token endpoint is reachable + ansible.builtin.uri: + url: "http://127.0.0.1/k3s/" + status_code: [200, 403] + register: _verify_http + +- name: Print PXE server summary + ansible.builtin.debug: + msg: | + ══════════════════════════════════════════ + PXE Controller ready on {{ pxe_controller_ip }} + ══════════════════════════════════════════ + dnsmasq : Proxy DHCP + TFTP on {{ pxe_network_interface }} + NFS : {{ pxe_nfs_root }} → {{ pxe_subnet }} + Apache : http://{{ pxe_controller_ip }}/k3s/ + Kernel : {{ pxe_kernel_version | default('unknown') }} + ────────────────────────────────────────── + Next steps (see the Multi-AIPC PXE deployment guide): + 1. Install the K3s server and configure kubectl + 2. Publish the K3s token + kubeconfig under {{ pxe_web_root }}/k3s/ + 3. Netboot the agents; they auto-join via k3s-auto-join.service + ══════════════════════════════════════════ diff --git a/deploy/ansible/roles/pxe_controller/templates/chroot-setup.sh.j2 b/deploy/ansible/roles/pxe_controller/templates/chroot-setup.sh.j2 new file mode 100644 index 00000000..b5900615 --- /dev/null +++ b/deploy/ansible/roles/pxe_controller/templates/chroot-setup.sh.j2 @@ -0,0 +1,125 @@ +#!/bin/bash +set -euo pipefail + +# -- Remove debootstrap legacy sources.list to avoid duplicates -- +rm -f /etc/apt/sources.list + +# -- APT sources (DEB822 format) -- +cat > /etc/apt/sources.list.d/ubuntu.sources << 'APT_EOF' +Types: deb +URIs: {{ pxe_apt_mirror }} +Suites: {{ pxe_ubuntu_codename }} {{ pxe_ubuntu_codename }}-updates {{ pxe_ubuntu_codename }}-security +Components: main restricted universe multiverse +Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg +APT_EOF + +# -- DNS (needed for apt and runtime) -- +cat > /etc/resolv.conf << 'DNS_EOF' +{% for ns in pxe_dns_servers.split(',') %} +nameserver {{ ns | trim }} +{% endfor %} +DNS_EOF + +# -- Install packages -- +export DEBIAN_FRONTEND=noninteractive +apt-get update +apt-get install -y --no-install-recommends \ +{% for pkg in pxe_rootfs_packages %} + {{ pkg }}{{ '' if loop.last else ' \\' }} +{% endfor %} + +{% if pxe_rootfs_upgrade | default(false) | bool %} +apt-get dist-upgrade -y +{% endif %} + +apt-get clean +rm -rf /var/lib/apt/lists/* + +# -- Root credentials -- +{% if pxe_rootfs_password | default('') | length > 0 %} +echo "root:{{ pxe_rootfs_password }}" | chpasswd +{% else %} +passwd -l root +{% endif %} + +# -- Allow root SSH login -- +mkdir -p /etc/ssh/sshd_config.d +{% if pxe_rootfs_password | default('') | length > 0 %} +echo "PermitRootLogin yes" > /etc/ssh/sshd_config.d/allow-root.conf +{% else %} +echo "PermitRootLogin prohibit-password" > /etc/ssh/sshd_config.d/allow-root.conf +{% endif %} + +# -- RTL8125 2.5GbE driver (build from vendor source) -- +KVER=$(ls /lib/modules/) +apt-get remove -y r8125-dkms 2>/dev/null || true +dkms remove r8125/9.016.01 --all 2>/dev/null || true +rm -rf /usr/src/r8125-9.016.01 +tar xjf /tmp/r8125-9.016.01.tar.bz2 -C /usr/src/ +cat > /usr/src/r8125-9.016.01/dkms.conf << 'DKMSEOF' +PACKAGE_NAME="r8125" +PACKAGE_VERSION="9.016.01" +BUILT_MODULE_NAME[0]="r8125" +BUILT_MODULE_LOCATION[0]="src/" +DEST_MODULE_LOCATION[0]="/kernel/drivers/net/ethernet/realtek/" +AUTOINSTALL="yes" +MAKE="'make' -j$(nproc) -C src/ KERNELDIR=/lib/modules/${kernelver}/build" +CLEAN="'make' -C src/ clean" +DKMSEOF +dkms add -m r8125 -v 9.016.01 +dkms build -m r8125 -v 9.016.01 -k "$KVER" +dkms install -m r8125 -v 9.016.01 -k "$KVER" +dkms status +rm -f /tmp/r8125-9.016.01.tar.bz2 + +# -- Blacklist r8169 so the DKMS r8125 driver claims RTL8125 devices -- +echo "blacklist r8169" > /etc/modprobe.d/blacklist-r8169.conf + +# -- dhcpcd: longer timeout for 2.5GbE link negotiation + switch STP -- +cat > /etc/dhcpcd.conf << 'DHCPCD_EOF' +timeout 60 +reboot 5 +noarp +DHCPCD_EOF + +cat > /etc/initramfs-tools/hooks/pxe-net-tweaks << 'HOOK' +#!/bin/sh +PREREQ="" +prereqs() { echo "$PREREQ"; } +case "$1" in prereqs) prereqs; exit 0;; esac +. /usr/share/initramfs-tools/hook-functions +mkdir -p "${DESTDIR}/etc/modprobe.d" +cp /etc/modprobe.d/blacklist-r8169.conf "${DESTDIR}/etc/modprobe.d/" +mkdir -p "${DESTDIR}/etc" +cp /etc/dhcpcd.conf "${DESTDIR}/etc/dhcpcd.conf" +HOOK +chmod +x /etc/initramfs-tools/hooks/pxe-net-tweaks + +# -- GPU udev rules (let containers access AMD GPUs) -- +tee /etc/udev/rules.d/70-amdgpu.rules << RULES +KERNEL=="kfd", MODE="0666" +KERNEL=="renderD[0-9]*", MODE="0666" +RULES + +# -- Disable systemd-networkd (kernel ip=dhcp handles NFS root networking) -- +rm -f /etc/netplan/*.yaml +systemctl disable systemd-networkd 2>/dev/null || true +systemctl disable systemd-networkd-wait-online 2>/dev/null || true +echo "nameserver 8.8.8.8" > /etc/resolv.conf + +# -- overlayroot: make rootfs read-only with tmpfs writable layer -- +echo 'overlayroot="tmpfs:swap=1"' > /etc/overlayroot.conf + +# -- Clear hostname inherited from PXE controller build host -- +echo "localhost" > /etc/hostname + +# -- Install k3s agent binary (skip start, skip enable) -- +curl -sfL https://get.k3s.io | INSTALL_K3S_SKIP_START=true INSTALL_K3S_SKIP_ENABLE=true sh -s - agent + +# -- Enable boot-time services -- +systemctl enable set-hostname.service +systemctl enable k3s-auto-join.service +systemctl enable mount-local-disk.service + +# -- Rebuild initramfs with NFS/overlay/driver modules -- +update-initramfs -u diff --git a/deploy/ansible/roles/pxe_controller/templates/dnsmasq-pxe.conf.j2 b/deploy/ansible/roles/pxe_controller/templates/dnsmasq-pxe.conf.j2 new file mode 100644 index 00000000..e266ebb1 --- /dev/null +++ b/deploy/ansible/roles/pxe_controller/templates/dnsmasq-pxe.conf.j2 @@ -0,0 +1,25 @@ +port=0 + +interface={{ pxe_network_interface }} +bind-interfaces + +dhcp-range={{ pxe_subnet | regex_replace('/.*', '') }},proxy + +# UEFI client detection (client-arch: 6=IA32, 7=BC/EFI, 9=x86-64) +dhcp-match=set:efi-x86_64,option:client-arch,6 +dhcp-match=set:efi-x86_64,option:client-arch,7 +dhcp-match=set:efi-x86_64,option:client-arch,9 + +dhcp-boot=tag:efi-x86_64,grubnetx64.efi,,{{ pxe_controller_ip }} +dhcp-boot=tag:!efi-x86_64,pxelinux.0,,{{ pxe_controller_ip }} + +pxe-service=x86PC,"Diskless Boot",pxelinux +pxe-service=IA32_EFI,"Diskless Boot",grubnetx64.efi +pxe-service=BC_EFI,"Diskless Boot",grubnetx64.efi +pxe-service=x86-64_EFI,"Diskless Boot",grubnetx64.efi + +enable-tftp +tftp-root={{ pxe_tftp_root }} + +log-dhcp +log-queries diff --git a/deploy/ansible/roles/pxe_controller/templates/grub.cfg.j2 b/deploy/ansible/roles/pxe_controller/templates/grub.cfg.j2 new file mode 100644 index 00000000..2f9d618d --- /dev/null +++ b/deploy/ansible/roles/pxe_controller/templates/grub.cfg.j2 @@ -0,0 +1,11 @@ +set default=0 +set timeout=5 + +menuentry "Diskless Boot (NFS root + overlayfs)" { + linux vmlinuz root=/dev/nfs nfsroot={{ pxe_controller_ip }}:{{ pxe_nfs_root }},ro,vers=3 ip=dhcp rootdelay=10 rw udev.event_timeout=10 + initrd initrd.img +} + +menuentry "Boot from local disk" { + exit +} diff --git a/deploy/ansible/roles/pxe_controller/templates/k3s-acl.conf.j2 b/deploy/ansible/roles/pxe_controller/templates/k3s-acl.conf.j2 new file mode 100644 index 00000000..d46d88a2 --- /dev/null +++ b/deploy/ansible/roles/pxe_controller/templates/k3s-acl.conf.j2 @@ -0,0 +1,4 @@ + + Require ip {{ pxe_subnet }} + Require ip 127.0.0.1 + diff --git a/deploy/ansible/roles/pxe_controller/templates/k3s-auto-join.service.j2 b/deploy/ansible/roles/pxe_controller/templates/k3s-auto-join.service.j2 new file mode 100644 index 00000000..60475c3f --- /dev/null +++ b/deploy/ansible/roles/pxe_controller/templates/k3s-auto-join.service.j2 @@ -0,0 +1,13 @@ +[Unit] +Description=Auto-join k3s cluster +After=network-online.target set-hostname.service mount-local-disk.service +Wants=network-online.target +Requires=set-hostname.service + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/k3s-auto-join.sh +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/deploy/ansible/roles/pxe_controller/templates/k3s-auto-join.sh.j2 b/deploy/ansible/roles/pxe_controller/templates/k3s-auto-join.sh.j2 new file mode 100644 index 00000000..64f4c8a2 --- /dev/null +++ b/deploy/ansible/roles/pxe_controller/templates/k3s-auto-join.sh.j2 @@ -0,0 +1,87 @@ +#!/bin/bash +set -euo pipefail + +PXE_SERVER="{{ pxe_controller_ip }}" +K3S_SERVERS="{{ pxe_k3s_server_ips | join(' ') }}" +TOKEN_URL="http://${PXE_SERVER}/k3s/token" +KUBECONFIG_URL="http://${PXE_SERVER}/k3s/kubeconfig" +K3S_DATA="{{ pxe_k3s_data_dir }}" + +HOSTNAME=$(hostname) +NEED_JOIN=true + +find_active_server() { + for srv in $K3S_SERVERS; do + if curl -sf --connect-timeout 3 -k "https://${srv}:6443/ping" &>/dev/null; then + echo "$srv" + return + fi + done + echo "$K3S_SERVERS" | awk '{print $1}' +} + +node_exists_in_cluster() { + local kc="/tmp/admin-kubeconfig" + curl -sf "$KUBECONFIG_URL" -o "$kc" 2>/dev/null || return 1 + k3s kubectl --kubeconfig="$kc" get node "$HOSTNAME" &>/dev/null + local rc=$? + rm -f "$kc" + return $rc +} + +# ── Persist node password on SSD (volatile rootfs loses /etc on reboot) ── +NODE_PWD_PERSIST="${K3S_DATA}/node-password" +mkdir -p "$(dirname "$NODE_PWD_PERSIST")" +mkdir -p /etc/rancher/node +if [ -f "$NODE_PWD_PERSIST" ]; then + cp "$NODE_PWD_PERSIST" /etc/rancher/node/password + chmod 600 /etc/rancher/node/password + echo "Restored node password from SSD" +fi + +# ── Check if this node already exists in the cluster ── +if node_exists_in_cluster; then + echo "Node ${HOSTNAME} already exists in cluster, skipping join." + NEED_JOIN=false +else + echo "Node ${HOSTNAME} not found in cluster, will join." +fi + +# ── Always fetch token and write config (volatile rootfs loses /etc on reboot) ── + +TOKEN="" +for i in $(seq 1 30); do + TOKEN=$(curl -sf "$TOKEN_URL" 2>/dev/null) || true + [ -n "$TOKEN" ] && break + echo "Waiting for k3s token... ($i/30)" + sleep 5 +done +[ -z "$TOKEN" ] && { echo "ERROR: Failed to get k3s token after 30 attempts"; exit 1; } + +K3S_SERVER=$(find_active_server) + +mkdir -p /etc/rancher/k3s +cat > /etc/rancher/k3s/config.yaml << CONF +server: https://${K3S_SERVER}:6443 +token: ${TOKEN} +CONF + +# ── Only clean agent state when actually joining as a new node ── +if [ "$NEED_JOIN" = true ]; then + if [ -d "$K3S_DATA/agent/etc" ]; then + echo "Cleaning old agent state (keeping containerd cache)" + rm -rf "$K3S_DATA/agent/etc" "$K3S_DATA/agent/client-"* \ + "$K3S_DATA/agent/server-"* "$K3S_DATA/agent/"*.kubeconfig 2>/dev/null || true + fi + rm -f "$NODE_PWD_PERSIST" + echo "Joining k3s server: ${K3S_SERVER}" +fi + +systemctl enable --now k3s-agent + +# ── After agent starts, persist the node password for next boot ── +if [ ! -f "$NODE_PWD_PERSIST" ] && [ -f /etc/rancher/node/password ]; then + cp /etc/rancher/node/password "$NODE_PWD_PERSIST" + chmod 600 "$NODE_PWD_PERSIST" + echo "Saved node password to SSD" +fi diff --git a/deploy/ansible/roles/pxe_controller/templates/mount-local-disk.service.j2 b/deploy/ansible/roles/pxe_controller/templates/mount-local-disk.service.j2 new file mode 100644 index 00000000..dd5bb976 --- /dev/null +++ b/deploy/ansible/roles/pxe_controller/templates/mount-local-disk.service.j2 @@ -0,0 +1,12 @@ +[Unit] +Description=Mount local disk for k3s container image cache +Before=k3s-auto-join.service +After=local-fs.target + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/mount-local-disk.sh +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/deploy/ansible/roles/pxe_controller/templates/mount-local-disk.sh.j2 b/deploy/ansible/roles/pxe_controller/templates/mount-local-disk.sh.j2 new file mode 100644 index 00000000..15f104ba --- /dev/null +++ b/deploy/ansible/roles/pxe_controller/templates/mount-local-disk.sh.j2 @@ -0,0 +1,25 @@ +#!/bin/bash +set -euo pipefail + +K3S_DATA="{{ pxe_k3s_data_dir }}" + +DISK="" +for dev in /dev/sda /dev/vda /dev/nvme0n1; do + [ -b "$dev" ] && { DISK="$dev"; break; } +done + +if [ -z "$DISK" ]; then + echo "No local disk found, using tmpfs for k3s data" + mkdir -p "$K3S_DATA" + mount -t tmpfs -o size=4G tmpfs "$K3S_DATA" + exit 0 +fi + +if ! blkid "$DISK" | grep -q 'TYPE="ext4"'; then + echo "Formatting $DISK as ext4" + mkfs.ext4 -F -L k3s-cache "$DISK" +fi + +mkdir -p "$K3S_DATA" +mount "$DISK" "$K3S_DATA" +echo "Mounted $DISK to $K3S_DATA" diff --git a/deploy/ansible/roles/pxe_controller/templates/pxelinux-default.cfg.j2 b/deploy/ansible/roles/pxe_controller/templates/pxelinux-default.cfg.j2 new file mode 100644 index 00000000..ad8f250d --- /dev/null +++ b/deploy/ansible/roles/pxe_controller/templates/pxelinux-default.cfg.j2 @@ -0,0 +1,15 @@ +DEFAULT menu.c32 +PROMPT 0 +TIMEOUT 50 +MENU TITLE K3s Cluster - Diskless PXE Boot + +LABEL diskless + MENU LABEL Diskless Boot (NFS root + overlayfs) + MENU DEFAULT + KERNEL vmlinuz + INITRD initrd.img + APPEND root=/dev/nfs nfsroot={{ pxe_controller_ip }}:{{ pxe_nfs_root }},ro,vers=3 ip=dhcp rootdelay=10 rw udev.event_timeout=10 + +LABEL local + MENU LABEL Boot from local disk + LOCALBOOT 0 diff --git a/deploy/ansible/roles/pxe_controller/templates/set-hostname.service.j2 b/deploy/ansible/roles/pxe_controller/templates/set-hostname.service.j2 new file mode 100644 index 00000000..09be5c14 --- /dev/null +++ b/deploy/ansible/roles/pxe_controller/templates/set-hostname.service.j2 @@ -0,0 +1,12 @@ +[Unit] +Description=Set hostname based on MAC address +After=network-online.target +Wants=network-online.target + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/set-hostname.sh +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/deploy/ansible/roles/pxe_controller/templates/set-hostname.sh.j2 b/deploy/ansible/roles/pxe_controller/templates/set-hostname.sh.j2 new file mode 100644 index 00000000..0a86f348 --- /dev/null +++ b/deploy/ansible/roles/pxe_controller/templates/set-hostname.sh.j2 @@ -0,0 +1,7 @@ +#!/bin/bash +IFACE=$(ip route show default 2>/dev/null | awk '/default/ {print $5}' | head -1) +if [ -z "$IFACE" ]; then + IFACE=$(ls /sys/class/net/ | grep -v lo | head -1) +fi +MAC=$(cat /sys/class/net/$IFACE/address | tr ':' '-') +hostnamectl set-hostname "agent-${MAC}"