【问题标题】:Python ciscoconfparse - build a basic config filePython ciscoconfparse - 构建基本配置文件
【发布时间】:2015-03-18 12:09:32
【问题描述】:

我正在尝试基于完整配置文件创建一个 cisco 基本配置。

以下是完整文件配置的一些示例:

    !
    policy-map QOS
     class GOLD
      priority percent 10
     class SILVER
      bandwidth 30
      random-detect
     class default
    !
    interface Loopback1
     description Management
     ip address 9.9.9.9 255.255.255.255
    !
    interface FastEthernet0/0
     description LAN
     ip address 6.6.6.6 255.255.255.0
    !
    ip access-list standard customer_internal
     permit 1.1.1.1
     permit 2.2.2.2
     permit 3.3.3.3
    !

我发现了这个 ciscoconfparse 库 (https://pypi.python.org/pypi/ciscoconfparse)。并且能够将配置行块抓取到另一个文件中,但不知道如何将这些块排除到基本配置文件中。

from ciscoconfparse import CiscoConfParse

full_config_for_parse = file('./fullconfig.txt')
basic_config_file = open('./basic_config.txt', 'w') # This file needs to contain only basic config, like interface, IP, etc...
security_config_file = open('./security_config_file.txt', 'w') # This is the file that was able to send the line blocks

parse = CiscoConfParse(full_config_for_parse)

class_map = parse.find_all_children('class-map')
access_list = parse.find_all_children('ip access-list')

if class_map != ' ':   # If class_map is not empty, it means that the full config file has class-map configuration, so, it needs to be removed or not copied to basic config file
    for line in class_map:
        security_config_file.write(line)  # separating the blocks to another file
        #basic_config_file.write(remove_this_line) I need to delete/not write this line to basic_config_file

if access_list != ' ':
    for line in access_list:
        security_config_file.write(line)
        #basic_config_file.write(remove_this_line)


# There is another code part that is copying all the rest of the basic configuration to basic_config_file, that is working OK

files.close()

有人知道删除或不将这些配置块复制到基本配置文件的更好方法吗?

【问题讨论】:

    标签: python ciscoconfparse


    【解决方案1】:

    据我所知,您想从我的答案底部的配置中删除policy-mapip access-list,并将结果另存为basic_config.txt

    这是最有效的方法...

    from ciscoconfparse import CiscoConfParse
    
    parse = CiscoConfParse('fullconfig.txt')
    
    objs = list()
    objs.extend(parse.find_objects(r'^policy-map'))    # Append policy-map obj
    objs.extend(parse.find_objects(r'ip\saccess-list'))# Append ip access-list obj
    
    for obj in objs:
        # When you delete a parent obj, it recurses through all children
        obj.delete()
    parse.commit()
    
    parse.save_as('basic_config.txt')  # Save the new configuration
    

    当你查看basic_config.txt时,它会有以下几行...

    !
    !
    interface Loopback1
     description Management
     ip address 9.9.9.9 255.255.255.255
    !
    interface FastEthernet0/0
     description LAN
     ip address 6.6.6.6 255.255.255.0
    !
    !
    

    文件名:fullconfig.txt...

    !
    policy-map QOS
     class GOLD
      priority percent 10
     class SILVER
      bandwidth 30
      random-detect
     class default
    !
    interface Loopback1
     description Management
     ip address 9.9.9.9 255.255.255.255
    !
    interface FastEthernet0/0
     description LAN
     ip address 6.6.6.6 255.255.255.0
    !
    ip access-list standard customer_internal
     permit 1.1.1.1
     permit 2.2.2.2
     permit 3.3.3.3
    !
    

    【讨论】:

    • 很荣幸有 ciscoconfparse 库的作者回答这个问题。刚刚对其进行了测试,是的,可以肯定这是一种更好的方法。非常感谢!
    【解决方案2】:

    经过大量的研究和尝试,得到了我想要的,用现在可以工作的新代码编辑答案:

    from ciscoconfparse import CiscoConfParse
    
    def main():
    
        # 2nd Part - Begin 
        p = CiscoConfParse("./basic_config.txt")
        basic_config_NEW = open('./basic_config_NEW.txt', 'w') # Need to open a new file as using the same one was getting empty file
    
        for obj in p.find_objects(r'^class-map'):
            obj.delete('class')
    
        for obj in p.find_objects(r'^ip access-list'):
            obj.delete('ip access-list')
    
        for line in p.ioscfg:
            basic_config_NEW.write(line)  # This was adding the lines without break lines on the file
            basic_config_NEW.write('\n')  # Have to add it not sure if there is another way of doing it in one single line
    
        basic_config_NEW.close()        
    
        # 2nd Part - End
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多