Sổ tay kỹ thuật

Đọc YANG bằng pyang và yanglint

how-to#yang#pyang#netconf#gnmi· cập nhật 2026-11-06

Dùng khi cần tải model YANG cho IOS XR/Junos/OpenConfig, xem cây bằng pyang -f tree, tìm path cho NETCONF/gNMI và validate dữ liệu bằng yanglint.

Sửa trang này
Mục lục

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 openconfig

Model 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.yang

Kế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ệ
if.json
{
  "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