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.

ISE and Python (Phần 1)

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

  • ISE and Python (Phần 1)

    Python là một ngôn ngữ lập trình phổ biến có trước JavaScript bắt đầu từ năm 1991. Python và JavaScript có cú pháp và phong cách hơi khác nhau nhưng thành công lâu dài của chúng so với nhiều ngôn ngữ khác trong gần 30 năm là do:
    Chúng là ngôn ngữ thông dịch. Bất kỳ máy tính nào cũng có thể chạy mã nguồn dựa trên văn bản ngay lập tức và diễn giải các câu lệnh, cung cấp tính linh hoạt của nền tảng mà không cần biên dịch trước một tệp nhị phân cho mỗi và mọi nền tảng.
    Tính linh hoạt của cùng một nền tảng này có nghĩa là các thư viện phần mềm mới - hoặc các gói - có thể được tải xuống bằng một lệnh đơn giản từ các kho lưu trữ (PyPI cho Python và NPM cho JavaScript) và ngay lập tức được các kỹ sư phần mềm sử dụng.
    Chúng là mã nguồn mở và không được kiểm soát bởi một công ty: Java / Oracle, Swift / Apple, C # / Microsoft.
    Tạo tập lệnh Python từ Postman
    Một mẹo nữa mà Postman đã âm thầm giấu giếm là khả năng xuất các yêu cầu dưới dạng Đoạn mã cho nhiều ngôn ngữ lập trình và kịch bản khác nhau. Đây không phải là những chương trình cao cấp với các tùy chọn dòng lệnh và phân trang thông qua tất cả các tài nguyên nhưng nó giúp bạn nắm được 95% một tập lệnh cơ bản.
    1. Trong Postman Collections panel, chọn Cisco ISE API - ERS 》 NetworkDevice POST networkdevice: Basic Static RADIUS & TACACS, và chọn Body > raw tab để xem định nghĩa thiết bị mạng cơ bản: {

    "NetworkDevice": {
    "name": "nad",
    "description": "",
    "authenticationSettings": {
    "networkProtocol": "RADIUS",
    "radiusSharedSecret": "C1sco12345"
    },
    "tacacsSettings": {
    "sharedSecret": "C1sco12345",
    "connectModeOptions": "OFF"
    },
    "NetworkDeviceIPList": [
    {
    "ipaddress": "1.2.3.4",
    "mask": 32
    }
    ],
    "NetworkDeviceGroupList": [
    "Location#All Locations",
    "IPSEC#Is IPSEC Device#No",
    "Device Type#All Device Types"
    ]
    }

    2. Đổi những giá trị này trong Postman JSON template
    name: simulator
    ipaddress: 10.10.20.32
    (IP address của RADIUS simulator trong DevNet Pod) |
    🛑 Khoan bấm Send lúc này. Nếu bạn lỡ bấm rồi, thì gửi lại request DEL networkdevice/{id} và bạn sẽ trở lại ban đầu.
    3. Bạn muốn dùng JSON template đã chỉnh sửa này để tạo ra code Python để xài ngoài Postman. Ở mép phải của Postman, chọn Code Snippets có icon: </> để xem Code Snippet panel.

    Click image for larger version

Name:	php01.jpg
Views:	79
Size:	144.8 KB
ID:	425794

    4. Dùng Code Snippets drop-down và chọn Python - Requests + kết hợp với library package mà bạn muốn, và bạn sẽ thấy code sau. Bạn có thể dùng IP 10.20.20.77 thay cho ISE hostname khi export APIs.
    💡 Requests hiện tại là HTTP package cho Python phổ biến nhất.
    import requests
    import json

    url = "https://ise-1.lab.devnetsandbox.local:9060/ers/config/networkdevice"

    payload = json.dumps({
    "NetworkDevice": {
    "name": "simulator",
    "description": "",
    "authenticationSettings": {
    "networkProtocol": "RADIUS",
    "radiusSharedSecret": "C1sco12345"
    },
    "tacacsSettings": {
    "sharedSecret": "C1sco12345",
    "connectModeOptions": "OFF"
    },
    "NetworkDeviceIPList": [
    {
    "ipaddress": "10.10.20.32",
    "mask": 32
    }
    ],
    "NetworkDeviceGroupList": [
    "Location#All Locations",
    "IPSEC#Is IPSEC Device#No",
    "Device Type#All Device Types"
    ]
    }
    })
    headers = {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Basic ZXJzLWFkbWluOkMxc2NvMTIzNDU=',
    'Cookie': 'APPSESSIONID=DF86EDFE44A735F15628A87FE73CC643; JSESSIONIDSSO=B8E53F0E34AB665C9D18A54B1C170912'
    }

    response = requests.request("POST", url, headers=headers, data=payload)

    print(response.text)
    Sử dụng DevNet DevBox

    · Bạn có 2 cách để kết nối đến DevBox:
    1. Web terminal trong browser từ Sandbox topology: nó thuận tiện và nhanh nhưng mà lại không hỗ trợ copy paste ngoài browser.
    2. Chương trình giả lập terminal trong máy bạn: you have to type in your credentials but after that you have all the capabilities of that application.
    +ssh developer@10.10.20.50
    +ssh 10.10.20.50 -l developer
    Python Virtual Environment Setup

    DevBox cài đặt phiên bản cũ hơn, dẫn đến xung đột của gói Python và Ansible mà chúng ta không thể gỡ cài đặt do phải có quyền root. Bạn phải cài đặt một môi trường ảo Python để cô lập các gói và phiên bản của mình. Sử dụng môi trường ảo để phát triển được coi là phương pháp hay nhất để đảm bảo rằng bạn có tất cả các dependencies chính xác. Ngoài ra, nếu bạn cảm thấy nó lộn xộn, bạn có thể xóa nó và bắt đầu lại.
    Nếu bạn không quen với môi trường ảo, không sao, hãy chạy các lệnh sau:
    1. Cập nhật Pip Installs Python (PIP) package manager để đảm bảo bạn có phiên bản mới nhất. Bỏ qua mọi cảnh báo.
    pip3 install --upgrade pip
    2. Cài đặt pipenv package để quản lý môi trường ảo:
    pip3 install pipenv
    3. Khởi tạo môi trường ảo của bạn với Python 3.9:
    pipenv install --python 3.9
    4. Bắt đầu vào môi trường ảo: pipenv shell
    💡 Sau khi bạn kích hoạt môi trường ảo, bạn sẽ nhận được lời nhắc có tiền tố (developer) để bạn biết rằng môi trường ảo đã được kích hoạt:
    (developer) [developer@devbox ~]$
    💡 Nếu bạn thoát khỏi terminal DevBox hoặc bị ngắt kết nối, bạn phải nhập lại lệnh
    pipenv shell để kích hoạt lại môi trường ảo sau khi kết nối lại.
    5. Xác minh phiên bản Python của bạn trong môi trường ảo là 3.9.0:
    python --version
    6. Cài đặt requests package mà script từ Postman ban nãy yêu cầu:
    pipenv install requests

    Chạy Postman Script

    Thông thường bạn chỉ cần copy và paste vào editor của bạn là có thể sử dụng được ngay. Trong DevBox, bạn phải tinh chỉnh một số thứ để nó hoạt độ

    1. Sau đây là một script được sửa đổi một chút so với script của Postman. Những thay đổi gồm:
    • Thêm #!/usr/bin/env python3 ở dòng đầu tiên, được gọi là "shebang" (hash# + bang! trong tiếng anh), trong Unix OSes để cho shell biết cần dùng chương trình gì để thông dịch script. Trong trường hợp này, nó đang gọi chương trình env để tiếp tục gọi chương trình python3.
    • Thêm cặp khóa-giá trị verify=False trong requests để tắt xác nhận certificate .Bởi vì lab này sử dụng ISE tự ký chữ ký số cho nó nên requests sẽ gặp lỗi nếu chạy.
    • Thêm hai câu lệnh print để xem status_codeLocation header, có chứa URL với resource ID của network device vừa tạo nếu thành công.
    #!/usr/bin/env python3

    import requests
    import json

    url = "https://ise-1.lab.devnetsandbox.local:9060/ers/config/networkdevice"

    payload = json.dumps({
    "NetworkDevice": {
    "name": "simulator",
    "description": "",
    "authenticationSettings": {
    "networkProtocol": "RADIUS",
    "radiusSharedSecret": "C1sco12345"
    },
    "tacacsSettings": {
    "sharedSecret": "C1sco12345",
    "connectModeOptions": "OFF"
    },
    "NetworkDeviceIPList": [
    {
    "ipaddress": "10.10.20.32",
    "mask": 32
    }
    ],
    "NetworkDeviceGroupList": [
    "Location#All Locations",
    "IPSEC#Is IPSEC Device#No",
    "Device Type#All Device Types"
    ]
    }
    })
    headers = {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Basic YWRtaW46QzFzY28xMjM0NQ==',
    'Cookie': 'APPSESSIONID=D3505C99C3044EC06AD4184662A0B19F; JSESSIONIDSSO=0A1FA892F29B6A39DB34F6D8812C6359'
    }

    # Use `verify=False` to disable ISE self-signed certificate validation errors
    response = requests.request("POST", url, headers=headers, data=payload, verify=False)

    print(response.status_code) # show the status code number
    print(response.headers["Location"]) # show the created resource-id
    print(response.text)
    2. Khi còn đang trong DevBox SSH session, tạo một file mới đặt tên là
    ise_post_networkdevice_from_postman.py bằng editor mà bạn thích (nano, vi, vim, v.v.). Nếu mà bạn vẫn chưa làm quen với editor nào hết, hãy thử bắt đầu với nano.
    nano ise_post_networkdevice_from_postman.py
    3. Copy script ở trên vào trong editor rồi save nó lại.
    Với nano, câu lệnh để lưu và thoát là ^+O (Ctrl+O) rồi Enter sau đó là ^+X (Ctrl+X) .
    4. Đổi quyền cho file để có thể chạy được:
    chmod 755 ise_post_networkdevice_from_postman.py
    5. Chạy script. Mã 201 nghĩa là nó đã được tạo, và UUID ở cuối Location URL là networkdevice id mới. Sẽ có một dòng trống trơn vì response.text - response body – trông không như lúc bạn tạo tài nguyên ở ERS. The additional print statements give you some satisfaction.
    (developer) [developer@devbox ~]$ ./ise_post_networkdevice_from_postman.py
    201


    (developer) [developer@devbox ~]$
    6. Copy giá trị networkdevice's id mới của bạn (không phải id ở trên - hoàn toàn khác).
    7. Vào Postman, click vào Environment Quick Look <O>, rê chuột trên Current Value để xem id sau đó bấm icon hình bút chì để sửa lại nó, và dán id mới vào rồi bấm Enter.
    8. Trong Postman, chọn NetworkDevice 》GET networkdevice/{id}, và bấm Send để xem network device của bạn.Đây rõ ràng là một script cơ bản với một mục đích duy nhất. Có rất nhiều điều mà mọi người ngay lập tức muốn làm để làm cho nó linh hoạt hơn:
    • Dùng biến – variable cho hostname và port trong URL
    • Dùng biến mẫu trong gói payload
    • Sửa trường Authorization trong header để có thể tự động mã hóa username va password sang Base64
    • Dùng biến để xác thực certificate
    • Thay đổi format hoặc màu sắc của output để nhìn đẹp hơn
    • Lấy giá trị đầu vào từ command line
    • Đọc từ file CSV và gửi đến nhiều network device thông qua các POST request
    • Và còn hơn thế nữa…
    Đây là lý do tại sao lập trình rất thú vị nhưng nó không phải là trọng tâm của lab này, vì vậy những cải tiến này sẽ được giao cho bạn trong thời gian rảnh rỗi và trí tưởng tượng của bạn.
Working...
X