Ansible 자작 모듈로 NW 기기에서 Traceroute

소개



여러분 Ansible의 네트워크 모듈을 사용하고 있습니까?
네트워크의 통신 테스트를 자동화하는데 있어서, ping만이 아니고, traceroute도 할 수 있으면 좋다-라고 생각하는 것이 있겠지요?
그런 당신을 위해 Cisco IOS 용 ios_traceroute 모듈을 만들었습니다! (무리 화살)

사용법



공식 리포지토리에는 병합되지 않으므로 사용하려면 다음 작업이 필요합니다.
(Red Hat 씨, 풀리크 나왔으니까 통과해 ​​ )
  • GitHub에서 데이터 검색
    GitHub 리포지토리 ansible_ios_traceroute_module 복제 또는 다운로드.
  • 모듈 저장
    자작 모듈을 Ansible이 인식할 수 있도록 Best Practices > Directory Layout에 따라 library 디렉토리를 작성해, 바로 아래에 취득한 Python 모듈(ios_traceroute.py)을 포함.
  • 경로 추가ansible.cfg 파일에 library 디렉토리의 경로를 추가.

  • ansible.cfg
    [defaults]
    library = /home/centos/ansible/library
    

    ansible.cfg 의 저장처는 ansible --version 커맨드의 config file 로 확인 가능합니다.
    [centos@localhost ~]$ ansible --version
    ansible 2.9.0
      config file = /etc/ansible/ansible.cfg
      configured module search path = ['/home/centos/ansible/library']
      ansible python module location = /usr/lib/python3.6/site-packages/ansible
      executable location = /usr/bin/ansible
      python version = 3.6.7 (default, Dec  5 2018, 15:02:05) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
    

    Playbook



    Playbook 샘플



    거친 흐름은 다음과 같습니다.
  • ios_traceroute 모듈에서 NW 기기 자신의 주소(192.168.100.201)에서 172.16.1.100으로 traceroute를 실시.
  • debug 모듈에서 출력 결과를 표시합니다.
  • assert 모듈에서 7번째 홉에 특정 IP 주소(172.30.100.1)를 통과하는지 확인.

  • playbook1_traceroute.yml
    ---
    
    - hosts: cisco
      gather_facts: no
      connection: network_cli
    
      tasks:
        - name: execute traceroute
          ios_traceroute:
            dest: 172.16.1.100
            probe: 4
            source: 192.168.100.201
            ttl_min: 1
            ttl_max: 20
          register: result_traceroute
    
        - name: debug traceroute
          debug: 
            msg: "{{ result_traceroute }}"
    
        - name: check if the traceroute results always include specific transit ip address in hop 7
          assert: 
            that:
                - result_traceroute.hop['7'] == ['172.30.100.1']
    

    사용 가능한 옵션


    ios_traceroute 모듈 내에서 사용 가능한 옵션은 다음과 같습니다.
    이 중 dest 만 필수 항목입니다. 다른 항목은 지정하지 않으면 각 IOS 장비의 기본값이 사용됩니다.
      probe:
        description:
        - 各ホップで送信するパケットの数
        type: int
      dest:
        description:
        - 宛先IPアドレスもしくはホスト名(NW機器で名前解決できる必要あり)
        type: str
        required: true
      source:
        description:
        - 送信元IPアドレス
        type: str
      udp:
        description:
        - UDPパケットのポート番号
        type: int
      ttl_min:
        description:
        - 最小TTL値(ttl_minとttl_maxはセットで指定する必要あり)
        type: int
      ttl_max:
        description:
        - 最大TTL値
        type: int
      vrf:
        description:
        - 転送に使用するVRF
        type: str
    

    실행 결과



    ※글로벌 IP 주소를 포함하고 있기 때문에, Netconan 라고 하는 툴을 사용해 데타라메인 주소로 변환하고 있습니다.

    TASK [debug traceroute]의 commands 에서 실제로 실행한 명령, output 로 가공전의 출력 결과, hop 로 홉수와 IP 주소만 추출한 결과를 확인할 수 있습니다.
    마지막 TASK에서, 7홉째로 상정 IP주소를 경유하는 것을 확인할 수 있어 「All assertions passed」가 되어 있습니다.
    PLAY [cisco] ************************************************************************************************************
    
    TASK [execute traceroute] ***********************************************************************************************
    ok: [test3]
    
    TASK [debug traceroute] *************************************************************************************************
    ok: [test3] => {
        "msg": {
            "changed": false,
            "commands": [
                "traceroute 172.174.88.165 source 192.168.173.198 probe 4 ttl 1 20"
            ],
            "failed": false,
            "hop": {
                "1": [
                    "192.168.173.43"
                ],
                "10": [
                    "108.224.66.109",
                    "108.224.66.161",
                    "108.224.66.172"
                ],
                "11": [
                    "108.254.165.36",
                    "172.159.216.191"
                ],
                "12": [
                    "215.123.152.64",
                    "74.246.135.251",
                    "222.152.243.188"
                ],
                "13": [
                    "108.224.67.238",
                    "108.224.67.103"
                ],
                "14": [
                    "108.224.80.18",
                    "108.224.80.23"
                ],
                "15": [
                    "172.174.88.165"
                ],
                "2": [],
                "3": [
                    "172.30.231.192"
                ],
                "4": [
                    "126.244.74.242"
                ],
                "5": [
                    "18.232.93.6",
                    "18.232.93.1"
                ],
                "6": [
                    "18.235.248.200",
                    "18.235.248.207"
                ],
                "7": [
                    "68.32.20.116"
                ],
                "8": [],
                "9": [
                    "74.246.135.176",
                    "108.224.82.72",
                    "108.224.82.242"
                ]
            },
            "output": [
                "Type escape sequence to abort.",
                "Tracing the route to 172.174.88.165",
                "VRF info: (vrf in name/id, vrf out name/id)",
                "  1 192.168.173.43 186 msec 16 msec 13 msec 11 msec",
                "  2  *  *  *  * ",
                "  3 172.30.231.192 51 msec 55 msec 44 msec 62 msec",
                "  4 126.244.74.242 54 msec 79 msec 39 msec 59 msec",
                "  5 18.232.93.6 43 msec",
                "    18.232.93.1 63 msec",
                "    18.232.93.6 60 msec",
                "    18.232.93.1 64 msec",
                "  6 18.235.248.200 56 msec 80 msec 53 msec",
                "    18.235.248.207 62 msec",
                "  7 68.32.20.116 61 msec 55 msec 59 msec 39 msec",
                "  8  *  *  *  * ",
                "  9 108.224.82.72 57 msec",
                "    74.246.135.176 39 msec",
                "    108.224.82.242 60 msec 61 msec",
                " 10 108.224.66.161 62 msec",
                "    108.224.66.109 70 msec",
                "    108.224.66.172 72 msec",
                "    108.224.66.161 54 msec",
                " 11 108.254.165.36 [MPLS: Label 27008 Exp 4] 70 msec",
                "    172.159.216.191 [MPLS: Label 178553 Exp 4] 57 msec",
                "    108.254.165.36 [MPLS: Label 25624 Exp 4] 71 msec 56 msec",
                " 12 74.246.135.251 79 msec",
                "    222.152.243.188 77 msec",
                "    74.246.135.251 60 msec",
                "    215.123.152.64 53 msec",
                " 13 108.224.67.238 58 msec 62 msec",
                "    108.224.67.103 70 msec 68 msec",
                " 14 108.224.80.23 58 msec",
                "    108.224.80.18 59 msec",
                "    108.224.80.23 70 msec 70 msec",
                " 15 172.174.88.165 77 msec 60 msec 61 msec 63 msec"
            ]
        }
    }
    
    TASK [check if the traceroute results (dict) always include specific transit ip address in hop 7] ***********************
    ok: [test3] => {
        "changed": false,
        "msg": "All assertions passed"
    }
    
    PLAY RECAP **************************************************************************************************************
    test3                      : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
    

    마지막으로



    이 모듈은 표준 traceroute 명령을 사용하여 한 줄에 옵션을 지정합니다.
    여러 라우터, 스위치로 테스트를 하고 있지만 이전 버전에서는 명령이 지원되지 않고 시작될 수 있습니다. 그때 포기해줘 w
    풀릭이 다니면 톤을 타고 다른 OS의 모듈도 만들어 보려고합니다!

    좋은 웹페이지 즐겨찾기