178 lines
6.1 KiB
Bash
178 lines
6.1 KiB
Bash
|
|
#!/usr/bin/env bash
|
|||
|
|
# Push all deployment templates and scripts to Proxmox VE hosts.
|
|||
|
|
# Required for infra deployment: Besu configs, scripts, lib, config; optionally trigger OS template download on each host.
|
|||
|
|
#
|
|||
|
|
# Usage: ./scripts/push-templates-to-proxmox.sh [--download-templates] [--dry-run]
|
|||
|
|
# --download-templates After pushing files, run pveam download on each host for Debian 12 + Ubuntu 22.04
|
|||
|
|
# --dry-run Print what would be copied and to which hosts; do not push.
|
|||
|
|
#
|
|||
|
|
# Requires: SSH access to Proxmox hosts (config/ip-addresses.conf: ML110, R630_01, R630_02).
|
|||
|
|
# Run from project root.
|
|||
|
|
|
|||
|
|
set -euo pipefail
|
|||
|
|
|
|||
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|||
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|||
|
|
cd "$PROJECT_ROOT"
|
|||
|
|
|
|||
|
|
source "${PROJECT_ROOT}/config/ip-addresses.conf" 2>/dev/null || true
|
|||
|
|
|
|||
|
|
export LC_ALL=C
|
|||
|
|
export LANG=C
|
|||
|
|
|
|||
|
|
REMOTE_DIR="/opt/smom-dbis-138-proxmox"
|
|||
|
|
USER="${PROXMOX_USER:-root}"
|
|||
|
|
DOWNLOAD_TEMPLATES=false
|
|||
|
|
DRY_RUN=false
|
|||
|
|
for a in "$@"; do
|
|||
|
|
[[ "$a" == "--download-templates" ]] && DOWNLOAD_TEMPLATES=true
|
|||
|
|
[[ "$a" == "--dry-run" ]] && DRY_RUN=true
|
|||
|
|
done
|
|||
|
|
|
|||
|
|
# All Proxmox hosts (deployment targets)
|
|||
|
|
HOSTS=(
|
|||
|
|
"${PROXMOX_HOST_ML110:-192.168.11.10}"
|
|||
|
|
"${PROXMOX_HOST_R630_01:-192.168.11.11}"
|
|||
|
|
"${PROXMOX_HOST_R630_02:-192.168.11.12}"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# --- Templates and files to push (paths relative to PROJECT_ROOT) ---
|
|||
|
|
|
|||
|
|
# 1) LXC OS templates (downloaded on host via pveam, not pushed as files)
|
|||
|
|
# Required names: debian-12-standard_12.12-1_amd64.tar.zst, ubuntu-22.04-standard_22.04-1_amd64.tar.zst
|
|||
|
|
# Optional: alpine-3.22-default_* for NPMplus. Use --download-templates to run pveam on each host.
|
|||
|
|
|
|||
|
|
# 2) Besu config templates (used by deploy-besu-nodes, copy-configs-to-vm)
|
|||
|
|
BESU_CONFIGS=(
|
|||
|
|
smom-dbis-138-proxmox/templates/besu-configs/config-validator.toml
|
|||
|
|
smom-dbis-138-proxmox/templates/besu-configs/config-sentry.toml
|
|||
|
|
smom-dbis-138-proxmox/templates/besu-configs/config-rpc-core.toml
|
|||
|
|
smom-dbis-138-proxmox/templates/besu-configs/config-rpc.toml
|
|||
|
|
smom-dbis-138-proxmox/templates/besu-configs/config-rpc-4.toml
|
|||
|
|
)
|
|||
|
|
BESU_TEMPLATE_DIR="smom-dbis-138-proxmox/templates"
|
|||
|
|
DOCKER_COMPOSE_TEMPLATE="smom-dbis-138-proxmox/templates/docker-compose-besu-temp.yml"
|
|||
|
|
|
|||
|
|
# 3) Config (proxmox.conf, genesis, network – example or real)
|
|||
|
|
CONFIG_ITEMS=(
|
|||
|
|
smom-dbis-138-proxmox/config/proxmox.conf
|
|||
|
|
smom-dbis-138-proxmox/config/proxmox.conf.example
|
|||
|
|
smom-dbis-138-proxmox/config/genesis.json
|
|||
|
|
smom-dbis-138-proxmox/config/network.conf
|
|||
|
|
smom-dbis-138-proxmox/config/network.conf.example
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# 4) Scripts and lib (entire trees)
|
|||
|
|
SMOM_SCRIPTS_DIR="smom-dbis-138-proxmox/scripts"
|
|||
|
|
SMOM_LIB_DIR="smom-dbis-138-proxmox/lib"
|
|||
|
|
SMOM_INSTALL_DIR="smom-dbis-138-proxmox/install"
|
|||
|
|
|
|||
|
|
log_info() { echo "[INFO] $1"; }
|
|||
|
|
log_ok() { echo "[✓] $1"; }
|
|||
|
|
log_warn() { echo "[⚠] $1"; }
|
|||
|
|
log_err() { echo "[✗] $1"; }
|
|||
|
|
|
|||
|
|
run_ssh() {
|
|||
|
|
local host="$1"
|
|||
|
|
shift
|
|||
|
|
if [[ "$DRY_RUN" == true ]]; then
|
|||
|
|
echo " [DRY-RUN] ssh $USER@$host $*"
|
|||
|
|
return 0
|
|||
|
|
fi
|
|||
|
|
ssh -o ConnectTimeout=10 -o BatchMode=yes "$USER@$host" "$@"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
run_scp() {
|
|||
|
|
local src="$1"
|
|||
|
|
local dest="$2"
|
|||
|
|
if [[ "$DRY_RUN" == true ]]; then
|
|||
|
|
echo " [DRY-RUN] scp $src -> $dest"
|
|||
|
|
return 0
|
|||
|
|
fi
|
|||
|
|
scp -q "$src" "$dest"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
push_to_host() {
|
|||
|
|
local host="$1"
|
|||
|
|
log_info "Pushing to $USER@$host:$REMOTE_DIR ..."
|
|||
|
|
|
|||
|
|
run_ssh "$host" "mkdir -p $REMOTE_DIR/templates/besu-configs $REMOTE_DIR/config $REMOTE_DIR/scripts/deployment $REMOTE_DIR/scripts/validation $REMOTE_DIR/scripts/network $REMOTE_DIR/scripts/manage $REMOTE_DIR/scripts/migration $REMOTE_DIR/scripts/health $REMOTE_DIR/scripts/upgrade $REMOTE_DIR/lib $REMOTE_DIR/install"
|
|||
|
|
|
|||
|
|
for f in "${BESU_CONFIGS[@]}"; do
|
|||
|
|
[[ -f "$f" ]] || continue
|
|||
|
|
run_scp "$f" "$USER@$host:$REMOTE_DIR/templates/besu-configs/"
|
|||
|
|
done
|
|||
|
|
[[ -f "$DOCKER_COMPOSE_TEMPLATE" ]] && run_scp "$DOCKER_COMPOSE_TEMPLATE" "$USER@$host:$REMOTE_DIR/templates/"
|
|||
|
|
|
|||
|
|
for f in "${CONFIG_ITEMS[@]}"; do
|
|||
|
|
[[ -f "$f" ]] || continue
|
|||
|
|
run_scp "$f" "$USER@$host:$REMOTE_DIR/config/"
|
|||
|
|
done
|
|||
|
|
|
|||
|
|
if [[ -d "$SMOM_SCRIPTS_DIR" ]]; then
|
|||
|
|
if [[ "$DRY_RUN" == true ]]; then
|
|||
|
|
echo " [DRY-RUN] scp -r $SMOM_SCRIPTS_DIR -> $host:$REMOTE_DIR/"
|
|||
|
|
else
|
|||
|
|
scp -rq "$SMOM_SCRIPTS_DIR" "$USER@$host:$REMOTE_DIR/" 2>/dev/null || true
|
|||
|
|
fi
|
|||
|
|
fi
|
|||
|
|
if [[ -d "$SMOM_LIB_DIR" ]]; then
|
|||
|
|
for f in "$SMOM_LIB_DIR"/*.sh; do
|
|||
|
|
[[ -f "$f" ]] || continue
|
|||
|
|
run_scp "$f" "$USER@$host:$REMOTE_DIR/lib/"
|
|||
|
|
done
|
|||
|
|
fi
|
|||
|
|
if [[ -d "$SMOM_INSTALL_DIR" ]]; then
|
|||
|
|
for f in "$SMOM_INSTALL_DIR"/*.sh; do
|
|||
|
|
[[ -f "$f" ]] || continue
|
|||
|
|
run_scp "$f" "$USER@$host:$REMOTE_DIR/install/"
|
|||
|
|
done
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
run_ssh "$host" "find $REMOTE_DIR/scripts $REMOTE_DIR/lib $REMOTE_DIR/install -name '*.sh' -exec chmod +x {} \\; 2>/dev/null; true"
|
|||
|
|
log_ok "Pushed to $host"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
download_os_templates_on_host() {
|
|||
|
|
local host="$1"
|
|||
|
|
log_info "Downloading OS templates on $host (pveam)..."
|
|||
|
|
run_ssh "$host" "command -v pveam >/dev/null 2>&1 || { echo 'pveam not found'; exit 1; }
|
|||
|
|
for t in debian-12-standard_12.12-1_amd64.tar.zst ubuntu-22.04-standard_22.04-1_amd64.tar.zst; do
|
|||
|
|
pveam list local | grep -q \"\$t\" && echo \"\$t already present\" || { pveam available | grep -q \"\$t\" && pveam download local \"\$t\" || echo \"\$t not available\"; }
|
|||
|
|
done"
|
|||
|
|
log_ok "OS template check/download done on $host"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# --- Main ---
|
|||
|
|
|
|||
|
|
echo ""
|
|||
|
|
echo "Push deployment templates to Proxmox VE hosts"
|
|||
|
|
echo "Hosts: ${HOSTS[*]}"
|
|||
|
|
echo "Remote: $REMOTE_DIR"
|
|||
|
|
[[ "$DRY_RUN" == true ]] && echo "DRY-RUN: no changes will be made"
|
|||
|
|
[[ "$DOWNLOAD_TEMPLATES" == true ]] && echo "Will run pveam download on each host after push"
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
FAILED=()
|
|||
|
|
for h in "${HOSTS[@]}"; do
|
|||
|
|
if ! ssh -o BatchMode=yes -o ConnectTimeout=5 "$USER@$h" "exit" 2>/dev/null; then
|
|||
|
|
log_warn "Cannot SSH to $h (skip). Run from a host with SSH access to Proxmox."
|
|||
|
|
FAILED+=("$h")
|
|||
|
|
continue
|
|||
|
|
fi
|
|||
|
|
push_to_host "$h"
|
|||
|
|
if [[ "$DOWNLOAD_TEMPLATES" == true ]]; then
|
|||
|
|
download_os_templates_on_host "$h" || true
|
|||
|
|
fi
|
|||
|
|
done
|
|||
|
|
|
|||
|
|
if [[ ${#FAILED[@]} -gt 0 ]]; then
|
|||
|
|
log_warn "Skipped hosts (no SSH): ${FAILED[*]}"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo ""
|
|||
|
|
log_ok "Done. Templates and scripts are on all reachable Proxmox hosts under $REMOTE_DIR"
|
|||
|
|
echo "To download LXC OS templates on each host, run: $0 --download-templates"
|
|||
|
|
echo ""
|