Fail Pimox worker network issues faster

This commit is contained in:
juvdiaz 2026-07-01 10:49:48 -06:00
parent 1b97cc1404
commit 5a14e2d409
5 changed files with 88 additions and 0 deletions

View File

@ -739,6 +739,12 @@ Worker creation fails faster than template creation: static guest-network
configuration waits up to `LAB_PIMOX_GUEST_AGENT_CONFIG_TIMEOUT_SECONDS=120`,
worker IP/SSH readiness waits up to `LAB_PIMOX_WORKER_WAIT_TIMEOUT_SECONDS=600`,
and SSH after an IP appears waits up to `LAB_PIMOX_GUEST_SSH_TIMEOUT_SECONDS=180`.
After static network assignment, the guest must ping the gateway and
`${LAB_PIMOX_WORKER_LAN_PROBE_HOST:-LAB_DEBIAN_LAN_IP}`; set
`LAB_PIMOX_WORKER_REQUIRE_LAN_PROBE=false` only when ICMP is blocked. After
qemu-guest-agent reports an IP, Debian must be able to ping the worker before
SSH retries continue; set `LAB_PIMOX_WORKER_REQUIRE_HOST_PROBE=false` only when
worker ICMP is intentionally blocked.
`LAB_PIMOX_GUEST_TIMEOUT_SECONDS` remains the broader template-build timeout.
Long-running `./jeannie up` steps keep compact output by default, but

View File

@ -739,6 +739,12 @@ Worker creation fails faster than template creation: static guest-network
configuration waits up to `LAB_PIMOX_GUEST_AGENT_CONFIG_TIMEOUT_SECONDS=120`,
worker IP/SSH readiness waits up to `LAB_PIMOX_WORKER_WAIT_TIMEOUT_SECONDS=600`,
and SSH after an IP appears waits up to `LAB_PIMOX_GUEST_SSH_TIMEOUT_SECONDS=180`.
After static network assignment, the guest must ping the gateway and
`${LAB_PIMOX_WORKER_LAN_PROBE_HOST:-LAB_DEBIAN_LAN_IP}`; set
`LAB_PIMOX_WORKER_REQUIRE_LAN_PROBE=false` only when ICMP is blocked. After
qemu-guest-agent reports an IP, Debian must be able to ping the worker before
SSH retries continue; set `LAB_PIMOX_WORKER_REQUIRE_HOST_PROBE=false` only when
worker ICMP is intentionally blocked.
`LAB_PIMOX_GUEST_TIMEOUT_SECONDS` remains the broader template-build timeout.
Long-running `./{{ main_script }} up` steps keep compact output by default, but

View File

@ -155,6 +155,12 @@ Worker clone failures are intentionally faster than template build failures:
`LAB_PIMOX_WORKER_WAIT_TIMEOUT_SECONDS=600`, and
`LAB_PIMOX_GUEST_SSH_TIMEOUT_SECONDS=180` by default. The broader
`LAB_PIMOX_GUEST_TIMEOUT_SECONDS` still controls template preparation.
The static network step also checks guest LAN reachability by pinging the
gateway and `${LAB_PIMOX_WORKER_LAN_PROBE_HOST:-LAB_DEBIAN_LAN_IP}`. The Debian
host then pings the reported worker IP before continuing SSH retries. Disable
those checks only for ICMP-blocked networks with
`LAB_PIMOX_WORKER_REQUIRE_LAN_PROBE=false` or
`LAB_PIMOX_WORKER_REQUIRE_HOST_PROBE=false`.
Worker indexes are stable: index `1` maps to VMID `9010`,
`pimox-worker-01`, and worker key `pimox01`; index `2` maps to VMID `9011`,

View File

@ -539,6 +539,14 @@ falls back to the first Lynis warning, then the first suggestion.
: Desired Pimox worker count when not supplied by generated cluster topology
state.
`LAB_PIMOX_WORKER_REQUIRE_LAN_PROBE`
: Require the worker guest to ping the LAN gateway and probe host after static
IP assignment. Defaults to `true`.
`LAB_PIMOX_WORKER_REQUIRE_HOST_PROBE`
: Require the Debian host to ping the worker IP before waiting for SSH. Defaults
to `true`.
`LAB_SKIP_PREFLIGHT=true`
: Skip preflight checks. Use only for targeted troubleshooting.

62
jeannie
View File

