Host-level Gatus rollout to kai-tower-3026 (Windows-native + WSL, no-page) #398
Labels
No labels
burndown-2026-06
coherence-core
consult
headless
interactive
P0
P1
P2
P3
P4
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
coilyco-flight-deck/infrastructure#398
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Goal
Host-level Gatus rollout onto kai-tower-3026 so the tower joins the reachability mesh with its own outbound rows. Per Kai's "both" decision, two instances - they probe independently because WSL2 NATs through Windows and the paths fail separately (the recurring WSL-networking class: #175, #609):
firem):gatus.exeas a Windows service, using the host's real network + Tailscale.kai-tower-3026-wsl, already an ansible inventory host): Linux Gatus (container or binary) over the existing ssh hop.This is the host-level rollout the fleet-reachability work explicitly deferred - see the EXTENSION POINT comment in
ansible/inventory/fleet.yml("Windows/WSL towers + Mac get a host-level container rollout in a SEPARATE later issue"). Design parent: #255. Bundle/configs: coilyco-bridge/deployservices/fleet-reachability/config/.Already done (configs landed, deploy#... 3c8d08c)
Both configs are authored + on canonical main, ready to consume:
config/gatus-kai-tower-3026.yaml(Windows-native)config/gatus-kai-tower-3026-wsl.yaml(WSL)Each probes ser8 + kai-server (tcp 6443/22 + icmp),
web.port: 8089,metrics: true, and NOalerts: [telegram](the tower is a no-page informational node - pair-only rule; do not change this).Scope
Part A - WSL (headless-doable, has precedent)
Extend the
fleet-reachabilityrole (or a sibling) to deploy a Linux Gatus intokai-tower-3026-wslover the existing ssh hop, consuminggatus-kai-tower-3026-wsl.yaml. Mirror the existing role's config-as-ConfigMap-or-file + idempotency patterns, adapted to a plain docker/binary host (no k3s here). Addkai-tower-3026-wslto a NEW inventory group (e.g.fleet_reachability_towers), NOTfleet_reachability(keep it out of the pair's group + out ofsync.yml, so the fleet-converge timer never fires it).Part B - Windows-native (HARD; likely needs the Windows-automation foundation first)
Author the role to install
gatus.exeas a Windows service (winsw / NSSM / scheduled task) via ansible WinRM, consuminggatus-kai-tower-3026.yaml. Caveat the agent must respect: the fleet has NO Windows-native ansible precedent yet (Windows agent-stack convergence is #356, still open). If the WinRM connection / Windows-service foundation isn't in place, do not invent a fragile one-off - author the role + inventory wiring as far as is sound, then stop and comment describing exactly what Windows foundation is missing (WinRM listener, auth, service-wrapper choice) and link #356. Part A should not block on Part B.Out of scope / guardrails
fleet_reachabilitygroup or tosync.yml.kai-tower-3026,ser8,kai-server) only; any opaque FQDN/IP via SSM.Acceptance
ansible-lint+--syntax-checkpass;--checkdry-run is clean; idempotent; documented apply command in the role README.pre-commitpasses. Runbook (docs/fleet-reachability.md) updated with the tower apply steps + the confirm-before-apply expectation.Refs: #255 (design), #356 (Windows agent-stack convergence - likely prerequisite for Part B), fleet.yml extension point, coilyco-bridge/deploy services/fleet-reachability.
🔒 Reserved by
ward agent --driver claude— containerward-infrastructure-issue-398-claude-d72653a6on hostkais-macbook-pro-2.localis carrying this issue (reserved 2026-06-24T06:45:47Z). Concurrentward agentruns are blocked until it finishes or the reservation goes stale (2h0m0s TTL);--forceoverrides.— Claude (she/her), via
ward agentLanded on
mainas mergefa29e97(featurec8b1996); CI lint + secret-scan green.Part A (WSL,
kai-tower-3026-wsl) - DONE. New sibling rolefleet-reachability-tower+playbooks/fleet-reachability-tower.ymlroll a host-level Linux Gatus container (ghcr.io/twin/gatus:latest,network_mode: host+NET_RAWmirroring the k3s pod's hostNetwork + NET_RAW) onto the WSL host over the existing ssh hop, consumingconfig/gatus-kai-tower-3026-wsl.yamlcopied verbatim from the bundle checkout. No-page node (no telegram). Added the NEWfleet_reachability_towersinventory group (NOTfleet_reachability, NOT insync.yml, never fired by the converge timer). Validated:--syntax-check+ a local--checkdry-run pass (4 ok, 11 host-touching tasks skipped, 0 failed), idempotent. Apply command + confirm-before-apply indocs/fleet-reachability-towers.mdand the role README.Part B (Windows-native,
kai-tower-3026) - AUTHORED-BUT-BLOCKED on #356. Rolefleet-reachability-tower-winis authored as far as is sound: it would installgatus.exeas a Windows service (NSSM wrapper) via ansible WinRM, consumingconfig/gatus-kai-tower-3026.yaml. It is an unverified draft, NOT live-applied - wired to no playbook, host absent from inventory. The fleet has no Windows-native ansible foundation yet, so before this can run, #356 (Windows agent-stack convergence) must land:firem(credentials via SSM, never tracked);Part A does not block on Part B. Picked the Windows draft back up once #356 lands the listener/auth/wrapper. Detail:
docs/fleet-reachability-towers.mdPart B.