Tóm tắt: Lấy model từ repo YangModels/yang (vendor + IETF) hoặc openconfig/public → pyang -p <thư mục> -f tree để xem cây → --tree-path / -f flatten để rút đúng path → dùng path đó trong NETCONF filter hoặc gNMI. yanglint (libyang) dùng để validate file JSON/XML theo model trước khi đẩy. Khái niệm path, OpenConfig vs native: gNMI, YANG và cú pháp path.
Luồng hoạt động
flowchart LR A["YangModels/yang, openconfig/public"] --> B["thư mục yang/"] C["thiết bị: get-schema, /pkg/yang"] --> B B --> D["pyang -f tree"] D --> E["--tree-path / -f flatten"] E --> F["path cho NETCONF / gNMI"] B --> G["yanglint validate data.json"]
Lệnh
Cài và tải model
python3 -m pip install pyang
sudo apt install libyang2-tools # Ubuntu 22.04 (gói có thể tên khác trên bản khác: libyang-tools, yanglint)
# Chỉ lấy phần cần trong repo YangModels/yang (repo rất lớn)
git clone --depth 1 --filter=blob:none --sparse https://github.com/YangModels/yang.git
cd yang
git sparse-checkout set vendor/cisco/xr standard/ietf/RFC
ls vendor/cisco/xr/ # thư mục theo release, ví dụ 7111 = 7.11.1
# OpenConfig
git clone --depth 1 https://github.com/openconfig/public.git openconfigModel trong repo có thể khác bản chạy trên router. Nguồn chính xác nhất là chính thiết bị: NETCONF <get-schema> (ncclient m.get_schema("Cisco-IOS-XR-um-interface-cfg"), xem NETCONF với ncclient), hoặc trên IOS XR run ls /pkg/yang. Junos có repo riêng Juniper/yang trên GitHub, chia theo release.
pyang: xem cây
XR=yang/vendor/cisco/xr/7111
# Cây đầy đủ của một module (-p tìm import/include, mặc định đệ quy vào thư mục con)
pyang -p $XR -f tree $XR/Cisco-IOS-XR-um-interface-cfg.yang | less
# Giới hạn độ sâu
pyang -p $XR -f tree --tree-depth 3 $XR/Cisco-IOS-XR-ipv4-bgp-oper.yang
# Chỉ in một nhánh (path không cần prefix)
pyang -p openconfig/release/models -f tree \
--tree-path /interfaces/interface/state/counters \
openconfig/release/models/interfaces/openconfig-interfaces.yang
# Model có augment: đưa cả module augment vào để thấy nhánh được thêm
pyang -p ietf -f tree ietf/ietf-interfaces.yang ietf/ietf-ip.yangĐọc ký hiệu cây (pyang -f tree --tree-help):
| Ký hiệu | Ý nghĩa |
|---|---|
rw / ro |
Config (ghi được) / state (chỉ đọc, dùng cho oper/telemetry) |
list* [name] |
List, key là name → path gNMI interface[name=Gi0/0/0/0] |
leaf? |
Leaf tuỳ chọn |
container! |
Presence container (có mặt đã mang nghĩa) |
leaf-list* |
Danh sách giá trị |
x-- / o-- |
Deprecated / obsolete |
+--:(case) |
Nhánh của choice (không xuất hiện trong path dữ liệu) |
prefix:node |
Node đến từ module khác (augment), ví dụ ip:ipv4 |
{feature}? |
Chỉ có khi thiết bị bật feature đó |
pyang: rút path
# Liệt kê mọi path dạng XPath có prefix module, lọc bằng grep
pyang -p $XR -f flatten $XR/Cisco-IOS-XR-ipv4-bgp-oper.yang | grep neighbor | head
# Kèm kiểu dữ liệu và cờ config/state
pyang -p ietf -f flatten --flatten-type --flatten-flag ietf/ietf-interfaces.yangKết quả -f flatten có dạng /ietf-interfaces:interfaces/interface/enabled. Với gNMI đổi thành ietf-interfaces:interfaces/interface[name=...]/enabled hoặc bỏ prefix nếu thiết bị chấp nhận.
pyang: kiểm tra model tự viết
| Mục đích | Lệnh |
|---|---|
| Kiểm tra cú pháp, import | pyang -p deps/ my-module.yang |
| Kiểm tra theo RFC 8407 | pyang --lint -p deps/ my-module.yang |
| Kiểm tra tương thích ngược | pyang --check-update-from old/my-module.yang my-module.yang |
| Sinh XML mẫu | pyang -f sample-xml-skeleton --sample-xml-skeleton-doctype config my-module.yang |
| Cây dạng HTML (jstree) | pyang -f jstree -o tree.html my-module.yang |
yanglint: cây và validate dữ liệu
M=/usr/local/share/yang/modules # nơi chứa ietf/ iana/ ; đổi theo máy bạn
# Cây một nhánh (path có prefix module)
yanglint -p $M/ietf -f tree -P /ietf-interfaces:interfaces/interface $M/ietf/ietf-interfaces.yang
# Validate file JSON config theo các module liên quan
yanglint -p $M/ietf -p $M/iana -t config \
$M/ietf/ietf-interfaces.yang $M/ietf/ietf-ip.yang $M/iana/iana-if-type.yang if.json
echo $? # 0 = hợp lệ{
"ietf-interfaces:interfaces": {
"interface": [
{
"name": "ge-0/0/0",
"type": "iana-if-type:ethernetCsmacd",
"enabled": true,
"ietf-ip:ipv4": { "address": [ { "ip": "192.0.2.1", "prefix-length": 31 } ] }
}
]
}
}| Option yanglint | Ý nghĩa |
|---|---|
-p DIR |
Thêm thư mục tìm module, lặp lại được |
-t config / -t data / -t edit |
Loại dữ liệu: config, datastore đầy đủ (có state), nội dung edit-config |
-f tree / -f json / -f xml |
Định dạng đầu ra (chuyển đổi XML ↔ JSON) |
-P PATH |
Chỉ in một nhánh schema |
-F mod:feat1,feat2 |
Chọn feature được bật |
-l |
Liệt kê module đã nạp |
| không tham số | Chế độ tương tác (add, print, data...) |
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách xử lý |
|---|---|---|
error: module "X" not found in search path |
Thiếu module được import | Thêm -p tới thư mục chứa nó (IETF/IANA thường nằm ở standard/ietf/RFC) |
Cây thiếu nhánh ipv4, config mong đợi |
Nhánh đó do module khác augment | Truyền thêm module augment vào cùng lệnh |
| Path chạy trên thiết bị báo không tồn tại | Model trong repo khác release hoặc thiết bị có deviation | Lấy model từ thiết bị (get-schema), xem module *-deviations |
yanglint báo Invalid identityref value |
Thiếu prefix module trong giá trị identity | Viết iana-if-type:ethernetCsmacd, nạp iana-if-type.yang |
yanglint báo Mandatory node ... missing với dữ liệu state |
Dùng -t data cho file chỉ có config |
Dùng -t config |
pyang chạy rất chậm |
-p trỏ vào cả repo YangModels |
Trỏ đúng thư mục release cần dùng |
Tham khảo
- pyang
- libyang / yanglint
- YangModels/yang
- OpenConfig public models
- Dùng path trong gnmic: gnmic cheatsheet