Xin chào ! Nếu đây là lần đầu tiên bạn đến với diễn đàn, xin vui lòng danh ra một phút bấm vào đây để đăng kí và tham gia thảo luận cùng VnPro.

Announcement

Collapse
No announcement yet.

Dùng Python sử dụng Netconf để thêm cổng loopback trên thiết bị Cisco( Sandbox)

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Dùng Python sử dụng Netconf để thêm cổng loopback trên thiết bị Cisco( Sandbox)

    Sơ đồ mạng:


    Các bước thực hiện:
    Cài đặt thư viện:
    • [*=1]Mở cmd bằng tổ hợp phím Win+R: gõ cmd- [*=1]Gõ python –m pip intall ncclient - -user
    • Gõ python –m pip intall xmltodict - -user


    Kiểm tra đi được internet: ping 8.8.8.8
    Vào sandbox của cisco để lấy thông tin CSR1000V:
    • [*=1]Vào chrome search từ khóa: devnet sandbox tìm trang như hình
    • Đăng nhập
    • Sau khi đăng nhập xong sẽ hiện lên giao diện web tất cả sandbox lab
    • Vào chỗ search gõ IOS XE để tìm kiếm các lab sử dụng IOS XE, chọn lab có tên như hình (Recommended Code AlwaysOn)
    • Ở phía bên trái kéo xuống phần Access Details ta có được thông tin để kết nối đến CSR1000V


    Viết chương trình:
    Tạo file device_info.py để ghi thông tin thiết bị:

    Code:
    iosxe = {
    "address": "ios-xe-mgmt.cisco.com",
    "netconf_port": 10000,
    "restconf_port": 9443,
    "ssh_port": 8181,
    "username": "developer",
    "password": "C1sco12345"
    }

    Các thông tin:
    1. [*=1]netconf_port, restconf_port,ssh_port là các port do thiết bị trên Sandbox đặt. [*=1]username, password là tên và mật khẩu khi cấu hình SSH
    Tạo file add_loopback.py:
    + Import các thư viện cần thiết:

    Code:
    from ncclient import manager
    import sys
    import xmltodict
    import xml.dom.minidom
     
    from device_info import iosxe as device

    + Khai báo kiểu cổng:
    Code:
    IETF_INTERFACE_TYPES = {
            "loopback": "ianaift:softwareLoopback",
            "ethernet": "ianaift:ethernetCsmacd"
        }

    + Tạo template XML cho cổng:
    Code:
    netconf_interface_template = """
    <config>
        <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces">
            <interface>
                <name>{name}</name>
                <description>{desc}</description>
                <type xmlns:ianaift="urn:ietf:params:xml:ns:yang:iana-if-type">
                    {type}
                </type>
                <enabled>{status}</enabled>
                <ipv4 xmlns="urn:ietf:params:xml:ns:yang:ietf-ip">
                            <address>
                                        <ip>{ip_address}</ip>
                                        <netmask>{mask}</netmask>
                            </address>
                </ipv4>
            </interface>
        </interfaces>
    </config>"""

    • [*=1]xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces" là namespace( không gian tên), giúp phân biệt các thực thể cùng tên nằm trong các namespace khác nhau. VD như trong namespace N1 có object O, N2 cũng có object O. Để phân biệt object O của namespace nào thì có thể ghi N1:O để biết là object O này của N1.
    Để viết template này ta mở phần mềm MG-Soft Netconf Browser để biết cấu trúc của ietf-interfaces






    +Yêu cầu nhập thông tin cổng Loopback:

    Code:
    new_loopback = {}
    new_loopback["name"] = "Loopback" + input("What loopback number to add? ")
    new_loopback["desc"] = input("What description to use? ")
    new_loopback["type"] = IETF_INTERFACE_TYPES["loopback"]
    new_loopback["status"] = "true"
    new_loopback["ip_address"] = input("What IP address? ")
    new_loopback["mask"] = input("What network mask? ")
    Tạo một dictionary new_loopback để ghi thông tin người dùng nhập vào

    +Tạo Netconf payload chứa dữ liệu cho cổng:
    Code:
    netconf_data = netconf_interface_template.format(
            name = new_loopback["name"],
            desc = new_loopback["desc"],
            type = new_loopback["type"],
            status = new_loopback["status"],
            ip_address = new_loopback["ip_address"],
            mask = new_loopback["mask"]
        )
    Khai báo biến netconf_data bằng cách để các thông tin từ dictionary vào template đã viết ở trên.

    +In ra màn hình thông tin sẽ gửi qua Netconf
    Code:
    print("The configuration payload to be sent over NETCONF.\n")
    print(netconf_data)

    + Mở kết nối đến thiết bị bằng ncclient và tạo câu truy vấn Netconf (get_config) sử dụng bộ lọc trên
    Code:
    print("Opening NETCONF Connection to {}".format(device["address"]))
    with manager.connect(
                  host=device["address"],
                  port=device["netconf_port"],
                  username=device["username"],
                  password=device["password"],
                  hostkey_verify=False
                  ) as m:
     
          print("Sending a <edit-config> operation to the device.\n")
          netconf_reply = m.edit_config(netconf_data, target = 'running')
    Tạo kết nối đến thiết bị bằng thư viện ncclient( modun manager)
    device là tên gán từ dòng “from device_info import iosxe as device” khai báo ở trên

    Lưu ý: phần khoảng cách phải đúng

    + In kết quả trả về dạng XML:
    Code:
    print("Here is the raw XML data returned from the device.\n")
    print(xml.dom.minidom.parseString(netconf_reply.xml).toprettyxml())
    print("")
    Code:
    [SIZE=18px][/SIZE]
    • [*=1]xml.dom.minidom.parseString(netconf_reply.xml).top rettyxml() dùng để in kết quả trả về giúp ta dễ đọc hơn
    Kết quả:

    Trước khi thêm cổng Loopback:



    Khi thêm cổng Loopback:





    Sau khi thêm cổng:





    Thank you.
    Nguồn : VNPRO
Working...
X