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 Restconf để thực hiện chỉnh sửa IP và subnet mask trên thiết bị Sandbox Cisco

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

  • Dùng Python sử dụng Restconf để thực hiện chỉnh sửa IP và subnet mask trên thiết bị Sandbox Cisco

    Sơ đồ mạng:




    Mô tả:
    • Sơ đồ bài thực hành gồm 1 PC và 1 thiết bị chạy hđh IOS XE được đấu nối với nhau như hình 1.1.
    • Trên sơ đồ này, học viên thực hiện kết nối đến thiết bị mạng, viết chương trình để chỉnh sửa ip bằng ngôn ngữ Python.
    • Máy PC phải đáp ứng yêu cầu đã cài đặt trạm làm việc cho developer.
    Yêu cầu kĩ thuật:
    • Học viên thực hiện kết nối máy tính đến Agent bằng mạng Internet
    • Cài đặt thư viện requests trên máy tính.
    • Viết code bằng Python thực hiện yêu cầu:
    1. Lấy danh sách các cổng
    2. Hỏi user chọn cổng muốn chỉnh sửa địa chỉ IP
    3. In ra thông tin của cổng đã chọn
    4. Yêu cầu nhập IP và Subnet mask
    5. Gửi cấu hình cổng lên server
    6. In kết quả cổng sau chỉnh sửa (có thể dùng lại hàm ở yêu cầu số 1)
    Các bước thực hiện:
    Cài đặt thư viện:
    • Mở cmd bằng tổ hợp phím Win+R: gõ cmd
    • Gõ python –m pip intall requests - -user
    Kiểm tra đi được internet: ping 8.8.8.8

    Vào sandbox của cisco để lấy thông tin CSR1000V:

    Viết chương trình:
    - Import các thư viện và khai báo các thông tin cần để giao tiếp với thiết bị

    Code:
    import json
    Code:
    [FONT=Calibri][FONT=Times New Roman]import requests[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]import sys[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]requests.packages.urllib3.disable_warnings()[/FONT][/FONT]
    
    [FONT=Calibri][FONT=Times New Roman]HOST = 'ios-xe-mgmt.cisco.com'[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]PORT = '9443'[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]USER = 'developer'[/FONT][/FONT]
    [FONT=Times New Roman]PASS = 'C1sco12345'[/FONT]
    [FONT=Calibri][FONT=Times New Roman][/FONT][/FONT]
    • Host,port,user,pass là các thông tin lấy được ở phần C
    • Xác định cổng Management( để người dùng không được chọn cổng đó để chỉnh sửa)
    Code:
    MANAGEMENT_INTERFACE = "GigabitEthernet1"
    [FONT=Calibri][FONT=Times New Roman][/FONT][/FONT]
    • Tạo url_base:
    Code:
    url_base = "https://{h}:{p}/restconf".format(h=HOST, p=PORT)
    [FONT=Calibri][FONT=Times New Roman][/FONT][/FONT]


    - Khai báo headers:
    ​​​​​​​
    Code:
    [FONT=Calibri][FONT=Times New Roman]headers = {'Content-Type': 'application/yang-data+json',[/FONT][/FONT]
    [FONT=Times New Roman]'Accept': 'application/yang-data+json'}[/FONT]
    • Hàm lấy danh sách các cổng:
    ​​​​​​​
    Code:
    def get_configured_interfaces():
    Code:
    [FONT=Calibri][FONT=Times New Roman]url = url_base + "/data/ietf-interfaces:interfaces"[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]response = requests.get(url,auth=(USER, PASS),headers=headers,verify=False)[/FONT][/FONT]
    
    [FONT=Times New Roman]return response.json()["ietf-interfaces:interfaces"]["interface"][/FONT]
    [FONT=Calibri][FONT=Times New Roman][/FONT][/FONT]
    • Tạo url để gửi bằng cách nối thêm phần cần thiết vào url_base
    • Lấy thông tin bằng get bao gồm url, authentication(user và pass), headers,verify
    • Cấu hình ip cổng:
    Code:
    def configure_ip_address(interface, ip):
    Code:
    [FONT=Calibri][FONT=Times New Roman]# RESTCONF URL của cổng[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]url = url_base + "/data/ietf-interfaces:interfaces/interface={i}".format(i=interface)[/FONT][/FONT]
    
    [FONT=Calibri][FONT=Times New Roman]#Tạo payload để sửa IP[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]data = {[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]"ietf-interfaces:interface":{[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]"name": interface,[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]"type": "iana-if-type:ethernetCsmacd",[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]"ietf-ip:ipv4":{ [/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]"address":{[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]"ip": ip["address"],[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]"netmask": ip["mask"][/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]        }[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]      }
       }[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]}[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]#Dùng PUT để chỉnh sửa[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]response = requests.put(url,auth=(USER, PASS),headers=headers,verify=False,[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]json=data)[/FONT][/FONT]
    [FONT=Times New Roman]print(response.text)[/FONT]
    [FONT=Calibri][FONT=Times New Roman][/FONT][/FONT]


    Vào MG-Soft Browser để biết cách viết phần payload( chọn ietf-interfaces)




    Lưu ý:
    • "type": "iana-if-type:ethernetCsmacd" do Router trên sandbox sử dụng loại cổng này.
    • "netmask": ip["mask"] do bài lab này yêu cầu nhập netmask .
    • Lấy thông tin chi tiết của cổng đã chọn:
    Code:
    def print_interface_details(interface):
    Code:
    [FONT=Calibri][FONT=Times New Roman]url = url_base + "/data/ietf-interfaces:interfaces/interface={i}".format(i=interface)[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]response = requests.get(url,auth=(USER, PASS),headers=headers,verify=False)[/FONT][/FONT]
    
    [FONT=Calibri][FONT=Times New Roman]intf = response.json()["ietf-interfaces:interface"][/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]print("Name: ", intf["name"])[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]try:[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]print("IP Address: ", intf["ietf-ip:ipv4"]["address"][0]["ip"], "/",[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]intf["ietf-ip:ipv4"]["address"][0]["netmask"])[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]except KeyError:[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]print("IP Address: UNCONFIGURED")[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]print()[/FONT][/FONT]
    
    [FONT=Times New Roman]return(intf)[/FONT]
    [FONT=Calibri][FONT=Times New Roman][/FONT][/FONT]
    • Chỉ lấy phần ip và netmask nên ta sẽ vào tới phần [ip] và[netmask] của intf
    • Hỏi người dùng chọn cổng nào( Nếu chọn cổng Management thì phải chọn lại:
    Code:
    def interface_selection(interfaces):
    Code:
    [FONT=Calibri][FONT=Times New Roman]sel = input("Bạn muốn cấu hình với cổng nào? ")[/FONT][/FONT]
    
    [FONT=Calibri][FONT=Times New Roman]while sel == MANAGEMENT_INTERFACE or not sel in [intf["name"] for intf in interfaces]:[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]print("INVALID: Select an available interface.")[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]print(" " + MANAGEMENT_INTERFACE + " is used for management.")[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]print(" Choose another Interface")[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]sel = input("Bạn muốn cấu hình với cổng nào? ")[/FONT][/FONT]
    
    [FONT=Times New Roman]return(sel)[/FONT]
    [FONT=Calibri][FONT=Times New Roman][/FONT][/FONT]
    • Ở đây ta sẽ sử dụng vòng lặp while để bắt người dùng nhập lại nếu chọn cổng management hoặc nhập sai chính tả tên cổng
    • Yêu cầu người dùng nhập IP và Mask:
    ​​​​​​​
    Code:
    def get_ip_info():
    Code:
    [FONT=Calibri][FONT=Times New Roman]ip = {}[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]ip["address"] = input("Nhập IP address: ")[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]ip["mask"] = input("Nhập subnet mask: ")[/FONT][/FONT]
    [FONT=Times New Roman]return(ip)[/FONT]
    [FONT=Calibri][FONT=Times New Roman][/FONT][/FONT]
    • Hàm main:
    ​​​​​​​
    Code:
    def main():
    Code:
    [FONT=Calibri][FONT=Times New Roman]#Lấy danh sách các cổng[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]interfaces = get_configured_interfaces()[/FONT][/FONT]
    
    [FONT=Calibri][FONT=Times New Roman]print("Router có những cổng sau: \n")[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]for interface in interfaces:[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]print(" * {name}".format(name=interface["name"]))[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]print("")[/FONT][/FONT]
    
    [FONT=Calibri][FONT=Times New Roman]#Hỏi user chọn cổng nào[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]selected_interface = interface_selection(interfaces)[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]print(selected_interface)[/FONT][/FONT]
    
    [FONT=Calibri][FONT=Times New Roman]#In ra thông tin của cổng đã chọn[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]print("Thông tin cổng hiện tại:")[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]print_interface_details(selected_interface)[/FONT][/FONT]
    
    [FONT=Calibri][FONT=Times New Roman]#Yêu cầu người dùng nhập IP và Mask[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]ip = get_ip_info()
    #Gửi cấu hình cổng lên server[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]configure_ip_address(selected_interface, ip)[/FONT][/FONT]
    
    [FONT=Calibri][FONT=Times New Roman]#In kết quả[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]print("Thông tin cổng sau cấu hình:")[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]print_interface_details(selected_interface)[/FONT][/FONT]
    
    
    [FONT=Calibri][FONT=Times New Roman]if __name__ == '__main__':[/FONT][/FONT]
    [FONT=Times New Roman]sys.exit(main())[/FONT]
    [FONT=Calibri][FONT=Times New Roman][/FONT][/FONT]


    Thank you.

    Nguồn : VNPRO



Working...
X