添加 az_create.sh
This commit is contained in:
243
az_create.sh
Normal file
243
az_create.sh
Normal 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
|
||||
Reference in New Issue
Block a user