Some checks failed
Test / test (push) Has been cancelled
Co-authored-by: Cursor <cursoragent@cursor.com>
206 lines
5.5 KiB
Bash
Executable File
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 "$@"
|
|
|