feat(ip-pool): add guest-side static-IP boot scripts

template/guest-setup/linux/ci-report-ip.sh
  Updated version: checks guestinfo.ip-assignment first (static path),
  falls back to DHCP detection if absent.  Applies static IP before
  network-online.target so SSH starts on the correct address immediately.

template/guest-setup/linux/ci-report-ip.service
  Drops 'network.target' from After= — runs before network is up so the
  static IP is configured before SSH/other services start.

template/guest-setup/windows/ci-static-ip.ps1
  Reads guestinfo.ip-assignment via vmware-rpctool at system startup (SYSTEM
  account Task Scheduler task).  Disables DHCP, applies static IP+gateway,
  reports back via guestinfo.ci-ip.  No-op when ip-assignment is absent.

template/Install-CIToolchain-Linux2404.sh
  Step 7b now copies scripts from guest-setup/linux/ instead of embedding
  the old DHCP-only inline script.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-24 00:27:10 +02:00
parent 927d6927fd
commit 1bc3ec601c
4 changed files with 213 additions and 44 deletions
+9 -44
View File
@@ -170,51 +170,16 @@ sudo netplan generate
assert_step "99-ci-dhcp-allnics.yaml exists" test -f /etc/netplan/99-ci-dhcp-allnics.yaml
# --- Step 7b: CI IP reporter via VMware guestinfo ---
# The host reads the guest IP via `vmrun readVariable guestVar ci-ip`.
# IMPORTANT: vmware-rpctool sets 'guestinfo.ci-ip' but vmrun reads it as just
# 'ci-ip' under the guestVar namespace (the 'guestinfo.' prefix is implicit).
# This is the official VMware VMCI channel — works even when TCP/IP is not yet
# fully initialised on the host. Used as primary; getGuestIPAddress is fallback.
# Supports two modes:
# Static (ip_pool): reads guestinfo.ip-assignment injected by the host
# orchestrator, applies static NIC config, reports back.
# DHCP fallback: waits for DHCP address, reports via guestinfo.ci-ip.
# The script and service are sourced from template/guest-setup/linux/.
echo ""
echo "=== Step 7b: CI IP reporter ==="
sudo tee /usr/local/bin/ci-report-ip.sh > /dev/null << 'EOSCRIPT'
#!/bin/bash
# Writes the VM's primary IPv4 to VMware guestinfo.ci-ip on every boot.
# Called by ci-report-ip.service.
# Retries for up to 60s to tolerate open-vm-tools re-init after UUID change
# (linked clones get a new UUID — vmware-rpctool may fail briefly on first boot).
for i in $(seq 1 30); do
IP=$(ip -4 route get 1.0.0.0 2>/dev/null \
| awk '{for(i=1;i<=NF;i++) if($i=="src") print $(i+1)}' \
| head -1)
if [ -n "$IP" ]; then
if /usr/bin/vmware-rpctool "info-set guestinfo.ci-ip $IP" 2>/dev/null; then
echo "ci-report-ip: set guestinfo.ci-ip=$IP (attempt $i)" | systemd-cat -t ci-report-ip
exit 0
fi
fi
sleep 2
done
echo "ci-report-ip: failed to set guestinfo.ci-ip after 30 attempts" | systemd-cat -t ci-report-ip
exit 1
EOSCRIPT
echo "=== Step 7b: CI IP reporter (with static IP support) ==="
sudo cp "$(dirname "$0")/guest-setup/linux/ci-report-ip.sh" /usr/local/bin/ci-report-ip.sh
sudo chmod +x /usr/local/bin/ci-report-ip.sh
sudo tee /etc/systemd/system/ci-report-ip.service > /dev/null << 'EOSERVICE'
[Unit]
Description=Report CI VM IP to VMware host via guestinfo
After=open-vm-tools.service network.target
Wants=open-vm-tools.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/ci-report-ip.sh
RemainAfterExit=yes
TimeoutStartSec=120
[Install]
WantedBy=multi-user.target
EOSERVICE
sudo cp "$(dirname "$0")/guest-setup/linux/ci-report-ip.service" /etc/systemd/system/ci-report-ip.service
sudo systemctl daemon-reload
sudo systemctl enable ci-report-ip.service
@@ -268,4 +233,4 @@ echo ""
echo "=== Install-CIToolchain-Linux2404.sh complete ==="
echo " All steps passed. VM is ready for BaseClean-Linux snapshot."
echo " Run Prepare-LinuxBuild2404.ps1 --Step7Shutdown + snapshot from host."