SHELL脚本 | 移动云 云主机批量自动重装操作系统(Cookie版)

移动云控制台单次批量重装一次只能20台,大批量主机重装如果从控制台进行操作,妥妥的苦力活,为了解放双手,需要实现自动的批量重装,通过chrome开发者工具抓取重装系统的请求信息,通过shell脚本批量请求实现自动化的批量重装操作
使用前需要注意
1.运行环境为linux环境(Windows环境可以通过WSL方式运行)
2.需要提前安装 jq
3.需要登录移动云账号后提取对应的cookie
4.需要准备要重装的主机ID清单,每行一个主机ID
5.每次只能对单节点的主机进行批量处理,清单内的主机ID需要保证都是同一节点
具体操作步骤
安装依赖软件
#centos 安装
yum install jq
#ubuntu 安装
apt install jq
获取移动云登录cookie
使用chrome浏览器 登录移动云网站后,按F12,切换到【网络】标签,刷新页面,搜索 user 找到请求标头中的Cookie 可以看到后面有一大串值,我们只需要取 CMECLOUDTOKEN 等号后面 分号前面的这一串字符就行了

获取镜像ID
访问:https://console.ecloud.10086.cn/api/page/ims-ui-console/image/public?productType=image&poolId=CIDC-RP-26&v=new 查看需要重装的操作系统的ID
准备主机ID文件
把需要重装的主机ID保存到文本文件里,一行一个ID,例如d42f788b-f8cd-4f80-a50b-efa9f4be6256
b0cb3188-e4e3-4d5a-ba15-793964bd5f6f
3b537ec5-fb94-474e-a26c-25eb4e565c0a
2abc2e88-4169-4e84-a918-46f4088dd45f
21cf3525-f853-4645-8713-d8369241d4a1
b86ff10e-6d6e-4e09-bb42-30a49c8b77f9
bf58c479-8ee7-43fb-9458-3ea9252b8be4
38a99b73-19ec-4711-bf11-7e3e91ebb0c5
1566aef3-5ecd-4d62-8272-b613b470d13d
e5ec7bb8-bd2c-4535-83b9-d7d0bb37f27a
执行代码
保存下面的代码到执行环境中,并给与执行权限
chomod +x rebuild_ecs.sh
#替换掉Windows下的换行符
sed -i 's/\r$//' rebuild_ecs.sh
#! /bin/bash
# author:[onebyte]
# date:[2025-02-28]
# version:[1.0]
# description:[用于对云主机批量进行重新,只支持单节点批量重装]
# usage:[usage:rebuild.sh 节点ID cookie_token]
##################################
if [ -z "$1" ]; then
echo "请输入节点ID,ID格式:CIDC-RP-32"
exit 1
fi
pool_id="$1"
if [ -z "$2" ]; then
echo "请输入移动云COOKIE"
exit 1
fi
cookie="CMECLOUDTOKEN=$2;"
call_api() {
local method=$1
local url=$2
local data=$3
local other=$4
local debug=$5
local curl_args=(
"-s"
"-X" "$method"
"-H" "Cookie: $cookie"
"-H" "Pool-Id: $pool_id"
"-H" "Content-Type: application/json" $4
)
if [[ "$debug" == "1" ]]; then
curl_args[0]="-vv"
fi
if [[ "$method" != "GET" && -n "$data" ]]; then
curl_args+=("--data" "$data")
fi
curl_args+=("$url")
curl "${curl_args[@]}"
}
# 二次确认
confirm_action() {
local prompt="$1"
local default_action="$2"
while true; do
read -p "$prompt (yes/no) [$default_action]: " confirm
case "$confirm" in
[Yy][Ee][Ss]|[Yy])
return 0 # 用户确认执行操作
;;
[Nn][Oo]|[Nn])
return 1 # 用户取消操作
;;
"")
if [[ "$default_action" == "yes" ]]; then
return 0 # 使用默认操作 yes
else
return 1 # 使用默认操作 no
fi
;;
*)
echo "无效输入,请输入 yes 或 no。"
;;
esac
done
}
validate_password() {
local password=$1
# 检查长度是否在8-16位之间
if [[ ${#password} -lt 8 || ${#password} -gt 16 ]]; then
return 1
fi
# 检查是否包含数字、大小写字母和特殊字符
if ! [[ $password =~ [0-9] && $password =~ [A-Z] && $password =~ [a-z] && $password =~ [\~\@\#\$\%\*\_\-\+\=\,\.\?$$\{\}] ]]; then
return 1
fi
# 检查是否有3个及以上连续或重复的数字
if [[ $password =~ ([0-9])\1{2,} || $password =~ 123|234|345|456|567|678|789|890 ]]; then
return 1
fi
# 检查特殊字符数量
local special_count=$(echo "$password" | grep -o '[\~\@\#\$\%\*\_\-\+\=\,\.\?$$\{\}]' | wc -l)
if [[ $special_count -gt 3 ]]; then
return 1
fi
return 0
}
rebuild_ecs(){
#多线程
local max_concurrent=20
local counter=0
public_key="-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/VpRysi0bPRLS7sbgQDJHo1MAt9/bK+nwK5Pe3z0/O4cH5I/8kFNYy4yFsLMM+zyFvVw9C4wzjHaRcmEuF3ziJMC9PD5ufUWgfO5nSGgZW1cmgjqnhcWJ3i+Azj72RnhKQRCn9DgJduEC9MiKfbyTICGd6FXf9cxb21nkxI7vtwIDAQAB
-----END PUBLIC KEY-----"
read -p "请输入需要重装的云主机ID清单:" input_file && sed -i 's/\r$//' $input_file
while true; do
read -s -p "请输入需要设置的系统密码: " password
if validate_password "$password"; then
echo "密码有效"
# 使用给定的公钥加密密码
adminPass=$(echo -n "$password" | openssl rsautl -encrypt -pubin -inkey <(echo -e "$public_key") | base64 -w 0 )
break
else
echo "密码不符合要求,请重试。"
fi
done
read -p "请输入需要镜像ID:" imageId
echo -e "需要重装为 \e[33m $(call_api "GET" "https://console.ecloud.10086.cn/api/web/routes/ims-backend-console/user/v3/image/server/public?page=1&size=1500" | jq -r '.body.content[] | select(.imageId=="'$imageId'") | "\(.name)"')\e[0m"
# 二次确认操作
if ! confirm_action "请再次确认是否对 $input_file 清单中的主机执重装系统操作" "no"; then
echo "操作已取消。"
exit 0
fi
echo "**********************************"
while IFS= read -r ecs_id;do
(
data=$(printf '{"imageId":"%s","serverId":"%s","credibleStatus":"UNOPENED","adminPass":"%s","isUseCudaDriver":false,"cudaDriver":{},"isSecurityReinforce":true}' "$imageId" "$ecs_id" "$adminPass")
rebuild_state=$(call_api "PUT" "https://console.ecloud.10086.cn/api/web/routes/console-openstack-compute/acl/v3/server/rebuild" "$data"| jq -r '.state' )
echo 主机:$ecs_id
echo 系统重装任务下发 $rebuild_state
echo -e "重装后密码为:\e[33m ${password}\e[0m"
echo "**********************************"
)&
((counter++))
if [[ $counter -ge $max_concurrent ]]; then
wait # 等待所有后台进程完成
counter=0
fi
done < $input_file
# 确保所有的子进程都已完成
wait
}
echo -e "╔════════════════════════════════════════════════════╗"
echo -e "║ \033[31m注 意 \e[0m ║"
echo -e "║ 密码必须满足同时包括数字、大小写字母和特殊字符 ║"
echo -e "║ 其中不能出现3个及以上连续或重复的数字如123、111 ║"
echo -e "║ 以及特殊字符最多不能超过3个 ║"
echo -e "║ 需要在“~ @ # $ % * _ - + = , . ? [ ] { }”范围内 ║"
echo -e "║ www.wangzhijie.com ║"
echo -e "║ ║"
echo -e "╚════════════════════════════════════════════════════╝"
echo
rebuild_ecs