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.
Sau khi hoàn thành bài lab này, bạn có thể:
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ữ:
import sys
from helper import *
from ruamel import yaml
Trong đó:
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ư:
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:
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 để:
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:
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.
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ư:
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
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.
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.
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
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.
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 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.
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.
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 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.
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
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