添加 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