243 lines
6.7 KiB
Bash
243 lines
6.7 KiB
Bash
#!/usr/bin/env bash
|
||
set -e
|
||
|
||
# =========================
|
||
# 辅助函数:生成随机 8 位字符串
|
||
# =========================
|
||
generate_random_string() {
|
||
tr -dc 'a-z0-9' </dev/urandom | head -c 8
|
||
}
|
||
|
||
# =========================
|
||
# 参数解析
|
||
# =========================
|
||
# 初始化变量
|
||
GROUP_NAME=""
|
||
VM_NAME=""
|
||
LOCATION=""
|
||
SIZE=""
|
||
REINSTALL_FLAG=false # <-- 新增
|
||
|
||
while [[ "$#" -gt 0 ]]; do
|
||
case $1 in
|
||
--group) GROUP_NAME="$2"; shift ;;
|
||
--name) VM_NAME="$2"; shift ;;
|
||
--location) LOCATION="$2"; shift ;;
|
||
--size) SIZE="$2"; shift ;;
|
||
--reinstall) REINSTALL_FLAG=true ;; # <-- 新增
|
||
*) echo "未知参数: $1" && exit 1 ;;
|
||
esac
|
||
shift
|
||
done
|
||
|
||
# =========================
|
||
# 参数检查与默认值
|
||
# =========================
|
||
if [[ -z "$LOCATION" ]]; then
|
||
echo "❌ 请指定 --location 参数"
|
||
exit 1
|
||
fi
|
||
|
||
if [[ -z "$SIZE" ]]; then
|
||
echo "❌ 请指定 --size 参数"
|
||
exit 1
|
||
fi
|
||
|
||
# 如果没指定资源组名称,则生成随机 8 位字符串
|
||
if [[ -z "$GROUP_NAME" ]]; then
|
||
RAND=$(generate_random_string)
|
||
GROUP_NAME="rg-${RAND}"
|
||
echo "INFO: 未指定 --group, 随机生成资源组名称: $GROUP_NAME"
|
||
fi
|
||
|
||
# 如果没指定 VM 名称,则生成随机 8 位字符串
|
||
if [[ -z "$VM_NAME" ]]; then
|
||
RAND=$(generate_random_string)
|
||
VM_NAME="vm-${RAND}"
|
||
echo "INFO: 未指定 --name, 随机生成 VM 名称: $VM_NAME"
|
||
fi
|
||
|
||
# 根据 SIZE 判断是否启用加速网卡
|
||
if [[ "$SIZE" == *"ats"* || "$SIZE" == *"pts"* ]]; then
|
||
ACCELERATED="true"
|
||
else
|
||
ACCELERATED="false"
|
||
fi
|
||
|
||
if [[ "$SIZE" == *"pts"* ]]; then
|
||
IMAGE="Canonical:0001-com-ubuntu-server-jammy:22_04-lts-arm64:latest"
|
||
else
|
||
IMAGE="Canonical:0001-com-ubuntu-minimal-jammy:minimal-22_04-lts-gen2:latest"
|
||
fi
|
||
|
||
echo "=========================="
|
||
echo "资源组名称: $GROUP_NAME"
|
||
echo "VM 名称: $VM_NAME"
|
||
echo "区域: $LOCATION"
|
||
echo "VM 规格: $SIZE"
|
||
echo "镜像: $IMAGE"
|
||
echo "加速网卡: $ACCELERATED"
|
||
echo "执行重装: $REINSTALL_FLAG" # <-- 新增
|
||
echo "=========================="
|
||
|
||
# =========================
|
||
# 1. 创建资源组
|
||
# =========================
|
||
echo "INFO: 正在创建资源组..."
|
||
az group create --name "$GROUP_NAME" --location "$LOCATION" -o none || true
|
||
|
||
# =========================
|
||
# 2. 创建 VNet 和 Subnet
|
||
# =========================
|
||
echo "INFO: 正在同时创建 VNet 和 Subnet..."
|
||
az network vnet create \
|
||
--resource-group "$GROUP_NAME" \
|
||
--name "${VM_NAME}VNET" \
|
||
--location "$LOCATION" \
|
||
--address-prefixes "10.0.0.0/16" "2603:1061:200::/60" \
|
||
--subnet-name "${VM_NAME}Subnet" \
|
||
--subnet-prefixes "10.0.0.0/24" "2603:1061:200:1::/64" \
|
||
-o none
|
||
|
||
# =========================
|
||
# (可选) 创建 NSG
|
||
# =========================
|
||
echo "INFO: 正在创建 NSG (网络安全组)..."
|
||
az network nsg create \
|
||
--resource-group "$GROUP_NAME" \
|
||
--name "${VM_NAME}NSG" \
|
||
--location "$LOCATION" \
|
||
-o none
|
||
|
||
# 【修正】: 恢复 NSG 规则以允许 SSH (和所有其他入站/出站流量,用于测试)
|
||
echo "INFO: 正在添加 NSG 规则..."
|
||
|
||
# 警告:以下规则允许所有入站和出站流量,存在安全风险,仅建议用于测试。
|
||
# 至少需要 SSH (端口 22) 才能连接
|
||
az network nsg rule create \
|
||
--resource-group "$GROUP_NAME" \
|
||
--nsg-name "${VM_NAME}NSG" \
|
||
--name AllowAllInbound \
|
||
--priority 100 \
|
||
--direction Inbound \
|
||
--access Allow \
|
||
--protocol '*' \
|
||
--source-address-prefixes '*' \
|
||
--destination-address-prefixes '*' \
|
||
--source-port-ranges '*' \
|
||
--destination-port-ranges '*' \
|
||
-o none
|
||
|
||
az network nsg rule create \
|
||
--resource-group "$GROUP_NAME" \
|
||
--nsg-name "${VM_NAME}NSG" \
|
||
--name AllowAllOutbound \
|
||
--priority 200 \
|
||
--direction Outbound \
|
||
--access Allow \
|
||
--protocol '*' \
|
||
--source-address-prefixes '*' \
|
||
--destination-address-prefixes '*' \
|
||
--source-port-ranges '*' \
|
||
--destination-port-ranges '*' \
|
||
-o none
|
||
|
||
# =========================
|
||
# 3. 创建公网 IP (IPv4 & IPv6)
|
||
# =========================
|
||
echo "INFO: 正在创建公网 IP (IPv4 和 IPv6)..."
|
||
|
||
# 创建 IPv4 公网 IP
|
||
az network public-ip create \
|
||
--resource-group "$GROUP_NAME" \
|
||
--name "${VM_NAME}IPv4Pub" \
|
||
--sku Standard \
|
||
--version IPv4 \
|
||
--location "$LOCATION" \
|
||
-o none
|
||
|
||
# 创建 IPv6 公网 IP
|
||
az network public-ip create \
|
||
--resource-group "$GROUP_NAME" \
|
||
--name "${VM_NAME}IPv6Pub" \
|
||
--sku Standard \
|
||
--version IPv6 \
|
||
--location "$LOCATION" \
|
||
-o none
|
||
|
||
# =========================
|
||
# 4. 创建 NIC (仅关联 IPv4)
|
||
# =========================
|
||
echo "INFO: 正在创建 NIC (仅关联 IPv4)..."
|
||
az network nic create \
|
||
--resource-group "$GROUP_NAME" \
|
||
--name "${VM_NAME}NIC" \
|
||
--vnet-name "${VM_NAME}VNET" \
|
||
--subnet "${VM_NAME}Subnet" \
|
||
--network-security-group "${VM_NAME}NSG" \
|
||
--public-ip-address "${VM_NAME}IPv4Pub" \
|
||
--accelerated-networking "$ACCELERATED" \
|
||
--location "$LOCATION" \
|
||
-o none
|
||
|
||
# =========================
|
||
# 5. 为 NIC 添加 IPv6 配置
|
||
# =========================
|
||
echo "INFO: 正在为 NIC 添加 IPv6 配置..."
|
||
az network nic ip-config create \
|
||
--resource-group "$GROUP_NAME" \
|
||
--name "ipconfig-ipv6" \
|
||
--nic-name "${VM_NAME}NIC" \
|
||
--private-ip-address-version IPv6 \
|
||
--vnet-name "${VM_NAME}VNET" \
|
||
--subnet "${VM_NAME}Subnet" \
|
||
--public-ip-address "${VM_NAME}IPv6Pub" \
|
||
-o none
|
||
|
||
# =========================
|
||
# 6. 创建 VM
|
||
# =========================
|
||
echo "INFO: 正在创建 VM (虚拟机)..."
|
||
az vm create \
|
||
--resource-group "$GROUP_NAME" \
|
||
--name "$VM_NAME" \
|
||
--nics "${VM_NAME}NIC" \
|
||
--image "$IMAGE" \
|
||
--size "$SIZE" \
|
||
--storage-sku Premium_LRS \
|
||
--os-disk-size-gb 64 \
|
||
--admin-username ubuntu \
|
||
--admin-password "YourStrongPassword123!" \
|
||
--authentication-type password \
|
||
--security-type Standard \
|
||
--enable-secure-boot false \
|
||
--location "$LOCATION" \
|
||
-o none
|
||
|
||
# =========================
|
||
# 7. 输出 IP 地址
|
||
# =========================
|
||
echo "INFO: 正在获取 IP 地址..."
|
||
IPV4_ADDRESS=$(az network public-ip show -g "$GROUP_NAME" -n "${VM_NAME}IPv4Pub" --query "ipAddress" -o tsv)
|
||
IPV6_ADDRESS=$(az network public-ip show -g "$GROUP_NAME" -n "${VM_NAME}IPv6Pub" --query "ipAddress" -o tsv)
|
||
|
||
echo "=========================="
|
||
echo "✅ 创建完成!VM 信息:"
|
||
echo "--------------------------"
|
||
echo "资源组: $GROUP_NAME"
|
||
echo "VM 名称: $VM_NAME"
|
||
echo "Public IPv4: $IPV4_ADDRESS"
|
||
echo "Public IPv6: $IPV6_ADDRESS"
|
||
echo "--------------------------"
|
||
echo "SSH (IPv4): ssh ubuntu@$IPV4_ADDRESS"
|
||
echo "SSH (IPv6): ssh ubuntu@\"$IPV6_ADDRESS\""
|
||
echo "=========================="
|
||
|
||
# =========================
|
||
# 8. (可选) 执行重装脚本
|
||
# =========================
|
||
if [[ "$REINSTALL_FLAG" == "true" ]]; then
|
||
echo "INFO: 检测到 --reinstall, 正在执行重装脚本..."
|
||
bash az_reinstall.sh --ip "$IPV4_ADDRESS" --max-tries 200 --resolve "$LOCATION.proxy"
|
||
echo "INFO: 重装脚本执行完毕。"
|
||
fi |