【问题标题】:Exclude Subnets From Master List Using ipaddress module?使用 ipaddress 模块从主列表中排除子网?
【发布时间】: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


    【解决方案1】:

    在你的方法中 -

    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 行中的另一个变量来存储列表,然后运行另一个循环将这些数据从列表中追加到您的主范围中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 2017-01-25
      • 1970-01-01
      相关资源
      最近更新 更多