Create vps_manager.sh
管理google cloud vps
This commit is contained in:
parent
f2263e4340
commit
3ea3bf3499
894
vps_manager.sh
Normal file
894
vps_manager.sh
Normal file
@ -0,0 +1,894 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 菜单函数,显示选项
|
||||||
|
show_menu() {
|
||||||
|
echo "====================================="
|
||||||
|
echo " Google Cloud 管理脚本 "
|
||||||
|
echo "====================================="
|
||||||
|
echo "1. 添加账号"
|
||||||
|
echo "2. 删除账号"
|
||||||
|
echo "3. 查看所有账号"
|
||||||
|
echo "4. 切换默认账号"
|
||||||
|
echo "5. 添加项目"
|
||||||
|
echo "6. 删除项目"
|
||||||
|
echo "7. 查看所有项目"
|
||||||
|
echo "8. 切换默认项目"
|
||||||
|
echo "9. 查看虚拟机列表"
|
||||||
|
echo "10. 创建虚拟机"
|
||||||
|
echo "11. 删除虚拟机"
|
||||||
|
echo "0. 退出脚本"
|
||||||
|
echo "====================================="
|
||||||
|
echo "请输入选项(0-11):"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 获取当前日期,格式为 YYYYMMDD
|
||||||
|
get_current_date() {
|
||||||
|
date +%Y%m%d
|
||||||
|
}
|
||||||
|
|
||||||
|
# 生成四个随机字符
|
||||||
|
generate_random_suffix() {
|
||||||
|
cat /dev/urandom | tr -dc 'a-z0-9' | head -c 4
|
||||||
|
}
|
||||||
|
|
||||||
|
# 获取当前项目的实例配额和已使用数量
|
||||||
|
get_instance_quota() {
|
||||||
|
local project=$1
|
||||||
|
local zone=$2
|
||||||
|
local region=$(echo "$zone" | sed 's/-[a-z]$//')
|
||||||
|
if [ -z "$region" ]; then
|
||||||
|
echo "无法从区域 $zone 提取大区域信息。"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo "正在获取区域 $region 的配额信息..."
|
||||||
|
quota_info=$(gcloud compute regions describe "$region" --project="$project" --format="json(quotas)" 2>/dev/null)
|
||||||
|
if [ -z "$quota_info" ]; then
|
||||||
|
echo "无法获取配额信息,请检查 gcloud 配置、网络连接或区域是否正确。"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
quota_limit=$(echo "$quota_info" | grep -A 2 '"metric": "CPUS"' | grep '"limit"' | awk '{print $2}' | tr -d ',' | grep -o '[0-9]*')
|
||||||
|
quota_usage=$(echo "$quota_info" | grep -A 2 '"metric": "CPUS"' | grep '"usage"' | awk '{print $2}' | tr -d ',' | grep -o '[0-9]*')
|
||||||
|
if [ -z "$quota_limit" ] || [ -z "$quota_usage" ]; then
|
||||||
|
echo "无法解析配额数据,可能是输出格式问题。"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
local available_cpus=$((quota_limit - quota_usage))
|
||||||
|
local max_instances=$((available_cpus / 2))
|
||||||
|
if [ "$max_instances" -lt 0 ]; then
|
||||||
|
max_instances=0
|
||||||
|
fi
|
||||||
|
echo "$max_instances"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# 动态获取支持 e2-micro 的区域和可用区,并分组
|
||||||
|
get_regions_and_zones() {
|
||||||
|
echo "正在获取支持 e2-micro 机器类型的区域和可用区..."
|
||||||
|
zones=$(gcloud compute machine-types list --filter="name=e2-micro" --format="value(ZONE)" --limit=1000 2>/dev/null | sort | uniq)
|
||||||
|
if [ -z "$zones" ]; then
|
||||||
|
echo "无法获取可用区列表,请检查 gcloud 配置或网络连接。"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
declare -g -A region_map
|
||||||
|
declare -g -a regions
|
||||||
|
regions=()
|
||||||
|
IFS=$'\n'
|
||||||
|
for zone in $zones; do
|
||||||
|
region=$(echo "$zone" | cut -d'-' -f1)
|
||||||
|
if [[ ! " ${regions[@]} " =~ " ${region} " ]]; then
|
||||||
|
regions+=("$region")
|
||||||
|
fi
|
||||||
|
region_map["$region"]="${region_map[$region]} $zone"
|
||||||
|
done
|
||||||
|
unset IFS
|
||||||
|
if [ ${#regions[@]} -eq 0 ]; then
|
||||||
|
echo "未找到支持 e2-micro 的大区域。"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# 显示大区域选择菜单
|
||||||
|
show_region_menu() {
|
||||||
|
echo "请选择大区域:"
|
||||||
|
local i=1
|
||||||
|
for region in "${regions[@]}"; do
|
||||||
|
echo "$i. $region"
|
||||||
|
((i++))
|
||||||
|
done
|
||||||
|
echo "0. 取消选择"
|
||||||
|
echo "请输入选项(0-$((i-1))):"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 显示具体可用区选择菜单
|
||||||
|
show_zone_menu() {
|
||||||
|
local region=$1
|
||||||
|
echo "请选择具体可用区($region):"
|
||||||
|
local zones_list=(${region_map["$region"]})
|
||||||
|
if [ ${#zones_list[@]} -eq 0 ]; then
|
||||||
|
echo "未找到 $region 区域下支持 e2-micro 的可用区。"
|
||||||
|
echo "0. 取消选择"
|
||||||
|
echo "请输入选项(0-0):"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
local i=1
|
||||||
|
for zone in "${zones_list[@]}"; do
|
||||||
|
echo "$i. $zone"
|
||||||
|
((i++))
|
||||||
|
done
|
||||||
|
echo "0. 取消选择"
|
||||||
|
echo "请输入选项(0-$((i-1))):"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# 显示地区选择方式菜单
|
||||||
|
show_zone_selection_method() {
|
||||||
|
echo "请选择地区选择方式:"
|
||||||
|
local default_zone=$(gcloud config get-value compute/zone 2>/dev/null)
|
||||||
|
if [ -n "$default_zone" ]; then
|
||||||
|
echo "1. 使用默认地区:$default_zone"
|
||||||
|
else
|
||||||
|
echo "1. 使用默认地区(未设置,需手动指定)"
|
||||||
|
fi
|
||||||
|
echo "2. 自动获取并选择支持 e2-micro 的区域"
|
||||||
|
echo "3. 修改默认地区"
|
||||||
|
echo "0. 取消选择"
|
||||||
|
echo "请输入选项(0-3):"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 获取当前项目下的虚拟机列表
|
||||||
|
get_instance_list() {
|
||||||
|
local project=$1
|
||||||
|
instance_list=$(gcloud compute instances list --project="$project" --format="value(NAME,ZONE)" 2>/dev/null)
|
||||||
|
if [ -z "$instance_list" ]; then
|
||||||
|
echo "无法获取虚拟机列表,请检查 gcloud 配置或网络连接。"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo "$instance_list"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# 显示虚拟机列表并返回数组
|
||||||
|
show_instance_menu() {
|
||||||
|
local instance_data="$1"
|
||||||
|
declare -g -a instance_array
|
||||||
|
instance_array=()
|
||||||
|
echo "当前项目下的虚拟机列表:"
|
||||||
|
if [ -z "$instance_data" ]; then
|
||||||
|
echo "没有找到虚拟机。"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
local i=1
|
||||||
|
IFS=$'\n'
|
||||||
|
for line in $instance_data; do
|
||||||
|
if [ -z "$line" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
instance_name=$(echo "$line" | awk '{print $1}')
|
||||||
|
instance_zone=$(echo "$line" | awk '{print $2}')
|
||||||
|
if [ -n "$instance_name" ] && [ -n "$instance_zone" ]; then
|
||||||
|
echo "$i. $instance_name (区域: $instance_zone)"
|
||||||
|
instance_array+=("$instance_name|$instance_zone")
|
||||||
|
((i++))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
unset IFS
|
||||||
|
if [ ${#instance_array[@]} -eq 0 ]; then
|
||||||
|
echo "没有找到虚拟机。"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# 获取所有账号列表
|
||||||
|
get_account_list() {
|
||||||
|
account_list=$(gcloud auth list --format="value(ACCOUNT)" 2>/dev/null)
|
||||||
|
if [ -z "$account_list" ]; then
|
||||||
|
echo "无法获取账号列表,请检查 gcloud 配置或网络连接。"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo "$account_list"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# 显示账号列表并返回数组
|
||||||
|
show_account_menu() {
|
||||||
|
local account_data="$1"
|
||||||
|
declare -g -a account_array
|
||||||
|
account_array=()
|
||||||
|
echo "当前已配置的账号列表:"
|
||||||
|
if [ -z "$account_data" ]; then
|
||||||
|
echo "没有找到已配置的账号。"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
local i=1
|
||||||
|
IFS=$'\n'
|
||||||
|
for account in $account_data; do
|
||||||
|
if [ -n "$account" ]; then
|
||||||
|
active_mark=""
|
||||||
|
if [[ "$account" == *"(active)"* ]]; then
|
||||||
|
active_mark=" (当前默认)"
|
||||||
|
account=$(echo "$account" | sed 's/ (active)//')
|
||||||
|
fi
|
||||||
|
echo "$i. $account$active_mark"
|
||||||
|
account_array+=("$account")
|
||||||
|
((i++))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
unset IFS
|
||||||
|
if [ ${#account_array[@]} -eq 0 ]; then
|
||||||
|
echo "没有找到已配置的账号。"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# 获取所有项目列表
|
||||||
|
get_project_list() {
|
||||||
|
project_list=$(gcloud projects list --format="value(PROJECT_ID,NAME)" 2>/dev/null)
|
||||||
|
if [ -z "$project_list" ]; then
|
||||||
|
echo "无法获取项目列表,请检查 gcloud 配置或网络连接。"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo "$project_list"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# 显示项目列表并返回数组
|
||||||
|
show_project_menu() {
|
||||||
|
local project_data="$1"
|
||||||
|
declare -g -a project_array
|
||||||
|
project_array=()
|
||||||
|
echo "当前可用的项目列表:"
|
||||||
|
if [ -z "$project_data" ]; then
|
||||||
|
echo "没有找到项目。"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
local i=1
|
||||||
|
IFS=$'\n'
|
||||||
|
for line in $project_data; do
|
||||||
|
if [ -z "$line" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
project_id=$(echo "$line" | awk '{print $1}')
|
||||||
|
project_name=$(echo "$line" | awk '{$1=""; print $0}' | sed 's/^ //')
|
||||||
|
if [ -n "$project_id" ]; then
|
||||||
|
current_mark=""
|
||||||
|
current_project=$(gcloud config get-value project 2>/dev/null)
|
||||||
|
if [ "$project_id" == "$current_project" ]; then
|
||||||
|
current_mark=" (当前默认)"
|
||||||
|
fi
|
||||||
|
echo "$i. $project_id - $project_name$current_mark"
|
||||||
|
project_array+=("$project_id")
|
||||||
|
((i++))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
unset IFS
|
||||||
|
if [ ${#project_array[@]} -eq 0 ]; then
|
||||||
|
echo "没有找到项目。"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# 主循环
|
||||||
|
while true; do
|
||||||
|
show_menu
|
||||||
|
read -e -r choice # 使用 -e 参数启用 readline 支持删除键等功能
|
||||||
|
|
||||||
|
case $choice in
|
||||||
|
1)
|
||||||
|
echo "正在添加账号..."
|
||||||
|
echo "请按照提示完成账号登录流程(浏览器将打开进行身份验证):"
|
||||||
|
gcloud auth login
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "账号添加成功!"
|
||||||
|
else
|
||||||
|
echo "账号添加失败,请检查网络连接或权限。"
|
||||||
|
fi
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
echo "正在删除账号..."
|
||||||
|
account_data=$(get_account_list)
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
show_account_menu "$account_data"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "0. 取消选择"
|
||||||
|
echo "请输入要删除的账号编号(多个编号用空格分隔,例如 '1 2',输入 'all' 删除全部非默认账号):"
|
||||||
|
read -e -r input_selection
|
||||||
|
if [ -z "$input_selection" ] || [ "$input_selection" == "0" ]; then
|
||||||
|
echo "操作取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 处理用户选择
|
||||||
|
declare -a selected_accounts
|
||||||
|
current_account=$(gcloud auth list --format="value(ACCOUNT)" | grep "(active)" | sed 's/ (active)//')
|
||||||
|
if [ "$input_selection" == "all" ] || [ "$input_selection" == "ALL" ]; then
|
||||||
|
for account in "${account_array[@]}"; do
|
||||||
|
if [ "$account" != "$current_account" ]; then
|
||||||
|
selected_accounts+=("$account")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
else
|
||||||
|
IFS=' ' read -ra selections <<< "$input_selection"
|
||||||
|
for sel in "${selections[@]}"; do
|
||||||
|
if [[ "$sel" =~ ^[0-9]+$ ]] && [ "$sel" -ge 1 ] && [ "$sel" -le "${#account_array[@]}" ]; then
|
||||||
|
account="${account_array[$((sel-1))]}"
|
||||||
|
if [ "$account" != "$current_account" ]; then
|
||||||
|
selected_accounts+=("$account")
|
||||||
|
else
|
||||||
|
echo "无法删除当前默认账号:$account,已忽略。"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "无效选项:$sel,已忽略。"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
unset IFS
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 如果没有有效选择
|
||||||
|
if [ ${#selected_accounts[@]} -eq 0 ]; then
|
||||||
|
echo "没有有效的账号被选中,操作取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 确认删除
|
||||||
|
echo "您选择了以下账号进行删除:"
|
||||||
|
for account in "${selected_accounts[@]}"; do
|
||||||
|
echo "- $account"
|
||||||
|
done
|
||||||
|
echo "确认删除这些账号吗?(输入 'yes' 确认,任意其他输入取消):"
|
||||||
|
read -e -r confirm
|
||||||
|
if [ "$confirm" != "yes" ] && [ "$confirm" != "YES" ]; then
|
||||||
|
echo "删除操作已取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 执行删除操作
|
||||||
|
echo "正在删除选中的账号..."
|
||||||
|
for account in "${selected_accounts[@]}"; do
|
||||||
|
echo "删除 $account..."
|
||||||
|
gcloud auth revoke "$account" --quiet 2>/dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "账号 $account 删除成功!"
|
||||||
|
else
|
||||||
|
echo "账号 $account 删除失败,请检查错误信息。"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
echo "正在查看所有账号..."
|
||||||
|
account_data=$(get_account_list)
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
show_account_menu "$account_data"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
;;
|
||||||
|
4)
|
||||||
|
echo "正在切换默认账号..."
|
||||||
|
account_data=$(get_account_list)
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
show_account_menu "$account_data"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "0. 取消选择"
|
||||||
|
echo "请输入要设置为默认账号的编号:"
|
||||||
|
read -e -r selection
|
||||||
|
if [ -z "$selection" ] || [ "$selection" == "0" ]; then
|
||||||
|
echo "操作取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if [[ "$selection" =~ ^[0-9]+$ ]] && [ "$selection" -ge 1 ] && [ "$selection" -le "${#account_array[@]}" ]; then
|
||||||
|
selected_account="${account_array[$((selection-1))]}"
|
||||||
|
echo "正在将默认账号切换为 $selected_account..."
|
||||||
|
gcloud config set account "$selected_account"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "默认账号已切换为 $selected_account!"
|
||||||
|
else
|
||||||
|
echo "切换默认账号失败,请检查错误信息。"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "无效选项,操作取消。"
|
||||||
|
fi
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
;;
|
||||||
|
5)
|
||||||
|
echo "正在添加项目..."
|
||||||
|
echo "请输入项目 ID(小写字母、数字或短划线组成,例如 my-project-123):"
|
||||||
|
read -e -r project_id
|
||||||
|
if [ -z "$project_id" ]; then
|
||||||
|
echo "未输入项目 ID,操作取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "请输入项目名称(可包含空格,例如 My Project):"
|
||||||
|
read -e -r project_name
|
||||||
|
if [ -z "$project_name" ]; then
|
||||||
|
echo "未输入项目名称,操作取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "正在创建项目 $project_id ($project_name)..."
|
||||||
|
gcloud projects create "$project_id" --name="$project_name"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "项目 $project_id 创建成功!"
|
||||||
|
else
|
||||||
|
echo "项目创建失败,请检查项目 ID 是否唯一或是否有权限。"
|
||||||
|
fi
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
;;
|
||||||
|
6)
|
||||||
|
echo "正在删除项目..."
|
||||||
|
project_data=$(get_project_list)
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
show_project_menu "$project_data"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "0. 取消选择"
|
||||||
|
echo "请输入要删除的项目编号(多个编号用空格分隔,例如 '1 2',输入 'all' 删除全部非默认项目):"
|
||||||
|
read -e -r input_selection
|
||||||
|
if [ -z "$input_selection" ] || [ "$input_selection" == "0" ]; then
|
||||||
|
echo "操作取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 处理用户选择
|
||||||
|
declare -a selected_projects
|
||||||
|
current_project=$(gcloud config get-value project 2>/dev/null)
|
||||||
|
if [ "$input_selection" == "all" ] || [ "$input_selection" == "ALL" ]; then
|
||||||
|
for project in "${project_array[@]}"; do
|
||||||
|
if [ "$project" != "$current_project" ]; then
|
||||||
|
selected_projects+=("$project")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
else
|
||||||
|
IFS=' ' read -ra selections <<< "$input_selection"
|
||||||
|
for sel in "${selections[@]}"; do
|
||||||
|
if [[ "$sel" =~ ^[0-9]+$ ]] && [ "$sel" -ge 1 ] && [ "$sel" -le "${#project_array[@]}" ]; then
|
||||||
|
project="${project_array[$((sel-1))]}"
|
||||||
|
if [ "$project" != "$current_project" ]; then
|
||||||
|
selected_projects+=("$project")
|
||||||
|
else
|
||||||
|
echo "无法删除当前默认项目:$project,已忽略。"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "无效选项:$sel,已忽略。"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
unset IFS
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 如果没有有效选择
|
||||||
|
if [ ${#selected_projects[@]} -eq 0 ]; then
|
||||||
|
echo "没有有效的项目被选中,操作取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 确认删除
|
||||||
|
echo "您选择了以下项目进行删除:"
|
||||||
|
for project in "${selected_projects[@]}"; do
|
||||||
|
echo "- $project"
|
||||||
|
done
|
||||||
|
echo "确认删除这些项目吗?(输入 'yes' 确认,任意其他输入取消):"
|
||||||
|
read -e -r confirm
|
||||||
|
if [ "$confirm" != "yes" ] && [ "$confirm" != "YES" ]; then
|
||||||
|
echo "删除操作已取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 执行删除操作
|
||||||
|
echo "正在删除选中的项目..."
|
||||||
|
for project in "${selected_projects[@]}"; do
|
||||||
|
echo "删除 $project..."
|
||||||
|
gcloud projects delete "$project" --quiet 2>/dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "项目 $project 删除成功!"
|
||||||
|
else
|
||||||
|
echo "项目 $project 删除失败,请检查错误信息或是否有权限。"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
;;
|
||||||
|
7)
|
||||||
|
echo "正在查看所有项目..."
|
||||||
|
project_data=$(get_project_list)
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
show_project_menu "$project_data"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
;;
|
||||||
|
8)
|
||||||
|
echo "正在切换默认项目..."
|
||||||
|
project_data=$(get_project_list)
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
show_project_menu "$project_data"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "0. 取消选择"
|
||||||
|
echo "请输入要设置为默认项目的编号:"
|
||||||
|
read -e -r selection
|
||||||
|
if [ -z "$selection" ] || [ "$selection" == "0" ]; then
|
||||||
|
echo "操作取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if [[ "$selection" =~ ^[0-9]+$ ]] && [ "$selection" -ge 1 ] && [ "$selection" -le "${#project_array[@]}" ]; then
|
||||||
|
selected_project="${project_array[$((selection-1))]}"
|
||||||
|
echo "正在将默认项目切换为 $selected_project..."
|
||||||
|
gcloud config set project "$selected_project"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "默认项目已切换为 $selected_project!"
|
||||||
|
else
|
||||||
|
echo "切换默认项目失败,请检查错误信息或是否有权限。"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "无效选项,操作取消。"
|
||||||
|
fi
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
;;
|
||||||
|
9)
|
||||||
|
echo "正在查看虚拟机列表..."
|
||||||
|
current_project=$(gcloud config get-value project)
|
||||||
|
if [ -z "$current_project" ]; then
|
||||||
|
echo "未找到默认项目,请先切换默认项目(选项 8)。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "当前默认项目:$current_project"
|
||||||
|
instance_data=$(get_instance_list "$current_project")
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
show_instance_menu "$instance_data"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
;;
|
||||||
|
10)
|
||||||
|
echo "正在创建虚拟机..."
|
||||||
|
current_project=$(gcloud config get-value project)
|
||||||
|
if [ -z "$current_project" ]; then
|
||||||
|
echo "未找到默认项目,请先切换默认项目(选项 8)。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "当前默认项目:$current_project"
|
||||||
|
current_date=$(get_current_date)
|
||||||
|
echo "当前日期:$current_date"
|
||||||
|
echo "请输入机器标识符(如 us01, sg002):"
|
||||||
|
read -e -r machine_id
|
||||||
|
if [ -z "$machine_id" ]; then
|
||||||
|
echo "未输入机器标识符,操作取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 选择地区选择方式
|
||||||
|
while true; do
|
||||||
|
show_zone_selection_method
|
||||||
|
read -e -r method_choice
|
||||||
|
if [ "$method_choice" -eq 0 ]; then
|
||||||
|
echo "操作取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue 2
|
||||||
|
elif [ "$method_choice" -eq 1 ]; then
|
||||||
|
default_zone=$(gcloud config get-value compute/zone 2>/dev/null)
|
||||||
|
if [ -n "$default_zone" ]; then
|
||||||
|
echo "使用默认地区:$default_zone"
|
||||||
|
zone="$default_zone"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo "未设置默认地区,请手动输入一个区域作为默认地区(如 us-central1-a):"
|
||||||
|
read -e -r input_zone
|
||||||
|
if [ -z "$input_zone" ]; then
|
||||||
|
echo "未输入区域,操作取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue 2
|
||||||
|
fi
|
||||||
|
echo "正在设置默认地区为 $input_zone..."
|
||||||
|
gcloud config set compute/zone "$input_zone"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "默认地区已设置为 $input_zone"
|
||||||
|
zone="$input_zone"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo "设置默认地区失败,请检查区域格式或权限。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue 2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
elif [ "$method_choice" -eq 2 ]; then
|
||||||
|
get_regions_and_zones
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue 2
|
||||||
|
fi
|
||||||
|
while true; do
|
||||||
|
show_region_menu
|
||||||
|
read -e -r region_choice
|
||||||
|
if [ "$region_choice" -eq 0 ]; then
|
||||||
|
echo "操作取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue 3
|
||||||
|
fi
|
||||||
|
if [ "$region_choice" -ge 1 ] && [ "$region_choice" -le "${#regions[@]}" ]; then
|
||||||
|
region="${regions[$((region_choice-1))]}"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo "无效选项,请选择 0-${#regions[@]} 之间的数字。"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "选择的大区域:$region"
|
||||||
|
while true; do
|
||||||
|
show_zone_menu "$region"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "操作取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue 3
|
||||||
|
fi
|
||||||
|
read -e -r zone_choice
|
||||||
|
zones_list=(${region_map["$region"]})
|
||||||
|
if [ "$zone_choice" -eq 0 ]; then
|
||||||
|
echo "操作取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue 3
|
||||||
|
fi
|
||||||
|
if [ "$zone_choice" -ge 1 ] && [ "$zone_choice" -le "${#zones_list[@]}" ]; then
|
||||||
|
zone="${zones_list[$((zone_choice-1))]}"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo "无效选项,请选择 0-${#zones_list[@]} 之间的数字。"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "选择的可用区:$zone"
|
||||||
|
break
|
||||||
|
elif [ "$method_choice" -eq 3 ]; then
|
||||||
|
echo "请输入新的默认地区(如 us-central1-a):"
|
||||||
|
read -e -r new_zone
|
||||||
|
if [ -z "$new_zone" ]; then
|
||||||
|
echo "未输入区域,操作取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue 2
|
||||||
|
fi
|
||||||
|
echo "正在设置默认地区为 $new_zone..."
|
||||||
|
gcloud config set compute/zone "$new_zone"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "默认地区已更新为 $new_zone"
|
||||||
|
else
|
||||||
|
echo "设置默认地区失败,请检查区域格式或权限。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue 2
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "无效选项,请选择 0-3 之间的数字。"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 直接提示用户输入创建数量
|
||||||
|
while true; do
|
||||||
|
echo "请输入要创建的虚拟机数量(大于 0 的整数):"
|
||||||
|
read -e -r instance_count
|
||||||
|
if [[ ! "$instance_count" =~ ^[0-9]+$ ]] || [ "$instance_count" -le 0 ]; then
|
||||||
|
echo "无效输入,请输入大于 0 的整数。"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
break
|
||||||
|
done
|
||||||
|
|
||||||
|
# 批量创建虚拟机
|
||||||
|
echo "将创建 $instance_count 台虚拟机..."
|
||||||
|
for ((i=1; i<=instance_count; i++)); do
|
||||||
|
random_suffix=$(generate_random_suffix)
|
||||||
|
instance_name="instance-${current_date}-${machine_id}-${random_suffix}"
|
||||||
|
device_name="$instance_name"
|
||||||
|
echo "正在创建第 $i 台虚拟机:$instance_name..."
|
||||||
|
gcloud compute instances create "$instance_name" \
|
||||||
|
--project="$current_project" \
|
||||||
|
--zone="$zone" \
|
||||||
|
--machine-type=e2-micro \
|
||||||
|
--network-interface=network-tier=PREMIUM,stack-type=IPV4_ONLY,subnet=default \
|
||||||
|
--metadata=ssh-keys=root:ssh-rsa\ AAAAB3NzaC1yc2EAAAADAQABAAABgQDVw/Lamb8wHXeLgCKGbumrocMvq+a6goVFBAuhYk/TVUoislrO1SrrH5YMFc7aQMZNP/mbubirIck8h0wT8hiU070OHO7HuaAyIGgFh4icIX/m7znhvWteG/evxJUN95ZWm4bk+UmGUbbAO4BkSEGub/ENJ3RGR9eJuDabgMha5fyzl9J9sm6jDeXVyGtLOy9NkYYHo/J0kUAwK1YOQ88rAXIhsJ04qsH7256VAdo6enO39Y0RG4NhK3hlRYP46f8NWyCaJFbcz4tpbHNdG9Xbqg7j/RSn7tO5bpB283m/wsZR7kM28x9dzyojJJYycEn9CTUzBjxcBBuKNa57Y+eoBo7q2KXx13ziMvO5k7Bl8GXknl0uguf49hjbPS95CThns+sqz7G3Px8a79BJ1rHEewlmMMJUa/kRY+NAcum0nVkWzZIpR6I2KWMP+8OaJLj97vIHgGydRP8y4I6IiiZBlOlshNJ3iI/XxsSWjWjdWxSHUZtHj4L1IaxclrX+QtU=\ root@gc-hk.asia-east2-c.c.annular-bucksaw-448504-h3.internal \
|
||||||
|
--maintenance-policy=MIGRATE \
|
||||||
|
--provisioning-model=STANDARD \
|
||||||
|
--scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/trace.append \
|
||||||
|
--create-disk=auto-delete=yes,boot=yes,device-name="$device_name",image=projects/debian-cloud/global/images/debian-12-bookworm-v20250513,mode=rw,size=10,type=pd-standard \
|
||||||
|
--no-shielded-secure-boot \
|
||||||
|
--shielded-vtpm \
|
||||||
|
--shielded-integrity-monitoring \
|
||||||
|
--labels=goog-ec-src=vm_add-gcloud \
|
||||||
|
--reservation-affinity=any
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "第 $i 台虚拟机 $instance_name 创建成功!"
|
||||||
|
else
|
||||||
|
echo "第 $i 台虚拟机 $instance_name 创建失败,请检查错误信息。"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
;;
|
||||||
|
11)
|
||||||
|
echo "正在删除虚拟机..."
|
||||||
|
current_project=$(gcloud config get-value project)
|
||||||
|
if [ -z "$current_project" ]; then
|
||||||
|
echo "未找到默认项目,请先切换默认项目(选项 8)。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "当前默认项目:$current_project"
|
||||||
|
|
||||||
|
# 获取虚拟机列表
|
||||||
|
instance_data=$(get_instance_list "$current_project")
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 显示虚拟机列表
|
||||||
|
show_instance_menu "$instance_data"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 提示用户选择要删除的虚拟机
|
||||||
|
echo "0. 取消选择"
|
||||||
|
echo "请输入要删除的虚拟机编号(多个编号用空格分隔,例如 '1 2 3',输入 'all' 删除全部):"
|
||||||
|
read -e -r input_selection
|
||||||
|
if [ -z "$input_selection" ] || [ "$input_selection" == "0" ]; then
|
||||||
|
echo "操作取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 处理用户选择
|
||||||
|
declare -a selected_instances
|
||||||
|
if [ "$input_selection" == "all" ] || [ "$input_selection" == "ALL" ]; then
|
||||||
|
for instance in "${instance_array[@]}"; do
|
||||||
|
selected_instances+=("$instance")
|
||||||
|
done
|
||||||
|
else
|
||||||
|
IFS=' ' read -ra selections <<< "$input_selection"
|
||||||
|
for sel in "${selections[@]}"; do
|
||||||
|
if [[ "$sel" =~ ^[0-9]+$ ]] && [ "$sel" -ge 1 ] && [ "$sel" -le "${#instance_array[@]}" ]; then
|
||||||
|
selected_instances+=("${instance_array[$((sel-1))]}")
|
||||||
|
else
|
||||||
|
echo "无效选项:$sel,已忽略。"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
unset IFS
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 如果没有有效选择
|
||||||
|
if [ ${#selected_instances[@]} -eq 0 ]; then
|
||||||
|
echo "没有有效的虚拟机被选中,操作取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 确认删除
|
||||||
|
echo "您选择了以下虚拟机进行删除:"
|
||||||
|
for inst in "${selected_instances[@]}"; do
|
||||||
|
instance_name=$(echo "$inst" | cut -d'|' -f1)
|
||||||
|
instance_zone=$(echo "$inst" | cut -d'|' -f2)
|
||||||
|
echo "- $instance_name (区域: $instance_zone)"
|
||||||
|
done
|
||||||
|
echo "确认删除这些虚拟机吗?(输入 'yes' 确认,任意其他输入取消):"
|
||||||
|
read -e -r confirm
|
||||||
|
if [ "$confirm" != "yes" ] && [ "$confirm" != "YES" ]; then
|
||||||
|
echo "删除操作已取消。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 执行删除操作
|
||||||
|
echo "正在删除选中的虚拟机..."
|
||||||
|
for inst in "${selected_instances[@]}"; do
|
||||||
|
instance_name=$(echo "$inst" | cut -d'|' -f1)
|
||||||
|
instance_zone=$(echo "$inst" | cut -d'|' -f2)
|
||||||
|
echo "删除 $instance_name (区域: $instance_zone)..."
|
||||||
|
gcloud compute instances delete "$instance_name" \
|
||||||
|
--project="$current_project" \
|
||||||
|
--zone="$instance_zone" \
|
||||||
|
--quiet 2>/dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "虚拟机 $instance_name 删除成功!"
|
||||||
|
else
|
||||||
|
echo "虚拟机 $instance_name 删除失败,请检查错误信息。"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
;;
|
||||||
|
0)
|
||||||
|
echo "退出脚本..."
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "无效选项,请选择 0-11 之间的数字。"
|
||||||
|
echo "按任意键返回菜单..."
|
||||||
|
read -e -r -n 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
Loading…
x
Reference in New Issue
Block a user