如下为批量替换,如单台需自行修改
# coding: utf-8
import os
import requests
import json
import sys
simulator_token_file = "simulator_token.txt"
iam_url = "https://iam.myhuaweicloud.com/v3/auth/tokens"
#endpoint: https://developer.huaweicloud.com/endpoint?all
#西南-贵阳一
project_name = "cn-southwest-2"
endpoint = "ecs.cn-southwest-2.myhuaweicloud.com"
project_id = "xxxxxxxxx"
os_init_password = "xxxxxxxxx"
IAMDomain = "xxxxxx"
IAMUser = "xxxxxxx"
IAMPassword = "xxxxxx"
headers = {
'Content-Type': 'application/json;charset=utf8'
}
def Get_token():
body = {
"auth": {
"identity": {
"methods": [
"password"
],
"password": {
"user": {
"domain": {
"name": IAMDomain
},
"name": IAMUser,
"password": IAMPassword
}
}
},
"scope": {
"project": {
"name": project_name
}
}
}
}
response = requests.post(iam_url, headers=headers, json=body)
response_header = response.headers
#print(response_header)
# 获取所有头部的键值对
#for key, value in response_header.items():
# print(key, value)
# 获取特定头部的值, 获取token
x_auth_token = response_header.get("X-Subject-Token")
#print(x_auth_token)
with open(simulator_token_file, 'w') as f:
f.write(x_auth_token)
#print(response.text)
def Check_token():
file_path = 'simulator_token.txt'
# 检查文件是否存在
if not os.path.exists(file_path):
# 如果文件不存在,则创建文件
with open(file_path, 'w') as file:
file.write('token')
while True:
with open('simulator_token.txt', 'r') as file:
simulator_token = file.readline().strip()
headers = {
'Content-Type': 'application/json;charset=utf8',
'X-Auth-Token': simulator_token,
'X-Subject-Token': simulator_token
}
re_token = requests.get(iam_url, headers=headers)
if re_token is not None and re_token.status_code == 200:
#print(re_token.text)
print("----------------当前token有效,无需重新获取-------------------")
return simulator_token
break
else:
print("---------------token过期,重新获取token-------------")
Get_token()
def Change_os_image(os_id, x_auth_token):
headers = {'X-Auth-Token': x_auth_token }
#切换操作系统:https://support.huaweicloud.com/api-ecs/ecs_02_0204.html
url_change_os_image = "https://" + endpoint + "/v1/" + project_id + "/cloudservers/" + os_id + "/changeos"
# 获取镜像id:https://support.huaweicloud.com/api-ims/ims_03_0702.html
# 新的镜像 id
# ensp-pro0705 image_id: 3e3be9d9-9b86-42f6-bebd-ce3841f6695a
# ensp-pro240409 image_id: 562d2622-e6fd-4b85-a544-c1e7aba5a124
# ensp-pro0705
#new_image_id = "3e3be9d9-9b86-42f6-bebd-ce3841f6695a"
# ensp-pro240409
new_image_id = "562d2622-e6fd-4b85-a544-c1e7aba5a124"
params_chage_os_image = {
"os-change": {
"adminpass": os_init_password,
"userid": "b42eccb1f2a6469ba8c0484e0e8c76f8",
"imageid": new_image_id,
"mode": "withStopServer"
}
}
re_change_os_name = requests.post(url_change_os_image, headers=headers, json=params_chage_os_image)
print(re_change_os_name.text)
def Os_list():
url = "https://" + endpoint + "/v1/" + project_id + "/cloudservers/detail"
x_auth_token = Check_token()
headers = {'X-Auth-Token': x_auth_token }
payload = {'offset': '1', 'limit': '100'}
response = requests.get(url, headers=headers, params=payload)
if response is not None and response.status_code == 200:
#print(response.text)
os_name_all = json.loads(response.text)["servers"]
os_name_num = len(os_name_all)
#print(os_name_num)
for i in range(os_name_num):
os_name = os_name_all[i]["name"]
os_id = os_name_all[i]["id"]
image_name = os_name_all[i]["metadata"]["image_name"]
image_id = os_name_all[i]["image"]["id"]
#print(os_name + ": " + os_id + " " + image_name + " " "image_id: " + image_id)
if os_name == "ensp-add3-0019" and os_id == "cb84b15c-0424-410e-88eb-120cac50898c":
# 批量替换镜像ensp-pro0705的os为 ensp-pro240409
#if image_name == "ensp-pro0705":
print(os_name + ": " + os_id + " " + image_name + " " "image_id: " + image_id)
Change_os_image(os_id, x_auth_token)
else:
print("获取os列表失败")
if __name__ == '__main__':
Os_list()