Hierarchical Configuration을 사용하여 Cisco 장비 차이 Config를 자동으로 생성해 보았습니다.

소개



Network to Code.

Hierarchical Configuration이란?



NW 기기의 Running Config와 상정 Config를 비교해, 차분 Config를 출력해 주는 Python 라이브러리입니다.
Cisco IOS/IOS-XR/NX-OS나 Arista EOS에서 사용되어 온 것 같습니다만, IOS와 같은 CLI 기반의 기기라면 움직이는 것 같습니다.

참고 URL:
Awesome Network Automation
GitHub netdevops/hier_config

개인적으로는, 이하의 용도로 사용할 수 있다고 생각하고 있습니다.
  • 어느 시점의 Config로 되돌리고 싶은 경우(작업시의 Rollback를 포함한다)
  • 설정 Config와 가정 Config를 모두 작성해야하는 경우 (변경 위치가 많거나 계약이있을 때).

    설치



    이번에는 Windows 단말기의 명령 프롬프트에서 GitHub에서 직접 설치했습니다.
    ※Python: 3.6.5, hier_config: 1.6.0
    ※Git을 인스톨 하고 있지 않은 경우는 코드 문서화 » hier_config 로부터 입수할 수 있습니다.
    git clone https://github.com/netdevops/hier_config.git
    cd .\hier_config
    python setup.py install
    

    비교할 Config 저장



    설치 중에 작성된 "hier_config > tests > files"폴더 아래에 호스트 이름 brborder2의 Running Config와 가정 Config를 저장했습니다.
    hier_config
    └─tests
        │  tests.py
        │  test_hier_config.py
        │  test_host.py
        │  test_pep8.py
        │  test_text_match.py
        │  __init__.py
        │
        └─files
                brborder2_intended.conf   # 想定Config
                brborder2_running.conf   # Running Config
                compiled_config.conf
                running_config.conf
                test_options_ios.yml
                test_tags_ios.yml
    

    두 Config의 차이는 다음 6점입니다.

    (1) QoS의 기존 C-DATA1 클래스에 ACL1 행 추가
    (2) QoS에 새로운 C-DATA2 클래스 추가
    (3) GigabitEthernet0/1을 새로 설정하고 EIGRP를 활성화
    (4) Syslog 대상을 추가
    (5) 로그인 배너 삭제
    (6) NTP 서버의 주소 변경

    여기

    파이썬 스크립트



    hier_config 폴더 바로 아래에 다음 파일을 저장합니다.options 로 지정하고 있는 test_options_ios.yml 로, Config 차분이 발견되었을 때의 처리 방법을 명령 마다 세세하게 정의할 수 있습니다. 이번은 테스트용의 것을 그대로 사용합니다.

    hier_config_sample.py
    from hier_config import HConfig
    from hier_config.host import Host
    import yaml
    
    options = yaml.load(open('./tests/files/test_options_ios.yml'))
    host = Host('brborder2', 'ios', options)
    
    # Build HConfig object for the Running Config
    
    running_config_hier = HConfig(host=host)
    running_config_hier.load_from_file('./tests/files/brborder2_running.conf')
    
    # Build Hierarchical Configuration object for the Compiled Config
    
    compiled_config_hier = HConfig(host=host)
    compiled_config_hier.load_from_file('./tests/files/brborder2_intended.conf')
    
    # Build Hierarchical Configuration object for the Remediation Config
    
    remediation_config_hier = running_config_hier.config_to_get_to(compiled_config_hier)
    
    for line in remediation_config_hier.all_children():
         print(line.cisco_style_text())
    

    실행 결과① (Running⇒상정의 차분)



    생성된 차이 Config와 확인 결과는 다음과 같습니다.

    (1) QoS의 기존 C-DATA1 클래스에 ACL1 행 추가 ⇒ OK
    (2) QoS에 신규 C-DATA2 클래스를 추가 ⇒ OK (정책 맵도 세트 재기록되고있다)
    (3) GigabitEthernet0/1을 신규 설정해, EIGRP를 유효화⇒OK(명시적으로 no shutdown가 들어 있다)
    (4) Syslog의 송신처를 추가 ⇒OK
    (5) 로그인 배너를 삭제 ⇒NG( no banner login ^C 뒤에, 불필요한 4행이 포함된다.)
    (6) NTP 서버의 주소 변경 ⇒ OK (이전 주소가 삭제되고 새 주소가 추가되었습니다)
    C:\Users\XXXXX\hier_config>python hier_config_sample.py
    no banner login ^C
    ============NOTICE==============
    | This is test device for demo |
    ================================
    ^C
    no ntp server 10.10.1.44
    class-map match-all C-DATA2
      match access-group name C-DATA2_ACL
    policy-map P-CHILD
      class C-DATA1
        no priority percent 60
        priority percent 40
      class C-DATA2
        bandwidth percent 30
      class class-default
        no bandwidth percent 40
        bandwidth percent 30
    interface GigabitEthernet0/1
      no shutdown
      description << To LAN >>
      ip address 10.1.1.2 255.255.255.252
    router eigrp 1
      network 10.1.1.0 0.0.0.3
    ip access-list extended C-DATA1_ACL
      20 permit ip any 192.168.101.0 0.0.0.255
    ip access-list extended C-DATA2_ACL
      10 permit ip any 192.168.102.0 0.0.0.255
    logging host 192.168.100.108
    ntp server 10.10.1.47
    

    (참고) 실행 결과 ② (상정⇒Running의 차분)



    문제 발생시 Rollback Config를 작성하는 이미지로, 반대도 해 보았습니다.

    (1) QoS의 기존 C-DATA1 클래스의 ACL1 행을 삭제 ⇒ OK
    (2) QoS에 신규 C-DATA2 클래스를 삭제⇒NG(처음으로 no class-map match-all C-DATA2 (3) GigabitEthernet0/1을 폐색해, EIGRP를 무효화⇒OK
    (4) Syslog의 송신처를 삭제 ⇒ OK
    (5) 로그인 배너 추가 ⇒ OK
    (6) NTP 서버의 주소 변경 ⇒ OK
    C:\Users\XXXXX\hier_config>python hier_config_sample.py
    no class-map match-all C-DATA2
    no ip access-list extended C-DATA2_ACL
    no logging host 192.168.100.108
    no ntp server 10.10.1.47
    policy-map P-CHILD
      no class C-DATA2
      class C-DATA1
        no priority percent 40
        priority percent 60
      class class-default
        no bandwidth percent 30
        bandwidth percent 40
    interface GigabitEthernet0/1
      no description << To LAN >>
      no ip address 10.1.1.2 255.255.255.252
      shutdown
    router eigrp 1
      no network 10.1.1.0 0.0.0.3
    ip access-list extended C-DATA1_ACL
      no 20 permit ip any 192.168.101.0 0.0.0.255
    banner login ^C
    ============NOTICE==============
    | This is test device for demo |
    ================================
    ^C
    ntp server 10.10.1.44
    

    마지막으로



    올바른 차이 Config가 생성되지 않은 경우는 options 의 YAML 파일로 룰을 정의하면 대응할 수 있을지도 모릅니다.
    또, 순서의 고려가 필요한 경우도, 상기의 YAML로 순서를 지정할 수 있는 것 같기 때문에,(힘들다고는 생각합니다만) 대응할 수 있을 것 같습니다.
    다만, 특수한 설정을 포함해 완전하게 대응시키는 것은 힘들 것 같기 때문에, 자동 생성된 것을 리뷰자가 최종 체크하는 전제라면, 매우 편리한 툴이라고 생각했습니다.
  • 좋은 웹페이지 즐겨찾기