添加 az_create.sh

This commit is contained in:
2025-12-05 09:54:52 +08:00
commit 6a06a5f58a

243
az_create.sh Normal file
View File

@@ -0,0 +1,243 @@
#!/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