Files
loc_az_hci/scripts/azure-arc/onboard-vms.sh
defiQUG c39465c2bd
Some checks failed
Test / test (push) Has been cancelled
Initial commit: loc_az_hci (smom-dbis-138 excluded via .gitignore)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-08 09:04:46 -08:00

206 lines
5.5 KiB
Bash
Executable File

#!/bin/bash
source ~/.bashrc
# Azure Arc Onboarding Script for Proxmox VMs
# Onboards VMs running inside Proxmox to Azure Arc
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# Azure configuration
RESOURCE_GROUP="${RESOURCE_GROUP:-HC-Stack}"
TENANT_ID="${TENANT_ID:-}"
LOCATION="${LOCATION:-eastus}"
SUBSCRIPTION_ID="${SUBSCRIPTION_ID:-}"
CLOUD="${CLOUD:-AzureCloud}"
VM_TAGS="${VM_TAGS:-type=proxmox-vm,environment=hybrid}"
# VM configuration
VM_IP="${VM_IP:-}"
VM_USER="${VM_USER:-root}"
SSH_KEY="${SSH_KEY:-}"
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
validate_config() {
if [ -z "$TENANT_ID" ] || [ -z "$SUBSCRIPTION_ID" ] || [ -z "$RESOURCE_GROUP" ]; then
log_error "Required Azure configuration missing"
log_info "Required environment variables:"
log_info " TENANT_ID, SUBSCRIPTION_ID, RESOURCE_GROUP"
exit 1
fi
if [ -z "$VM_IP" ]; then
log_error "VM_IP must be set"
log_info "Usage: VM_IP=192.168.1.188 VM_USER=ubuntu ./onboard-vms.sh"
exit 1
fi
}
check_connectivity() {
log_info "Checking connectivity to VM: $VM_IP"
if ! ping -c 1 -W 2 "$VM_IP" &> /dev/null; then
log_error "Cannot reach VM at $VM_IP"
exit 1
fi
log_info "VM is reachable"
}
detect_os() {
log_info "Detecting VM operating system..."
if [ -n "$SSH_KEY" ]; then
SSH_CMD="ssh -i $SSH_KEY -o StrictHostKeyChecking=no $VM_USER@$VM_IP"
else
SSH_CMD="ssh -o StrictHostKeyChecking=no $VM_USER@$VM_IP"
fi
OS_TYPE=$($SSH_CMD "cat /etc/os-release | grep '^ID=' | cut -d'=' -f2 | tr -d '\"' || echo 'unknown'")
log_info "Detected OS: $OS_TYPE"
echo "$OS_TYPE"
}
install_arc_agent_remote() {
local os_type=$1
log_info "Installing Azure Arc agent on VM..."
# Create installation script
cat > /tmp/install_arc_agent.sh <<'EOF'
#!/bin/bash
set -e
# Check if already installed
if command -v azcmagent &> /dev/null; then
echo "Azure Arc agent already installed"
azcmagent version
exit 0
fi
# Download and install
wget -q https://aka.ms/azcmagent -O /tmp/install_linux_azcmagent.sh
chmod +x /tmp/install_linux_azcmagent.sh
sudo /tmp/install_linux_azcmagent.sh
# Verify
if command -v azcmagent &> /dev/null; then
echo "Azure Arc agent installed successfully"
azcmagent version
else
echo "Failed to install Azure Arc agent"
exit 1
fi
EOF
# Copy and execute on remote VM
if [ -n "$SSH_KEY" ]; then
scp -i "$SSH_KEY" -o StrictHostKeyChecking=no /tmp/install_arc_agent.sh "$VM_USER@$VM_IP:/tmp/"
ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no "$VM_USER@$VM_IP" "chmod +x /tmp/install_arc_agent.sh && sudo /tmp/install_arc_agent.sh"
else
scp -o StrictHostKeyChecking=no /tmp/install_arc_agent.sh "$VM_USER@$VM_IP:/tmp/"
ssh -o StrictHostKeyChecking=no "$VM_USER@$VM_IP" "chmod +x /tmp/install_arc_agent.sh && sudo /tmp/install_arc_agent.sh"
fi
log_info "Azure Arc agent installed on VM"
}
connect_vm_to_azure() {
log_info "Connecting VM to Azure Arc..."
# Create connection script
cat > /tmp/connect_arc.sh <<EOF
#!/bin/bash
set -e
# Check if already connected
if sudo azcmagent show &>/dev/null; then
echo "VM already connected to Azure Arc"
sudo azcmagent show
exit 0
fi
# Connect
sudo azcmagent connect \\
--resource-group "$RESOURCE_GROUP" \\
--tenant-id "$TENANT_ID" \\
--location "$LOCATION" \\
--subscription-id "$SUBSCRIPTION_ID" \\
--cloud "$CLOUD" \\
--tags "$VM_TAGS" \\
--correlation-id "proxmox-vm-onboarding-\$(date +%s)"
if [ \$? -eq 0 ]; then
echo "Successfully connected to Azure Arc"
sudo azcmagent show
else
echo "Failed to connect to Azure Arc"
exit 1
fi
EOF
# Copy and execute on remote VM
if [ -n "$SSH_KEY" ]; then
scp -i "$SSH_KEY" -o StrictHostKeyChecking=no /tmp/connect_arc.sh "$VM_USER@$VM_IP:/tmp/"
ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no "$VM_USER@$VM_IP" "chmod +x /tmp/connect_arc.sh && /tmp/connect_arc.sh"
else
scp -o StrictHostKeyChecking=no /tmp/connect_arc.sh "$VM_USER@$VM_IP:/tmp/"
ssh -o StrictHostKeyChecking=no "$VM_USER@$VM_IP" "chmod +x /tmp/connect_arc.sh && /tmp/connect_arc.sh"
fi
log_info "VM connected to Azure Arc"
}
verify_vm_connection() {
log_info "Verifying VM connection in Azure..."
VM_HOSTNAME=$($SSH_CMD "hostname" 2>/dev/null || echo "unknown")
if command -v az &> /dev/null; then
if az connectedmachine show \
--resource-group "$RESOURCE_GROUP" \
--name "$VM_HOSTNAME" &>/dev/null; then
log_info "VM found in Azure Portal"
az connectedmachine show \
--resource-group "$RESOURCE_GROUP" \
--name "$VM_HOSTNAME" \
--query "{name:name, location:location, status:status}" -o table
else
log_warn "VM not yet visible in Azure Portal (may take a few minutes)"
fi
fi
}
main() {
log_info "Starting Azure Arc onboarding for Proxmox VM..."
validate_config
check_connectivity
OS_TYPE=$(detect_os)
install_arc_agent_remote "$OS_TYPE"
connect_vm_to_azure
verify_vm_connection
log_info "VM onboarding completed successfully!"
log_info "View your VMs in Azure Portal:"
log_info " https://portal.azure.com/#view/Microsoft_Azure_HybridCompute/MachinesBlade"
}
main "$@"