Archived
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4ba9b141fe |
No files matched your search
+18
-3
@@ -23,6 +23,7 @@
|
|||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
cd "$(dirname "$0")/.."
|
cd "$(dirname "$0")/.."
|
||||||
source scripts/env.sh 2>/dev/null || true
|
source scripts/env.sh 2>/dev/null || true
|
||||||
|
source scripts/lib/nix-eval.sh 2>/dev/null || true
|
||||||
|
|
||||||
# ── config ────────────────────────────────────────────────────────────────────
|
# ── config ────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
@@ -74,11 +75,21 @@ _add_host "pve1" "${PVE1_SSH_USER}@${PVE1_HOST}" "nix"
|
|||||||
# create-proxmox-resource.sh names every guest after its NixOS hostname:
|
# create-proxmox-resource.sh names every guest after its NixOS hostname:
|
||||||
# pct create ... --hostname <nixos-hostname> (LXC)
|
# pct create ... --hostname <nixos-hostname> (LXC)
|
||||||
# qm create ... --name <nixos-hostname> (VM)
|
# qm create ... --name <nixos-hostname> (VM)
|
||||||
# So pct list / qm list output already contains the NixOS hostname directly —
|
# So pct/qm list output already contains the NixOS hostname directly.
|
||||||
# no flake eval or name translation needed.
|
# We validate against the flake to filter out non-NixOS guests on pve1
|
||||||
|
# (e.g. FreeIPA, Proxmox Backup Server) that share the same Proxmox node.
|
||||||
echo "Discovering running guests on ${PVE1_HOST}..."
|
echo "Discovering running guests on ${PVE1_HOST}..."
|
||||||
|
|
||||||
# SSH_QUERY_OPTS (no BatchMode) so sudo can prompt if wayne's sudo needs a password.
|
# Eval the flake once to get the set of hostnames that are actually NixOS.
|
||||||
|
# Values are NixOS hostnames (e.g. "docker"); keys are flake targets ("lxc-docker").
|
||||||
|
nixos_hostnames=""
|
||||||
|
nixos_hostnames="$(
|
||||||
|
nix eval --json "${NIX_EVAL_FLAGS[@]}" .#nixosConfigurations \
|
||||||
|
--apply 'cfgs: builtins.attrValues (builtins.mapAttrs (_: cfg: cfg.config.networking.hostName) cfgs)' \
|
||||||
|
2>/dev/null | jq -r '.[]' | sort -u
|
||||||
|
)" || { echo " warning: flake eval failed — non-NixOS guests will not be filtered" >&2; }
|
||||||
|
|
||||||
|
# SSH_QUERY_OPTS (no BatchMode) so sudo can prompt if needed for pct/qm.
|
||||||
if ssh "${SSH_QUERY_OPTS[@]}" "${PVE1_SSH_USER}@${PVE1_HOST}" "true" 2>/dev/null; then
|
if ssh "${SSH_QUERY_OPTS[@]}" "${PVE1_SSH_USER}@${PVE1_HOST}" "true" 2>/dev/null; then
|
||||||
running_guests="$(
|
running_guests="$(
|
||||||
ssh "${SSH_QUERY_OPTS[@]}" "${PVE1_SSH_USER}@${PVE1_HOST}" bash -s <<'DISCOVER'
|
ssh "${SSH_QUERY_OPTS[@]}" "${PVE1_SSH_USER}@${PVE1_HOST}" bash -s <<'DISCOVER'
|
||||||
@@ -91,6 +102,10 @@ DISCOVER
|
|||||||
[[ -z "$hostname" ]] && continue
|
[[ -z "$hostname" ]] && continue
|
||||||
# Exclude nix-cache.
|
# Exclude nix-cache.
|
||||||
case "$hostname" in *nix-cache*) continue ;; esac
|
case "$hostname" in *nix-cache*) continue ;; esac
|
||||||
|
# Skip if not a flake-managed NixOS host (filters non-NixOS pve1 guests).
|
||||||
|
if [[ -n "$nixos_hostnames" ]] && ! grep -qxF "$hostname" <<< "$nixos_hostnames"; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
# Skip if already in the list (e.g. a proxmox-gui guest whose hostname is nixos).
|
# Skip if already in the list (e.g. a proxmox-gui guest whose hostname is nixos).
|
||||||
if [[ -n "${_SEEN_HOSTNAMES[$hostname]+_}" ]]; then continue; fi
|
if [[ -n "${_SEEN_HOSTNAMES[$hostname]+_}" ]]; then continue; fi
|
||||||
|
|
||||||
|
|||||||
@@ -30,8 +30,6 @@ DATA_DISK_SLOT="${DATA_DISK_SLOT:-scsi1}" # Proxmox disk name (scsi1 = data di
|
|||||||
HA_USER="${HA_USER:-nixos}"
|
HA_USER="${HA_USER:-nixos}"
|
||||||
PVE_HOST="${PVE_HOST:-${PVE1_HOST}}"
|
PVE_HOST="${PVE_HOST:-${PVE1_HOST}}"
|
||||||
PVE_SSH_USER="${PVE_SSH_USER:-${PROXMOX_SSH_USER}}"
|
PVE_SSH_USER="${PVE_SSH_USER:-${PROXMOX_SSH_USER}}"
|
||||||
PVE_SUDO=""
|
|
||||||
[[ "$PVE_SSH_USER" != "root" ]] && PVE_SUDO="sudo"
|
|
||||||
# By-id symlink for the data disk; basename resolves to the raw block device.
|
# By-id symlink for the data disk; basename resolves to the raw block device.
|
||||||
# matches variables.nix's haServerDrbdDisk.
|
# matches variables.nix's haServerDrbdDisk.
|
||||||
DATA_DISK_BYID="${DATA_DISK_BYID:-scsi-0QEMU_QEMU_HARDDISK_drive-${DATA_DISK_SLOT}}"
|
DATA_DISK_BYID="${DATA_DISK_BYID:-scsi-0QEMU_QEMU_HARDDISK_drive-${DATA_DISK_SLOT}}"
|
||||||
@@ -142,7 +140,7 @@ fi
|
|||||||
echo ""
|
echo ""
|
||||||
echo "Looking up VM IDs on ${PVE_HOST}..."
|
echo "Looking up VM IDs on ${PVE_HOST}..."
|
||||||
|
|
||||||
QM_LIST=$(pve "$PVE_SUDO qm list 2>/dev/null" || true)
|
QM_LIST=$(pve "qm list 2>/dev/null" || true)
|
||||||
VMID1=$(echo "$QM_LIST" | awk -v name="$NODE1" '$0 ~ name {print $1}' | head -1)
|
VMID1=$(echo "$QM_LIST" | awk -v name="$NODE1" '$0 ~ name {print $1}' | head -1)
|
||||||
VMID2=$(echo "$QM_LIST" | awk -v name="$NODE2" '$0 ~ name {print $1}' | head -1)
|
VMID2=$(echo "$QM_LIST" | awk -v name="$NODE2" '$0 ~ name {print $1}' | head -1)
|
||||||
|
|
||||||
@@ -184,12 +182,12 @@ echo "── Phase 1 — Proxmox disk resize (${DATA_DISK_SLOT} ${SIZE} on both
|
|||||||
|
|
||||||
echo " ${DRY_PREFIX}qm resize $VMID1 ${DATA_DISK_SLOT} ${SIZE} ($NODE1 on ${PVE_HOST})"
|
echo " ${DRY_PREFIX}qm resize $VMID1 ${DATA_DISK_SLOT} ${SIZE} ($NODE1 on ${PVE_HOST})"
|
||||||
if ! $DRY_RUN; then
|
if ! $DRY_RUN; then
|
||||||
pve "$PVE_SUDO qm resize $VMID1 ${DATA_DISK_SLOT} ${SIZE}"
|
pve "qm resize $VMID1 ${DATA_DISK_SLOT} ${SIZE}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo " ${DRY_PREFIX}qm resize $VMID2 ${DATA_DISK_SLOT} ${SIZE} ($NODE2 on ${PVE_HOST})"
|
echo " ${DRY_PREFIX}qm resize $VMID2 ${DATA_DISK_SLOT} ${SIZE} ($NODE2 on ${PVE_HOST})"
|
||||||
if ! $DRY_RUN; then
|
if ! $DRY_RUN; then
|
||||||
pve "$PVE_SUDO qm resize $VMID2 ${DATA_DISK_SLOT} ${SIZE}"
|
pve "qm resize $VMID2 ${DATA_DISK_SLOT} ${SIZE}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo " Phase 1 done."
|
echo " Phase 1 done."
|
||||||
@@ -204,13 +202,17 @@ rescan_node() {
|
|||||||
local node_name=$1 run_fn=$2
|
local node_name=$1 run_fn=$2
|
||||||
|
|
||||||
# Resolve block device name from the stable by-id symlink on the guest.
|
# Resolve block device name from the stable by-id symlink on the guest.
|
||||||
# Read-only lookup — safe to run even in dry-run so we show the real device.
|
|
||||||
local blk_dev=""
|
local blk_dev=""
|
||||||
blk_dev=$($run_fn "bash -c 'basename \$(readlink -f /dev/disk/by-id/${DATA_DISK_BYID})'" 2>/dev/null || true)
|
if ! $DRY_RUN; then
|
||||||
|
blk_dev=$($run_fn "bash -c 'basename \$(readlink -f /dev/disk/by-id/${DATA_DISK_BYID})'" 2>/dev/null || true)
|
||||||
|
fi
|
||||||
if [[ -z "$blk_dev" ]]; then
|
if [[ -z "$blk_dev" ]]; then
|
||||||
echo " ERROR: /dev/disk/by-id/${DATA_DISK_BYID} not found on $node_name" >&2
|
# Fall back: scsi1 → index 1 → sdb, scsi2 → sdc, etc.
|
||||||
echo " Check DATA_DISK_BYID or DATA_DISK_SLOT configuration." >&2
|
local slot_idx
|
||||||
exit 1
|
slot_idx=$(echo "$DATA_DISK_SLOT" | grep -oE '[0-9]+$' || echo "1")
|
||||||
|
blk_dev=$(printf "sd%s" "$(echo "abcdefghij" | cut -c$((slot_idx + 1)))")
|
||||||
|
echo " WARNING: could not resolve /dev/disk/by-id/${DATA_DISK_BYID} on $node_name;" \
|
||||||
|
"falling back to /dev/${blk_dev}" >&2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo " ${DRY_PREFIX}Rescanning /dev/${blk_dev} on ${node_name}..."
|
echo " ${DRY_PREFIX}Rescanning /dev/${blk_dev} on ${node_name}..."
|
||||||
|
|||||||
@@ -58,7 +58,6 @@
|
|||||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBZ9WKKAlP9Z7GQdgaZ1Xgw9C+vja2lqEZO5rJFpVqYN root@ha-server-1"
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBZ9WKKAlP9Z7GQdgaZ1Xgw9C+vja2lqEZO5rJFpVqYN root@ha-server-1"
|
||||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEGNKlaaMckd8nLWNGz4B2QokXjnnIvM+rEUv+R6h0sp root@ha-server-2"
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEGNKlaaMckd8nLWNGz4B2QokXjnnIvM+rEUv+R6h0sp root@ha-server-2"
|
||||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+XeMco7OxUpjrjZm54HogMs9QB5xlcKmElASRvrmlW root@nixos"
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+XeMco7OxUpjrjZm54HogMs9QB5xlcKmElASRvrmlW root@nixos"
|
||||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMseQwPpmaa6cgV5U8KhUsiVSYARG85zGa9rho0LJWks wayne@pve1"
|
|
||||||
];
|
];
|
||||||
|
|
||||||
# Admin SSH public key, authorized on the primary user of every host and
|
# Admin SSH public key, authorized on the primary user of every host and
|
||||||
|
|||||||
Reference in new issue
Block a user