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.
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Lab - Chuyển đổi dữ liệu API giữa YAML, JSON và XML bằng Python

    Khi bắt đầu học DevNet hoặc Network Automation, nhiều người thường tập trung vào Python hoặc API mà quên mất một kỹ năng quan trọng khác: làm việc với dữ liệu.
    Trên thực tế, một kỹ sư DevNet gần như phải làm việc hàng ngày với ba định dạng dữ liệu phổ biến nhất hiện nay là JSON, XML và YAML.
    • REST API và RESTCONF sử dụng JSON.
    • NETCONF sử dụng XML.
    • Ansible Playbook sử dụng YAML.
    Vì vậy trước khi đi sâu vào Automation hay lập trình mạng, việc hiểu cách đọc, xử lý và chuyển đổi dữ liệu giữa các định dạng này là một kỹ năng gần như bắt buộc. Mục tiêu bài lab


    Sau khi hoàn thành bài lab này, bạn có thể:
    • Đọc dữ liệu YAML bằng Python.
    • Chuyển đổi dữ liệu YAML thành đối tượng Python.
    • Serialize dữ liệu sang JSON.
    • Đọc và phân tích XML bằng ElementTree.
    • Đọc XML bằng MiniDOM.
    • Làm việc với XML Namespace.
    • Hiểu được vai trò của XML, JSON và YAML trong các giải pháp Automation hiện nay.
    Phần 1: Đọc dữ liệu YAML bằng Python Bước 1: Cài đặt thư viện xử lý YAML


    Mở CMD hoặc Terminal và thực hiện:
    py -m pip install ruamel.yaml
    ruamel.yaml là thư viện phổ biến được sử dụng để đọc và xử lý file YAML trong môi trường Automation.
    Trong thực tế, Ansible cũng sử dụng YAML để lưu trữ:
    • Playbook
    • Inventory
    • Variables
    • Template cấu hình
    Bước 2: Import các thư viện cần thiết


    import sys
    from helper import *
    from ruamel import yaml
    Trong đó:
    • helper.py chứa class User và các hàm hỗ trợ.
    • ruamel.yaml dùng để xử lý dữ liệu YAML.
    Bước 3: Mở file YAML


    with open('user.yaml','r') as stream:
    Trong môi trường DevNet, việc đọc file cấu hình hoặc file inventory là thao tác diễn ra thường xuyên trong các hệ thống Automation. Bước 4: Chuyển YAML sang đối tượng Python


    user_yaml = yaml.safe_load(stream)
    Sau khi thực hiện lệnh này, toàn bộ nội dung trong file YAML sẽ được chuyển thành đối tượng Python. Bước 5: Kiểm tra kiểu dữ liệu


    print(type(user_yaml))
    Kết quả:
    <class 'dict'>
    Điều này cho thấy dữ liệu YAML sau khi được đọc sẽ trở thành Dictionary trong Python.
    Đây cũng chính là cách Ansible xử lý Playbook và Inventory ở phía bên trong. Bước 6: Kiểm tra các trường dữ liệu


    for key in user_yaml:
    print(key)
    Ví dụ kết quả:
    id
    first_name
    last_name
    birth_date
    address
    score
    Các trường này chính là các key được định nghĩa trong file YAML. Bước 7: Tạo đối tượng User


    user = User()
    Trong thực tế, các hệ thống API thường không làm việc trực tiếp với Dictionary mà sẽ chuyển dữ liệu thành Object để dễ quản lý và xử lý hơn. Bước 8: Mapping dữ liệu từ YAML sang Object


    user.id = user_yaml['id']
    user.first_name = user_yaml['first_name']
    user.last_name = user_yaml['last_name']
    user.birth_date = user_yaml['birth_date']
    user.address = user_yaml['address']
    user.score = user_yaml['score']
    Đây được gọi là quá trình Data Mapping.
    Trong các nền tảng như Cisco DNA Center, Cisco NSO hoặc Meraki Dashboard API, dữ liệu nhận được từ API cũng thường được chuyển thành Object để xử lý theo cách tương tự. Bước 9: Kiểm tra kết quả


    print(user)
    Lúc này dữ liệu đã được chuyển hoàn toàn từ YAML sang đối tượng Python.
    Phần 2: Chuyển đổi dữ liệu sang JSON
    JSON hiện nay là định dạng dữ liệu phổ biến nhất trong thế giới API.
    Hầu hết các API của Cisco hiện nay đều sử dụng JSON, chẳng hạn như:
    • Cisco DNA Center API
    • Meraki Dashboard API
    • Webex API
    • FMC API
    • RESTCONF API
    Import thư viện JSON


    import json Chuyển Object sang JSON


    user_json = json.dumps(
    user,
    default=serializeUser
    )
    Do đối tượng User không phải kiểu dữ liệu mà JSON có thể xử lý trực tiếp nên cần sử dụng hàm serializeUser() để thực hiện quá trình chuyển đổi. Hiển thị dữ liệu JSON


    print(user_json)
    Ví dụ:
    {
    "id":1,
    "first_name":"John",
    "last_name":"Doe"
    } Format JSON cho dễ đọc


    user_json = json.dumps(
    user,
    default=serializeUser,
    indent=4,
    sort_keys=True
    )
    Ý nghĩa:
    • indent=4: tạo cấu trúc thụt lề dễ đọc.
    • sort_keys=True: sắp xếp key theo thứ tự alphabet.
    Đây là kỹ thuật mà các kỹ sư DevNet thường sử dụng khi debug API hoặc phân tích dữ liệu trả về từ thiết bị. Ghi dữ liệu ra file JSON


    file = open("user.json","w")
    file.write(user_json)
    file.close()
    Sau khi thực hiện, hệ thống sẽ tạo file:
    user.json
    Trong thực tế, phương pháp này thường được sử dụng để:
    • Backup dữ liệu API.
    • Tạo inventory động.
    • Lưu trạng thái thiết bị phục vụ Automation.
    Phần 3: Phân tích XML bằng ElementTree
    Mặc dù JSON ngày càng phổ biến, XML vẫn đóng vai trò rất quan trọng trong môi trường Enterprise.
    Một số công nghệ vẫn sử dụng XML:
    • NETCONF
    • SOAP API
    • Cisco NSO
    • Cisco Prime Infrastructure
    Import thư viện


    import xml.etree.ElementTree as ET Parse file XML


    tree = ET.parse('user.xml')
    root = tree.getroot()
    Toàn bộ cấu trúc XML lúc này đã được nạp vào bộ nhớ. Hiển thị các tag trong XML


    for element in root:
    print(element.tag)
    Ví dụ:
    id
    first_name
    last_name
    address
    score Truy cập giá trị của tag id


    print(root.find('id').text)
    Kết quả:
    1001 Tìm toàn bộ phần tử address


    addresses = root.findall('address')
    Sau đó:
    for address in addresses:
    for i in address:
    print(i.tag + ':' + i.text) Hiển thị toàn bộ cấu trúc XML


    for k in root.iter():
    print(k.tag + ':' + k.text)
    Đây là kỹ thuật thường được sử dụng khi phân tích dữ liệu XML trả về từ NETCONF Server.
    Phần 4: Phân tích XML bằng MiniDOM
    MiniDOM là một phương pháp khác để xử lý XML trong Python. Import thư viện


    import xml.dom.minidom as MD Parse XML


    dom = MD.parse('user.xml') Hiển thị các tag


    for node in dom.childNodes:
    printTags(node.childNodes) Lấy giá trị của id


    idElements = dom.getElementsByTagName('id')

    elementId = idElements.item(0)

    idValue = elementId.firstChild.data

    print(idValue) Hiển thị các phần tử address


    for node in dom.getElementsByTagName('address'):
    printNodes(node.childNodes)
    Trong quá trình xử lý XML bằng Python, chúng ta có thể sử dụng cả ElementTree và MiniDOM.
    • ElementTree có ưu điểm là đơn giản, dễ sử dụng và xử lý nhanh đối với các file XML lớn.
    • MiniDOM cung cấp khả năng thao tác theo mô hình DOM truyền thống, phù hợp khi cần làm việc với cấu trúc XML phức tạp hoặc cần truy cập sâu vào các node.
    Trong thực tế triển khai DevNet và Network Automation, phần lớn kỹ sư sẽ ưu tiên sử dụng ElementTree nhờ cú pháp ngắn gọn và hiệu năng tốt hơn khi xử lý dữ liệu XML trả về từ các hệ thống như NETCONF hoặc Cisco NSO.
    Phần 5: Làm việc với XML Namespace
    Namespace thường xuất hiện trong các công nghệ như:
    • NETCONF
    • YANG Model
    • SOAP API
    Định nghĩa Namespace


    namespaces = {
    'a':'https://www.example.com/network',
    'b':'https://www.example.com/furniture'
    } Tìm dữ liệu theo Namespace


    elementsInNSa = root.findall('a:table',namespaces)

    elementsInNSb = root.findall('b:table',namespaces) Hiển thị dữ liệu trong Namespace a


    for e in elementsInNSa:
    for i in e.iter():
    print(i.tag + ':' + i.text) Hiển thị dữ liệu trong Namespace b


    for element in list(elementsInNSb[0]):
    print(element.tag + ":" + element.text)
    Kết luận
    Đây là một trong những bài lab nền tảng nhất của DevNet và Network Automation.
    Nếu nắm vững bài lab này, bạn sẽ dễ dàng tiếp cận các công nghệ hiện đại như: REST API/RESTCONF/Cisco DNA Center API/Meraki API/NETCONF/YANG Model/Cisco NSO/Ansible Automation​
    Attached Files
Working...
X