Refactor deploy-to-proxmox.sh to improve LXC rootfs storage selection process: implement interactive user prompts for storage choice, validate selected storage against available options, and enhance error handling for invalid configurations. Update documentation for clearer guidance on storage settings.
This commit is contained in:
@@ -10,7 +10,7 @@
|
||||
# Example: ./deploy-to-proxmox.sh root@10.20.30.152
|
||||
#
|
||||
# Optional env:
|
||||
# DEPLOY_ROOTFS_STORAGE=name — LXC rootfs storage (default: auto-detect: local-lvm, local, local-zfs, or first active)
|
||||
# DEPLOY_ROOTFS_STORAGE=name — LXC rootfs storage (if set and valid, skips interactive choice; otherwise script lists storages and asks for number)
|
||||
# CM4_BACKUPS_HOST_PATH=/path — host dir for backups; bind-mounted into LXC
|
||||
# DEPLOY_LXC_ROOT_PASSWORD=secret — set root password in LXC and enable SSH
|
||||
# DEPLOY_LXC_SSH_KEY=/path/to/pub — copy this key to LXC root (default: ~/.ssh/id_ed25519.pub or id_rsa.pub)
|
||||
@@ -55,34 +55,66 @@ log "[1/5] Cleaning remote staging dir ..."
|
||||
ssh "$PROXMOX" "rm -rf /tmp/emmc-provisioning-deploy"
|
||||
log "[2/5] Rsync repo to $PROXMOX ..."
|
||||
rsync -a "$REPO_DIR/" "$PROXMOX:/tmp/emmc-provisioning-deploy/" --exclude='.git' --exclude='scripts/deploy-to-proxmox.sh' --exclude='scripts/deploy-*.log'
|
||||
|
||||
# --- Ask user to select LXC rootfs storage (from host; PBS excluded) ---
|
||||
STORAGE_LIST=$(ssh "$PROXMOX" "pvesm status 2>/dev/null | awk 'NR>1 && \$2!=\"pbs\" && \$3~/active/ {print \$1}'" 2>/dev/null || true)
|
||||
storages=()
|
||||
while IFS= read -r line; do [[ -n "$line" ]] && storages+=("$line"); done <<< "$STORAGE_LIST"
|
||||
if [[ ${#storages[@]} -eq 0 ]]; then
|
||||
log "Error: no Proxmox storage found on host (PBS excluded). Run on host: pvesm status"
|
||||
exit 1
|
||||
fi
|
||||
# If DEPLOY_ROOTFS_STORAGE is set and in the list, use it without prompting
|
||||
if [[ -n "${DEPLOY_ROOTFS_STORAGE:-}" ]]; then
|
||||
for s in "${storages[@]}"; do
|
||||
if [[ "$s" == "$DEPLOY_ROOTFS_STORAGE" ]]; then
|
||||
ROOTFS_STORAGE="$DEPLOY_ROOTFS_STORAGE"
|
||||
log "Using storage: $ROOTFS_STORAGE (from DEPLOY_ROOTFS_STORAGE)"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
if [[ -z "${ROOTFS_STORAGE:-}" ]]; then
|
||||
echo ""
|
||||
echo "Available storage on $PROXMOX (PBS excluded):"
|
||||
for i in "${!storages[@]}"; do echo " $((i+1))) ${storages[i]}"; done
|
||||
echo ""
|
||||
if [[ ${#storages[@]} -eq 1 ]]; then
|
||||
ROOTFS_STORAGE="${storages[0]}"
|
||||
log "Using only available storage: $ROOTFS_STORAGE"
|
||||
elif [[ ! -t 0 ]]; then
|
||||
ROOTFS_STORAGE="${storages[0]}"
|
||||
log "No TTY: using first storage $ROOTFS_STORAGE"
|
||||
else
|
||||
while true; do
|
||||
read -r -p "Select storage (1-${#storages[@]}): " num
|
||||
if [[ "$num" =~ ^[0-9]+$ ]] && [[ "$num" -ge 1 ]] && [[ "$num" -le ${#storages[@]} ]]; then
|
||||
ROOTFS_STORAGE="${storages[num-1]}"
|
||||
log "Using storage: $ROOTFS_STORAGE"
|
||||
break
|
||||
fi
|
||||
echo "Invalid choice. Enter a number from 1 to ${#storages[@]}."
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
log "[3/5] Running remote install (host + LXC) ..."
|
||||
|
||||
# Pass optional LXC SSH vars (base64) so remote can set password and add key
|
||||
# Pass optional LXC SSH vars (base64) and selected storage
|
||||
ssh "$PROXMOX" "ROOTFS_STORAGE='$ROOTFS_STORAGE' CM4_BACKUPS_HOST_PATH='${CM4_BACKUPS_HOST_PATH:-}' DEPLOY_SSH_KEY_B64='${DEPLOY_SSH_KEY_B64:-}' DEPLOY_LXC_PWD_B64='${DEPLOY_LXC_PWD_B64:-}'" bash -s << 'REMOTE'
|
||||
set -e
|
||||
DEPLOY=/tmp/emmc-provisioning-deploy
|
||||
ROOTFS_STORAGE="${ROOTFS_STORAGE:?ROOTFS_STORAGE not set}"
|
||||
BACKUPS_HOST_PATH="${CM4_BACKUPS_HOST_PATH:-}"
|
||||
LXC_HOSTNAME="cm4-provisioning"
|
||||
log() { echo "[$(date -Iseconds)] $*"; }
|
||||
|
||||
# --- Auto-select LXC rootfs storage if not set or not available ---
|
||||
_storage_exists() { pvesm status 2>/dev/null | awk -v s="$1" 'NR>1 && $1==s && $3=="active" {exit(0)} END{exit(1)}'; }
|
||||
if [[ -n "${ROOTFS_STORAGE:-}" ]] && _storage_exists "$ROOTFS_STORAGE"; then
|
||||
: # use provided and existing storage
|
||||
else
|
||||
ROOTFS_STORAGE=""
|
||||
for cand in local-lvm local local-zfs; do
|
||||
if _storage_exists "$cand"; then
|
||||
ROOTFS_STORAGE="$cand"
|
||||
break
|
||||
# Storage already chosen interactively; validate it exists on host
|
||||
if ! pvesm status 2>/dev/null | awk -v s="$ROOTFS_STORAGE" 'NR>1 && $1==s && $2!="pbs" && $3~/active/ {exit(0)} END{exit(1)}'; then
|
||||
log "Error: storage $ROOTFS_STORAGE not found or not valid on host"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
if [[ -z "$ROOTFS_STORAGE" ]]; then
|
||||
ROOTFS_STORAGE=$(pvesm status 2>/dev/null | awk 'NR>1 && $3=="active" {print $1; exit}')
|
||||
fi
|
||||
[[ -z "$ROOTFS_STORAGE" ]] && { log "Error: no Proxmox storage found. Run: pvesm status"; exit 1; }
|
||||
log "Using storage: $ROOTFS_STORAGE"
|
||||
fi
|
||||
|
||||
# --- Find existing LXC by hostname or use next available ID ---
|
||||
CTID=""
|
||||
|
||||
Reference in New Issue
Block a user