使用Python读取Excel将命令行命令批量运行

暗香疏影 创作者

我们知道使用Alibaba Cloud CLI是可以列出信息甚至可以做修改。但是如果我有批量的修改需求,那么我怎么去做呢

以下命令行代码,其实没有意义,只是用于展示。读取Excel的VPC ID和VSwitchID然后将实例列出来。
你可以修改为例如根据InstanceID修改安全组,或者根据InstaceID修改Tag等各种实用功能

pandas.read_excel具体说明请参考pandas官方文档

示例:根据VPC ID和VSwitch ID找到实例ID (无意义)

1
2
pip install pandas
pip install openpyxl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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)}")

示例:加入资源组

将云盘批量加入资源组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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, 这样错误提示可以加上是哪一行报错。

1
2
# 加ECS到资源组
aliyun ecs JoinResourceGroup --ResourceId {instance_id} --ResourceGroupId {resource_group_id} --ResourceType instance

加安全组到资源组

在已将ECS添加到资源组的情况下,因为安全组不会自动转组。所以需要人工转。而且有可能一个ECS存在多个安全组,而其中一个安全组是大安全组,不需要加资源组。所以需要人工干预,例如全部转组后再转回来。或者先在Excel筛选处理后再用python。

Step 1: 基于实例获得安全组及其资源组

Step 2: 获得安全组及对应的资源组并删除已有资源组的。

1
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表达式如下:

1
=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命令即可。

1
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。例如:

1
aliyun resourcemanager ListResourceGroups --endpoint resourcemanager.aliyuncs.com
  • 标题: 使用Python读取Excel将命令行命令批量运行
  • 作者: 暗香疏影
  • 创建于 : 2024-05-08 14:24:00
  • 更新于 : 2024-05-14 10:26:00
  • 链接: https://blog.23ikr.com/2024/05/08/2024-05-08-Using-Python-Excel-batch-run-Commandline/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论