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

SHELL脚本 | 移动云 云主机批量自动重装操作系统(Cookie版)-一字节.OneByte

移动云控制台单次批量重装一次只能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 等号后面 分号前面的这一串字符就行了

SHELL脚本 | 移动云 云主机批量自动重装操作系统(Cookie版)-一字节.OneByte

获取镜像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