Repository navigation
Build Debian indexer boxes, starting with indexers-chic1 - #32
Conversation
Add an indexers inventory group beside ipfs_nodes under a new managed_boxes parent, which now holds the shared settings. Existing boxes' variables are unchanged. site.yml can sign in to a new box as root by key, and refuses a box whose name or storage is undecided. Storage is per box, with a ZFS mode that never recreates a pool. Indexers get wider unattended-upgrades, no automatic reboots and a reboot-required metric. hardening checks sshd's effective settings. k3s-upgrade.yml fails a box if a hop replaced a container outside kube-system. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
idx-new-1 becomes the test bed for the next indexer layout, meant to replace sf and sf2's later: the OS on a 500 GiB md RAID1 with ext4, installed by hand, and the rest of each disk as one md RAID5 with XFS at /ipni. storage_mode md_xfs creates the data partition in each disk's free space, the array and the filesystem, and like the zfs mode never recreates anything: existing arrays and filesystems are left alone, non-blank members stop the run, no force flags, and CI runs refuse to create an array. Indexers mount data at /ipni, the path ipni/infra's manifests use. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The box was reinstalled with a 300 GB md RAID1 for the OS (not 500 GiB) after its three NVMe drives were switched from 512- to 4096-byte sectors in Cherry's rescue system. host_vars now names the disks by ID, and the README has the format switch as a build step. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replaces the idx-new-1 placeholder with the name the box already carries, and sets its site label, so site.yml no longer refuses to build it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cherry's Debian 13 image ships /etc/ssh/sshd_config.d/50-cloud-init.conf with PasswordAuthentication yes, which sorts before 99-hardening.conf and wins. Delete it and set ssh_pwauth: false so cloud-init does not restore it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
platform.yml now targets managed_boxes, so each indexer opens 6443 to lith-1 and gets the argocd-manager account, and the hub registers it. The Argo CD and monitoring settings move from group_vars/ipfs_nodes to group_vars/managed_boxes so the indexers see them, and the monitoring ingest allowlist on lith-1 covers every managed box. Also document the Cherry console: Supermicro iKVM, typed with its on-screen keyboard. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Checked three ways on 2026-11-06: ssh-keyscan, the key file on the box and an operator's known_hosts agreed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hardening_fix_cloud_init_sshd, off by default and on in group_vars/indexers, gates removing 50-cloud-init.conf and writing ssh_pwauth: false. The IPFS boxes have no such file (checked: only 99-hardening.conf, sshd -T shows passwordauthentication no) and are left as they are. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Two additional findings in
These are static control-flow findings; I haven’t verified that either condition exists on the deployed box. |
…bers in dry runs Review on #32: a filesystem labelled storage_md_label anywhere skipped the whole create/refuse block, even with the array missing, and the mount took the label without checking its device. Now the label must resolve to storage_md_dev and the array's members must be exactly the configured ones, or the run stops before mounting. Dry runs also skipped the non-blank-member check. They now run wipefs on the member partitions that already exist and skip only the ones whose creation is simulated, so --check refuses what the real run would. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks. Both are fixed in 32e06ea.
Checked: I evaluated the guard against indexers-chic1's live values, read with read-only Not checked: the tasks haven't run through |
|
Re-reviewed head Both previously posted findings are addressed: the role now checks array/member identity before accepting a label, and dry runs probe existing member partitions. Local Ansible fixtures confirmed that the identity guard accepts valid layouts and rejects a label without an array, a wrong label device, and wrong members. Two earlier findings remain:
No additional findings in this pass. No live-host or destructive storage tests were run. |
Nothing uses it and it never ran on a box. Drops zfs.yml and zfs_pool.yml, the zfs storage_mode, the storage_zfs_* defaults, the ZFS package blocklist in the unattended-upgrades config, and the README's ZFS mode, ZFS-packages row and dkms check before a reboot. The unattended-upgrades config renders the same as before on sing-1, lith-1, chic-1 and indexers-chic1 (and matches each box's live file). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AGENTS.md: indexers also run platform.yml. README layout: the Argo CD settings are in group_vars/managed_boxes. The reserved-ports comments in group_vars/ipfs_nodes and roles/content point to group_vars/managed_boxes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codifies building indexer boxes on Debian 13 with k3s, starting with
indexers-chic1(Cherry Servers, Chicago, 84.32.71.3). Over the next three months it is the test bed for a new indexer setup, which sf and sf2 are meant to adopt later.The box is built.
site.yml -l indexers-chic1ran from a controller on 2026-11-05 and passed. Its host key is pinned ininventory/known_hostsand matches the key file on the box. Merging is now safe for CI'ssite.ymlruns.What's in it
indexersgroup, and amanaged_boxesparent for it andipfs_nodes. Shared settings moved togroup_vars/managed_boxes/. The IPFS boxes' resolved variables are unchanged, checked withansible-inventory --host.site.ymlandk3s-upgrade.yml: now cover indexers. Root login by key is tried before the password fallback. Boxes with undecided placeholders are refused.commonrole: Debian packages, unattended-upgrades also covering point releases on indexers, and reporting when a reboot is needed (needrestart reports only, plus a node-exporter metric).hardeningrole:sshd -T. That check also runs on the IPFS boxes.hardening_fix_cloud_init_sshd), deletes cloud-init's50-cloud-init.confand setsssh_pwauth: false. Cherry's Debian image ships that file withPasswordAuthentication yes, which overrode99-hardening.conf; thesshd -Tcheck caught it on the first build. The IPFS boxes are untouched. None of them has the file, and all three already reportpasswordauthentication no, so thesshd -Tcheck passes there.k3s-upgrade.yml: compares container IDs before and after each upgrade step, and fails if any container outsidekube-systemrestarted.storagerole: a new mode,md_xfs, beside the IPFS boxes'ext4_blank_nvme./ipni.indexers-chic1's layout:platform.yml: now targetsmanaged_boxes, so Argo CD on lith-1 manages the indexers too.argocd-manageraccount.indexerschic1.group_vars/ipfs_nodestogroup_vars/managed_boxes. Their values are unchanged.AGENTS.md.Tested
--syntax-checkpasses on every playbook.site.ymlonindexers-chic1, for real:/ipni), hardening and k3s.Readyon v1.37.2, andsshd -Tshowspermitrootlogin noandpasswordauthentication no.6.12.115+deb13.1and came back with the array and k3s.platform.yml --check --difffrom a controller:indexers-chic1: 2 changes, both expected (6443 from 46.166.169.131, theargocd-manageraccount).vault_argocd_age_keycheck. The key exists only as CI'sARGOCD_AGE_KEYsecret. So the hub's part (registeringindexerschic1, the new 8443 rule) is checked only by CI's dry run. Please read lith-1's diff on the run summary before approving the apply.Not tested
sshd -Ton the IPFS boxes. It runs on their nextsite.yml, and fails loudly if a drop-in overrides the hardening there.md_xfsreview fixes have not run throughsite.ymlyet; CI's dry run is their first real run.Follow-ups
indexerschic1, and alert onnode_reboot_required.mlkem768x25519-sha256) inKexAlgorithms.exim4, and needrestart reporting only on the IPFS boxes too.🤖 Generated with Claude Code