Archived
Compare commits
10
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f3c2965f78 | ||
|
|
b9d3b51028 | ||
|
|
539bdf9833 | ||
|
|
dc6c37ed2e | ||
|
|
b5e61d62bd | ||
|
|
ced1657407 | ||
|
|
fdf41c659c | ||
|
|
7ba603c005 | ||
|
|
4490dfab7d | ||
|
|
fa163b613d |
No files matched your search
+3
-18
@@ -23,7 +23,6 @@
|
|||||||
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 ────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
@@ -75,21 +74,11 @@ _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/qm list output already contains the NixOS hostname directly.
|
# So pct list / qm list output already contains the NixOS hostname directly —
|
||||||
# We validate against the flake to filter out non-NixOS guests on pve1
|
# no flake eval or name translation needed.
|
||||||
# (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}..."
|
||||||
|
|
||||||
# Eval the flake once to get the set of hostnames that are actually NixOS.
|
# SSH_QUERY_OPTS (no BatchMode) so sudo can prompt if wayne's sudo needs a password.
|
||||||
# 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'
|
||||||
@@ -102,10 +91,6 @@ 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,6 +30,8 @@ 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}}"
|
||||||
@@ -140,7 +142,7 @@ fi
|
|||||||
echo ""
|
echo ""
|
||||||
echo "Looking up VM IDs on ${PVE_HOST}..."
|
echo "Looking up VM IDs on ${PVE_HOST}..."
|
||||||
|
|
||||||
QM_LIST=$(pve "qm list 2>/dev/null" || true)
|
QM_LIST=$(pve "$PVE_SUDO 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)
|
||||||
|
|
||||||
@@ -182,12 +184,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 "qm resize $VMID1 ${DATA_DISK_SLOT} ${SIZE}"
|
pve "$PVE_SUDO 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 "qm resize $VMID2 ${DATA_DISK_SLOT} ${SIZE}"
|
pve "$PVE_SUDO qm resize $VMID2 ${DATA_DISK_SLOT} ${SIZE}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo " Phase 1 done."
|
echo " Phase 1 done."
|
||||||
@@ -202,17 +204,13 @@ 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=""
|
||||||
if ! $DRY_RUN; then
|
blk_dev=$($run_fn "bash -c 'basename \$(readlink -f /dev/disk/by-id/${DATA_DISK_BYID})'" 2>/dev/null || true)
|
||||||
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
|
||||||
# Fall back: scsi1 → index 1 → sdb, scsi2 → sdc, etc.
|
echo " ERROR: /dev/disk/by-id/${DATA_DISK_BYID} not found on $node_name" >&2
|
||||||
local slot_idx
|
echo " Check DATA_DISK_BYID or DATA_DISK_SLOT configuration." >&2
|
||||||
slot_idx=$(echo "$DATA_DISK_SLOT" | grep -oE '[0-9]+$' || echo "1")
|
exit 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,6 +58,7 @@
|
|||||||
"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