我们知道使用Alibaba Cloud CLI是可以列出信息甚至可以做修改。但是如果我有批量的修改需求,那么我怎么去做呢
以下命令行代码,其实没有意义,只是用于展示。读取Excel的VPC ID和VSwitchID然后将实例列出来。
你可以修改为例如根据InstanceID修改安全组,或者根据InstaceID修改Tag等各种实用功能
pandas.read_excel具体说明请参考pandas官方文档
利用Python快速实现
代码语言:javascript复制pip install pandas
pip install openpyxl
代码语言:javascript复制import pandas as pd
import subprocess
# Path to your Excel file
excel_file_path = 'D:\PycharmProjects\something\vpc.xlsx'
# Load the Excel file
df = pd.read_excel(excel_file_path, engine='openpyxl')
# Iterate over each row in the DataFrame
for index, row in df.iterrows():
vpc = row['vpc']
vsw = row['vsw']
instance_id = row ['InstanceId']
# Construct the CLI command
cli_command = f'aliyun ecs DescribeInstances --VpcId {vpc} --VSwitchId {vsw} --output cols="OSNameEn,InstanceId,InstanceName,VpcAttributes.VpcId, VpcAttributes.VSwitchId" rows="Instances.Instance[]"'
try:
# Execute the CLI command
subprocess.run(cli_command, check=True, shell=True)
print(f"Successfully run command for instance ID: {instance_id} {vpc} {vsw}")
except subprocess.CalledProcessError as e:
# If there's an error executing the CLI command, print it
print(f"Failed to run {instance_id}. Error: {str(e)}")
示例:加入资源组
将云盘批量加入资源组
代码语言:javascript复制import pandas as pd
import subprocess
# Path to your Excel file
excel_file_path = 'D:\yes\instance-resourcegroup.xlsx'
# Load the Excel file
df = pd.read_excel(excel_file_path, engine='openpyxl', sheet_name="Result")
# Iterate over each row in the DataFrame
for index, row in df.iterrows():
instance_id = row['InstanceId']
disk_id = row['DiskId']
resource_group_id = row['ResourceGroupId']
# Construct the CLI command
cli_command = f'aliyun ecs JoinResourceGroup --ResourceId {disk_id} --ResourceGroupId {resource_group_id} --ResourceType disk --profile CLI-exampleProfile'
try:
# Execute the CLI command
subprocess.run(cli_command, check=True, shell=True)
print(f"Successfully changed the resource group for Disk ID: {instance_id} {disk_id} {resource_group_id}")
except subprocess.CalledProcessError as e:
# If there's an error executing the CLI command, print it
print(f"Failed to change the resource group for Disk ID: {disk_id}. Error: {str(e)}")
加ECS到资源组
例如,如果我们修改以下cli_command和少部分代码,即可将大量ecs添加到对应的资源组内。建议额外在excel加rowid, 这样错误提示可以加上是哪一行报错。
代码语言:sh复制# 加ECS到资源组
aliyun ecs JoinResourceGroup --ResourceId {instance_id} --ResourceGroupId {resource_group_id} --ResourceType instance
加安全组到资源组
在已将ECS添加到资源组的情况下,因为安全组不会自动转组。所以需要人工转。而且有可能一个ECS存在多个安全组,而其中一个安全组是大安全组,不需要加资源组。所以需要人工干预,例如全部转组后再转回来。或者先在Excel筛选处理后再用python。
Step 1: 基于实例获得安全组及其资源组
Step 2: 获得安全组及对应的资源组并删除已有资源组的。
代码语言:sh复制aliyun ecs DescribeSecurityGroups --output cols="SecurityGroupName,SecurityGroupId,ResourceGroupId" rows="SecurityGroups.SecurityGroup[]" --pager
Step 3: 根据实例获得的表格(Step 1) 做安全组的Excel表格处理:删除空格->替换空格为, ->删除,, ->将,作为分列符。使得一个实例,对应一列是一个安全组,额外一列是另一个安全组,最后一列是实例的资源组。
Step 4: 假设我们最多有3个安全组,也就是在分成3列。假设列数是C,D,E。我们通过xlookup与Step 2获得的安全组做对比,从而获得在该列中的安全组的实例资源组。通过对这3列做xlookup后,再做聚合。
Step 5: 因为xlookup会出现两种可能,一种是0,也就是该列未找到资源组。另一种是#N/A,也就是在完整的安全组该列中未找到改安全组。而如果找到了资源组则开头一定是rg-,所以我们Excel表达式如下:
代码语言:sh复制=IFERROR(IF(AND(ISNUMBER(SEARCH("rg-",C2)),NOT(ISERROR(C2)),C2<>0),C2,IF(AND(ISNUMBER(SEARCH("rg-",D2)),NOT(ISERROR(D2)),D2<>0),D2,IF(AND(ISNUMBER(SEARCH("rg-",E2)),NOT(ISERROR(E2)),E2<>0),E2,""))),"")
这就是聚合后在安全组每个的资源组情况了。
Step 6, 替换python命令即可。
代码语言:sh复制aliyun ecs JoinResourceGroup --ResourceId {sg_id} --ResourceGroupId {resource_group_id} --ResourceType securitygroup
关于resourcemanager API
我们这里使用的其实是ECS的加入资源组API, 但是可不可以用resourcemanger的API呢?
resourcemanager是中心化的,他的endpoint不是区域 aliyuncs。在默认情况下运行CLI是不可行的,也不可以region_id为空,所以需要额外指定endpoint。例如:
代码语言:sh复制aliyun resourcemanager ListResourceGroups --endpoint resourcemanager.aliyuncs.com