รู้จักกับ YANG ให้มากขึ้นด้วยการสร้าง Data Model ขึ้นมาใช้ซะเองเลย

อยากเข้าใจ YANG ก็ฝึกเขียน YANG ซะเลยดิ

Nopnithi Khaokaew (Game)
3 min readJul 8, 2019

— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (My Contents)
— — — — — — — — — — — — — — —

— — — — — — — — — — — — — — — — — — — — — — — -

ฝากคอร์ส Python for Network Automation ผมด้วยครับ

— — — — — — — — — — — — — — — — — — — — — — — -

ด้วยความที่ผมอยากเข้าใจ YANG ให้มากขึ้น ผมเลยต้องเรียนรู้วิธีการเขียน YANG ให้ได้ในระดับพื้นฐานเพื่อที่จะลองสร้าง data model ของตัวเองขึ้นมา โดย data model ของผม คือ “nopnithi-football.yang” ซึ่งเป็นข้อมูลเกี่ยวกับฟุตบอล

Note: อันที่จริง network engineer ไม่จำเป็นต้องเรียนรู้การสร้าง data model (วิธีเขียน YANG) นะครับ เพียงแค่ต้องอ่านและเข้าใจ tree-based YANG จาก pyang ได้ก็พอแล้วครับ

ผมใช้ Tools อะไรบ้าง

คลิกที่ลิงค์แล้วไปหาวิธี install เอานะครับ ไม่ยาก…

  • Python (Programming language)
  • pyang (Python library)
  • pyangbind (Python library)

สร้าง Data Model ด้วย YANG

ผมตั้งชื่อไฟล์เป็น nopnithi-football.yang ตามนี้เลย

module nopnithi-football {
namespace "https://medium.com/@nopnithi";
prefix nfb;
revision 2019-07-07 {
description "Initial version";
}
typedef gender-type {
type enumeration {
enum male;
enum female;
}
description "describe gender for all footballers";
}
container footballers {
list footballer {
key name;

leaf name {
type string;
description "name for a footballer";
}
leaf id {
type uint32;
mandatory true;
}
leaf age {
type uint8 {
range 1..120;
}
description "age must between 1 to 120";
}
leaf gender {
type gender-type;
description "gender must be male or female";
}
leaf club {
type string;
}
leaf goals {
config false;
type uint8;
units goal(s)/year;
description "number of goals per year";
}
leaf assists {
config false;
type uint8;
units assist(s)/year;
description "number of assists per year";
}
leaf retire-status {
config false;
type boolean;
}
}
}
container clubs {
list club {
key name;
leaf name {
type string;
}
leaf id {
type uint32;
mandatory true;
}
}
}
}

ลองดู Model ที่สร้างมาเป็น Tree-Based ด้วย pyang

pyang -f tree nopnithi-football.yang

ก็จะได้แบบนี้

module: nopnithi-football
+--rw footballers
| +--rw footballer* [name]
| +--rw name string
| +--rw id uint32
| +--rw age? uint8
| +--rw gender? gender-type
| +--rw club? string
| +--ro goals? uint8
| +--ro assists? uint8
| +--ro retire-status? boolean
+--rw clubs
+--rw club* [name]
+--rw name string
+--rw id uint32

Convert ไฟล์ YANG เป็น Python ด้วย pyangbind

pyang --plugindir /Users/nopnithi/Documents/Developer/Personal/YANG/venv/lib/python3.7/site-packages/pyangbind/plugin/ -f pybind -o nopnithi_football.py nopnithi-football.yang

จากนั้นจะได้ไฟล์ nopnithi_football.py ออกมาให้เราเล่นกันต่อ

ลองนำ Model ของเราไปใช้งานใน Python

เริ่มจาก create ไฟล์ test.py ขึ้นมา ใส่ code ตามนี้

__author__ = 'Nopnithi Khaokaew'from nopnithi_football import nopnithi_football
import pyangbind.lib.pybindJSON as pybindJSON
model = nopnithi_football()
# print(model.get())
messi = model.footballers.footballer.add('Lionel Messi')
messi.id = 1 # config
messi.age = 32 # config
messi.gender = 'male' # config
messi.club = 'FC Barcelona' # config
ronaldo = model.footballers.footballer.add('Cristiano Ronaldo')
ronaldo.id = 2
ronaldo.age = 34
ronaldo.gender = 'male'
ronaldo.club = 'Juventus'
barcelona = model.clubs.club.add('FC Barcelona')
barcelona.id = 1
print(pybindJSON.dumps(model))

อธิบายทุกอย่างที่ทำมาดังนี้

เริ่มแรกผมสร้าง data model ด้วย YANG มาก่อน ทีนี้ผม convert ไอ้ model เนี้ยมาใช้บน Python ด้วย pyangbind จากนั้นก็เรียก model มาใช้งานใน Python เลย

จาก code ด้านบน สังเกตว่าผม add นักฟุตบอลคนแรกเข้าไปก่อนคือ Messi โดยจาก model ที่ผมสร้าง สิ่งที่แต่ละ object(แทนนักฟุตบอล 1 คน) ต้องมีก็คือ id, age, gender และ club ซึ่งแต่ละอย่างก็มีการกำหนดว่า value จะต้องเป็นแบบไหน เช่น age ต้องเป็นตัวเลขนะ 1–120 นะ (ดูได้จาก YANG)

ทีนี้ถ้าหากว่าผมมีการใส่ข้อมูลที่ไม่เป็นไปตาม data model มันก็จะ error และใช้งานไม่ได้นั่นเอง เช่น ถ้าบรรทัดที่ 5 ผมใส่เป็น “messi.age = Thirty Two” ก็จะไม่ได้

พอเห็นภาพมั้ยครับว่ามันเอาไปใช้ใน network device ยังไง?

ใช่ครับ…เอาไปใช้ในการ configure หรือ monitor นั่นเอง เช่น ถ้าหาก router แบรนด์ A, B และ C ต่างก็บอกว่า เห้ย…พวกข้า support กับ YANG model ของ OpenConfig นะ

นั่นแปลว่าด้วย automation system แบบเดียวที่คุณพัฒนาขึ้นมาจะสามารถ configure หรือ monitor ได้ทั้ง 3 เจ้าเลยนั่นเอง ซึ่ง cross-vendor นี่แหละที่ถือว่าเป็นหนึ่งในคีย์ของ network automation

— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (My Contents)
— — — — — — — — — — — — — — —

--

--

Nopnithi Khaokaew (Game)
Nopnithi Khaokaew (Game)

Written by Nopnithi Khaokaew (Game)

Cloud Solutions Architect & Hobbyist Developer | 6x AWS Certified, CKA, CKAD, 2x HashiCorp Certified (Terraform, Vault), etc.