使用ipaddress模块从主列表中排除子网?



我有一个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中。

最新更新