我有一个Python脚本,它可以获取我们在Google云平台中部署的所有网络范围。每当我们创建一个新网络时,我们需要确保该网络是唯一的,并且不会与我们已经建立的任何网络重叠。这是我目前所看到的:
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'属性。
这是有意义的,因为'generator'对象是排除后的子网列表。我也试过:
masterranges = IPv4Network("10.0.0.0/8")
for iprange in ipranges:
masterranges = list(masterranges.address_exclude(iprange))
当然,这样会返回:'list'对象没有'address_exclude'属性。
问题是,每当我从主范围中排除一个iprange时,address_exclude产生一个子网列表,然后我需要对每个iprange进行迭代,然后,如果成功,将产生一个全新的子网列表。
我正在努力与如何使这个工作的逻辑,所以任何帮助,这将是感激。
在你的方法-
masterranges = IPv4Network("10.0.0.0/8")
for iprange in ipranges:
masterranges = list(masterranges.address_exclude(iprange))
在for循环中,'masterranges'被赋值为list数据类型的对象,并且在下一次迭代中对其执行'address_exclude',这产生了一个问题。
'address_exclude'作用于数据类型为ip_address的对象,不适用于数据类型为list的对象。
我建议您在第3行中使用另一个变量来存储列表,然后运行另一个循环将列表中的数据附加到masterrange中。