Files
tools/az_create.sh
2025-12-05 09:54:52 +08:00

243 lines
6.7 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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