@ -1069,6 +1069,9 @@ wait_for_pimox_guest_ssh() {
local last_guest_ip=""
local last_known_hosts_ip=""
local last_ssh_output=""
local last_host_probe_output=""
local host_probe_failures=0
local require_host_probe="${LAB_PIMOX_WORKER_REQUIRE_HOST_PROBE:-true}"
local next_log
local ssh_deadline=0
local ssh_output
@ -1082,6 +1085,10 @@ wait_for_pimox_guest_ssh() {
echo "LAB_PIMOX_GUEST_SSH_TIMEOUT_SECONDS must be a positive integer." >&2
return 1
fi
if ! truthy "${require_host_probe}" && ! disabled_value "${require_host_probe}"; then
echo "LAB_PIMOX_WORKER_REQUIRE_HOST_PROBE must be true or false." >&2
return 1
fi
mkdir -p "$(dirname "${known_hosts_file}")"
touch "${known_hosts_file}"
chmod 0600 "${known_hosts_file}"
@ -1101,6 +1108,26 @@ wait_for_pimox_guest_ssh() {
ssh-keygen -R "${guest_ip}" -f "${known_hosts_file}" >/dev/null 2>&1 || true
last_known_hosts_ip="${guest_ip}"
fi
if truthy "${require_host_probe}"; then
if last_host_probe_output="$(ping -c 1 -W 2 "${guest_ip}" 2>&1)"; then
host_probe_failures=0
else
host_probe_failures=$((host_probe_failures + 1))
last_ssh_output="Debian host cannot ping ${guest_ip}; latest probe: ${last_host_probe_output}"
if ((host_probe_failures >= 3)); then
echo "Worker VM ${vmid} reported guest IP ${guest_ip}, but the Debian host cannot reach it on the LAN." >&2
echo "Latest host probe: ${last_host_probe_output}" >&2
echo "Fast checks:" >&2
echo " ssh ${user}@${host} 'ip -br link show; bridge link; sudo qm config ${vmid}; sudo qm guest cmd ${vmid} network-get-interfaces'" >&2
echo " arping -c 3 ${guest_ip} || ping -c 3 ${guest_ip}" >&2
echo " Check bridge ${LAB_PIMOX_BRIDGE:-vmbr0}, switch/VLAN, duplicate IP, and firewall rules between Debian and Pimox workers." >&2
pimox_worker_vm_debug "${host}" "${user}" "${key_path}" "${vmid}" "${qm_bin}"
return 1
fi
sleep 10
continue
fi
fi
if ssh_output="$(ssh -i "${guest_key_path}" -o BatchMode=yes -o ConnectTimeout=8 -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile="${known_hosts_file}" "${guest_user}@${guest_ip}" true 2>&1)"; then
printf '%s\n' "${guest_ip}"
return 0
@ -1128,6 +1155,9 @@ wait_for_pimox_guest_ssh() {
if [[ -n "${last_ssh_output}" ]]; then
echo "Last SSH failure: ${last_ssh_output}" >&2
fi
if [[ -n "${last_host_probe_output}" ]]; then
echo "Last Debian-to-worker probe: ${last_host_probe_output}" >&2
fi
else
echo "Worker VM ${vmid} did not report an IPv4 address ${ip_filter_description} through qemu-guest-agent." >&2
fi
@ -1185,6 +1215,9 @@ configure_pimox_worker_guest_network() {
local encoded_script
local network_output
local worker_address
local lan_probe_host="${LAB_PIMOX_WORKER_LAN_PROBE_HOST:-${LAB_DEBIAN_LAN_IP:-}}"
local require_lan_probe="${LAB_PIMOX_WORKER_REQUIRE_LAN_PROBE:-true}"
local lan_probe_block=""
if ! validate_ipv4_cidr_or_host "${worker_ip}"; then
echo "Invalid LAB_PIMOX_WORKER_STATIC_IPS entry '${worker_ip}' for VM ${vmid}." >&2
@ -1210,6 +1243,29 @@ configure_pimox_worker_guest_network() {
echo "Invalid LAB_PIMOX_WORKER_INTERFACE '${interface_name}'." >&2
return 1
fi
if [[ -n "${lan_probe_host}" ]] && ! [[ "${lan_probe_host}" =~ ^[0-9]{1,3}(\.[0-9]{1,3}){3}$ ]]; then
echo "Invalid LAB_PIMOX_WORKER_LAN_PROBE_HOST '${lan_probe_host}'." >&2
return 1
fi
if ! truthy "${require_lan_probe}" && ! disabled_value "${require_lan_probe}"; then
echo "LAB_PIMOX_WORKER_REQUIRE_LAN_PROBE must be true or false." >&2
return 1
fi
if truthy "${require_lan_probe}"; then
lan_probe_block="$(cat <<EOF
echo "guest-check: ping gateway ${gateway}"
ping -c 2 -W 2 '${gateway}'
EOF
)"
if [[ -n "${lan_probe_host}" ]]; then
lan_probe_block+="
echo \"guest-check: ping Debian/probe host ${lan_probe_host}\"
ping -c 2 -W 2 '${lan_probe_host}'"
fi
else
lan_probe_block="echo 'guest-check: LAN probe disabled by LAB_PIMOX_WORKER_REQUIRE_LAN_PROBE=false'"
fi
script="$(cat <<EOF
set -eu
@ -1238,6 +1294,12 @@ sudo systemctl restart ssh 2>/dev/null || true
ip -br addr show ${interface_name}
ip route
ip -4 addr show dev ${interface_name} | grep -q '${worker_address}/'
${lan_probe_block}
echo 'guest-check: ssh service'
sudo systemctl is-active ssh
if command -v ss >/dev/null 2>&1; then
ss -ltn | grep -Eq '(^|[[:space:]])0\.0\.0\.0:22[[:space:]]|(^|[[:space:]])\[::\]:22[[:space:]]|(^|[[:space:]])\*:22[[:space:]]'
fi
EOF
)"
encoded_script="$(printf '%s' "${script}" | base64 | tr -d '\n')"