【发布时间】:2021-11-05 03:01:07
【问题描述】:
我有一个 Python 脚本,可以获取我们在 Google Cloud Platform 中部署的所有网络范围。每当我们创建一个新网络时,我们都需要确保网络是唯一的,并且不会与我们已经设置的任何内容重叠。这是我目前所拥有的:
from googleapiclient import discovery
from oauth2client.service_account
import ServiceAccountCredentials
from ipaddress import IPv4Network
credentials = ServiceAccountCredentials.from_json_keyfile_name('serviceaccount.json')
compute = discovery.build('compute', 'v1', credentials=credentials) cloudresman = discovery.build('cloudresourcemanager', 'v1', credentials=credentials)
projects = [] projectdicts = cloudresman.projects().list().execute() projectdicts = projectdicts.get('projects')
for projectdict in projectdicts:
if "sandbox" not in projectdict['name']:
if projectdict['lifecycleState'] == "ACTIVE":
projects.append(projectdict['projectId'])
else:
print(projectdict['projectId'] + " is not active")
ipranges = []
for project in projects:
regiondicts = compute.regions().list(project=project).execute() regiondicts =
regiondicts.get('items')
for regiondict in regiondicts:
region = regiondict['name']
subnetworkdicts = compute.subnetworks().list(project=project,region=region).execute()
subnetworkdicts = subnetworkdicts.get('items')
if subnetworkdicts:
for subnetworkdict in subnetworkdicts:
ipranges.append(IPv4Network(subnetworkdict['ipCidrRange']))
if "secondaryIpRanges" in subnetworkdict:
secondaryranges = subnetworkdict['secondaryIpRanges']
for secondaryrange in secondaryranges:
if secondaryrange['ipCidrRange'] not in ipranges:
ipranges.append(IPv4Network(secondaryrange['ipCidrRange']))
我们使用的所有子网都在 10.0.0.0/8 范围内。
但我的问题是:如何从“主列表”中排除子网列表?
我尝试了以下方法:
masterranges = IPv4Network("10.0.0.0/8")
for iprange in ipranges:
masterranges = masterranges.address_exclude(iprange)
但是,这会返回:'generator' 对象没有属性 'address_exclude'。
这是有道理的,因为“生成器”对象是排除后的子网列表。我也试过:
masterranges = IPv4Network("10.0.0.0/8")
for iprange in ipranges:
masterranges = list(masterranges.address_exclude(iprange))
当然,那会返回:'list' 对象没有属性 'address_exclude'。
问题是,每当我从主范围中排除一个 iprange 时,address_exclude 会生成一个子网列表,然后我需要对每个 进行迭代iprange,如果成功,将生成一个全新的子网列表。
我正在努力解决如何使这项工作的逻辑,因此我们将不胜感激。
【问题讨论】:
标签: python networking google-cloud-platform ip-address