f7a8b668d3
STATUS.md:
- Mark 4b done (both Postgres migration + NFS decoupling)
- Add arch decisions for gitea remote + prefer-elway policy
- Add tooling entries for elway + tea CLI
- Document 2026-04-24 session milestones (irv-ml1 AI stacks,
elway, task-board, 4b finish)
- Expand memory-pointer list with the files added this session
CLAUDE.md:
- Tell new sessions to use elway for SSH-driven work, point at
the smoke playbook template
- Document the task-board plugin + MCP-tool contract so assistant
sessions with the plugin enabled know the assistant should call
task_start / task_update / task_wait / task_complete at
meaningful checkpoints
.claude/settings.json:
- Project-level env: TASK_BOARD_SESSION=Infra so every Claude Code
session opened here labels its task-board cards "Infra"
playbooks/decouple-pfi-postgres-from-ana-nas.yaml:
- Finishes the DB-off-NFS migration on pfi-postgres. Already ran
against prod today; fstab clean, unmounted, no systemd mnt-db
unit. Verify 3 was mis-expressed on first run (`grep -q active`
matched "inactive") — fixed to invert systemctl exit code
directly.
96 lines
3.9 KiB
YAML
96 lines
3.9 KiB
YAML
# Finish the 2026-04-23 DB-off-NFS migration by removing pfi-postgres's
|
|
# residual dependency on ana-nas's /mnt/db NFS export.
|
|
#
|
|
# Postgres on pfi-postgres is already running from local disk
|
|
# (/var/lib/postgresql/13/main); /mnt/db is still mounted but
|
|
# nothing writes to it. This playbook pulls the fstab line, unmounts,
|
|
# and removes the empty mountpoint — eliminating ana-nas from
|
|
# pfi-postgres's fault domain entirely.
|
|
#
|
|
# The old pre-migration data directories on ana-nas (pfi-mongo/,
|
|
# pfi-postgres/) are NOT touched. They remain as a cold archive of
|
|
# the pre-migration state and cost nothing to keep.
|
|
#
|
|
# Usage:
|
|
# scripts/elway pfi-postgres --playbook playbooks/decouple-pfi-postgres-from-ana-nas.yaml
|
|
#
|
|
# Safe to re-run: every mutation is creates-gated or when-gated, so a
|
|
# second invocation is a no-op.
|
|
|
|
vars:
|
|
fstab: /etc/fstab
|
|
mount_point: /mnt/db
|
|
nfs_source: "10.250.50.50:/mnt/db"
|
|
|
|
steps:
|
|
# ── pre-flight confirmations ────────────────────────────────────────
|
|
|
|
- name: Confirm Postgres IS running off local disk (not /mnt/db)
|
|
# changed_when: false — we're attesting, not changing. Fails hard
|
|
# if Postgres somehow ended up on the NFS path we're about to
|
|
# unmount.
|
|
shell: ps -ef | grep -v grep | grep 'postgres.*-D' | grep -q '/var/lib/postgresql'
|
|
changed_when: "false"
|
|
|
|
- name: Confirm /mnt/db has no open files (nothing writing to it)
|
|
# lsof exits non-zero if no matches found — that's what we want.
|
|
# Invert with `!`. If the mount point IS in use we want the
|
|
# playbook to halt so the user can investigate.
|
|
shell: "! sudo lsof +D {{ mount_point }} 2>/dev/null | grep -v '^COMMAND'"
|
|
sudo: true
|
|
changed_when: "false"
|
|
|
|
# ── unmount + fstab ────────────────────────────────────────────────
|
|
|
|
- name: Remove fstab entry for {{ nfs_source }}
|
|
shell: sed -i "\\|^{{ nfs_source }}[[:space:]]|d" {{ fstab }}
|
|
sudo: true
|
|
# Idempotency: if the line is already absent, the sed is a no-op
|
|
# but still reports "changed" since sed always rewrites the file.
|
|
# `when:` gate below makes it truly idempotent.
|
|
when: "grep -qE '^{{ nfs_source }}[[:space:]]' {{ fstab }}"
|
|
|
|
- name: Unmount {{ mount_point }}
|
|
shell: umount {{ mount_point }}
|
|
sudo: true
|
|
# Only run if currently mounted.
|
|
when: "mountpoint -q {{ mount_point }}"
|
|
|
|
- name: Remove empty mountpoint dir
|
|
shell: rmdir {{ mount_point }}
|
|
sudo: true
|
|
# Only if the dir exists AND is empty (rmdir fails on non-empty,
|
|
# which is the safety we want). The `creates: null` pattern
|
|
# doesn't apply here; we use a when: that checks both conditions.
|
|
when: "[ -d {{ mount_point }} ] && [ -z \"$(ls -A {{ mount_point }} 2>/dev/null)\" ]"
|
|
|
|
# ── tell systemd to forget the old mount unit ──────────────────────
|
|
|
|
- name: Reload systemd so the synthesized mnt-db.mount unit clears
|
|
shell: systemctl daemon-reload
|
|
sudo: true
|
|
changed_when: "false"
|
|
|
|
verify:
|
|
- name: fstab no longer references /mnt/db
|
|
shell: "! grep -qE '^{{ nfs_source }}[[:space:]]' {{ fstab }}"
|
|
changed_when: "false"
|
|
|
|
- name: /mnt/db is not a mountpoint
|
|
shell: "! mountpoint -q {{ mount_point }}"
|
|
changed_when: "false"
|
|
|
|
- name: No systemd mnt-db.mount unit remains active
|
|
# Don't grep for "active" — "inactive" contains it as a substring.
|
|
# `is-active` returns 0 only when the unit is truly active; invert.
|
|
shell: "! systemctl is-active mnt-db.mount >/dev/null 2>&1"
|
|
changed_when: "false"
|
|
|
|
- name: Postgres is still running (we didn't accidentally break it)
|
|
shell: systemctl is-active postgresql
|
|
changed_when: "false"
|
|
|
|
- name: Postgres still listening on :5432
|
|
shell: "ss -tln | grep -q ':5432'"
|
|
changed_when: "false"
|