XML, JSON และ YAML คืออะไรในมุมของ Network Engineer
XML, JSON และ YAML สุดสำคัญสำหรับ Network Engineer
— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (My Contents)
— — — — — — — — — — — — — — —
— — — — — — — — — — — — — — — — — — — — — — — -
ฝากคอร์ส Python for Network Automation ผมด้วยครับ
— — — — — — — — — — — — — — — — — — — — — — — -
ทั้ง 3 ตัวนี้เป็น data format ที่สำคัญสำหรับ network engineer โดยเฉพาะอนาคตอันใกล้นี้ในยุคของ network programmability หรือ SDN ที่กำลังจะมาถึง
XML และ JSON คือ data format ที่นิยมใช้กันทั่วไปใน API หลาย ๆ ตัว ส่วน YAML เองมักจะนำมาใช้กับข้อมูลที่เป็นพวก configuration ครับ
XML (Extensible Markup Language)
XML เป็น tag-based language ที่มีโครงสร้างคล้ายกับภาษา HTML มาก ๆ (จริง ๆ เรียกว่า syntax มันเหมือนกันเลยดีกว่า) โดยทุกอย่างจะขึ้นต้นและปิดท้าย <tag></tag> เช่น…
<name>Nopnithi</name>
โดย <tag></tag> จะคร่อมข้อมูลในแนวนอนหรือแนวตั้งก็ได้หมดครับ อย่างข้างล่างนี้สังเกตว่าข้อมูลทั้งหมดใน tag ชื่อ router นั้นถือว่าอยู่ภายใต้ tag ชื่อ devices (<devices></devices>) นะครับ
<devices>
<router>
<name>R1</name>
<vendor>Cisco</vendor>
<ip>1.1.1.1</ip>
</router>
<router>
<name>R2</name>
<vendor>Huawei</vendor>
<ip>2.2.2.2</ip>
</router>
<router>
<name>R3</name>
<vendor>Nokia</vendor>
<ip>3.3.3.3</ip>
</router>
</devices>
XML จะมี indentation (ใช้ soft tab หรือ 2 space) เพื่อให้เป็น hierarchical ช่วยให้มันอ่านง่ายขึ้นสำหรับมนุษย์ (human friendly) แต่ใช้งานจริงไม่จำเป็นต้องมีก็ได้
JSON (JavaScript Object Notation)
ถัดมาคือ JSON ตัวนี้เป็น data format ที่ผมชอบที่สุด โดย JSON ถูกใช้ใน API ที่เป็น HTTP web service อย่าง REST API ซึ่งเป็น API ที่เหล่า network engineer จะเริ่มเจอในอุปกรณ์รุ่นใหม่ ๆ หลังจากนี้ไปเพราะมันจะค่อย ๆ มาแทนที่การ configure ผ่าน CLI (Command-Line Interface) ครับ
- Key กับ value ถูก separate ด้วย : (colon)
- Object ต้องคร่อมด้วย { } (curly brace)
- List ต้องคร่อมด้วย [ ] (square bracket)
- ใช้ , (comma) เพื่อ separate แต่ละ object
- ใช้ “ ” (double-quotes) คร่อม data ที่เป็น string
- ไม่จำเป็นต้องมี indentation (แต่ถ้าอยากมีก็ใช้ space)
ตัว JSON เองเก็บข้อมูลในรูปแบบ key-value pairs แปลตามตัวคือข้อมูลที่จับคู่กัน โดยตัวแรกเรียก key ส่วนตัวหลังเรียก value ลองนึกถึง dictionary หรือพจนานุกรมหนะครับ เช่น ant = มด ก็จะได้เป็น
{"ant": "มด"}
ข้อมูลตัวอย่างของเราเมื่อเก็บเป็นแบบ JSON ก็จะได้แบบนี้
"devices":{
"router":[
{
"name":"R1",
"vendor":"Cisco",
"ip":"1.1.1.1"
},
{
"name":"R2",
"vendor":"Huawei",
"ip":"2.2.2.2"
},
{
"name":"R3",
"vendor":"Nokia",
"ip":"3.3.3.3"
}
]
}
สังเกตว่า overhead น้อยกว่า XML ชัดเจนเพราะมันไม่มี tag มาปิดท้าย
ข้อดีของมันอีกอย่างเลยคือมันมีรูปแบบเหมือน data structure ของ Python อย่าง dictionary และ list ครับ มันสามารถใช้แทนกันได้ทันที นี่แหละเป็นเหตุผลว่าทำไมผมถึงชอบมันที่สุด
อะ…เดี๋ยวผมจะลอง convert JSON เป็น Python data structure ให้ดูละกัน ถ้าใครใช้ double quote (“) อยู่แล้วเนี่ยมันเหมือนกันเลยแหละ แค่ไม่มี indentation
{"devices": {"router": [{"name": "R1", "vendor": "Cisco", "ip": "1.1.1.1"}, {"name": "R2", "vendor": "Huawei", "ip": "2.2.2.2"}, {"name": "R3", "vendor": "Nokia", "ip": "3.3.3.3"}]}}
ฉะนั้นการทำอะไรกับ JSON ไม่ว่าจะเป็น create, edit หรือ parse ข้อมูลจาก JSON ไปใช้ใน Python หรือจาก Python มาเป็น JSON จึงง่ายที่สุดครับ
YAML (YAML Ain’t Markup Language)
ตัวนี้เป็น data format ที่ human friendly ที่สุดที่เราคุยกันวันนี้แล้ว อ่านง่าย เขียนก็ยังง่าย ซึ่งจุดสำคัญของมันมีดังนี้
- Key กับ value ถูก separate ด้วย : (colon)
- List เริ่มต้นด้วย
-
(hyphen) - ต้องมี indentation ด้วย และใช้ space (ไม่ใช่ tab)
- สามารถ comment ได้ด้วย # (อันนี้เป็นสิ่งที่ดีกว่า XML และ JSON)
อย่างที่บอกไปข้างต้น YAML เป็น data format ที่นิยมใช้กับข้อมูลที่เป็นพวก configuration หนะครับ นอกจากอ่านง่ายแล้วก็น่าจะเพราะความสามารถข้อสุดท้ายนี่แหละครับ คือมันสามารถ #comment เพื่ออธิบายรายละเอียดของข้อมูลได้
อะ…ไปดูตัวอย่างของ YAML ซักหน่อยครับว่ามันเป็นยังไง
devices:
router:
- name: R1
vendor: Cisco
ip: 1.1.1.1
- name: R2
vendor: Huawei
ip: 2.2.2.2
- name: R3
vendor: Nokia
ip: 3.3.3.3
ที่สำคัญเรามักจะเห็นมันถูกใช้อยู่ในพวก software หรือ tool หลายตัวอย่างพวก configuration management ถ้าเอาที่ใกล้ตัว network engineer อย่างพวกเราก็คงจะเป็น Ansible หรือ Nornir ประมาณนี้ครับ
ประโยชน์ของ Data Format ในงาน Network
ถ้าพูดถึง data format เพียว ๆ เลยเนี่ย ก็ต้องบอกว่ามันช่วยให้ง่ายสำหรับการ parse เอาข้อมูลที่เราต้องการออกมาใช้ เช่น ปกติเวลาเราใช้ command เพื่อดู arp บนอุปกรณ์เนี่ยมันจะ output มาแบบนี้
router#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 10.10.20.48 - 0050.56bb.18c4 ARPA GigabitEthernet1
Internet 10.10.20.253 0 0896.ad9e.444c ARPA GigabitEthernet1
Internet 10.10.20.254 161 0008.e3ff.fd90 ARPA GigabitEthernet1
และเมื่อเราต้องการจะ parse เอาข้อมูลที่ต้องการออกมาก็ต้องมาใช้ Regular Expression งัดแงะมันออกมาใส่ data structure ที่เรา design ไว้อีกทีเพื่อนำไปใช้งานในโปรแกรมต่อไป ซึ่งมันจะยุ่งยากสำหรับบางคนที่ไม่ถนัด programming
แต่…เมื่อ router ของเรารองรับการโชว์ output มาเป็น XML, JSON หรืออาจมี REST API ให้เราใช้แล้วเนี่ย การดึงข้อมูล status ต่าง ๆ ของอุปกรณ์จะนำไปใช้งานต่อได้ง่ายมากขึ้นแบบนี้
<?xml version="1.0" encoding="UTF-8"?>
<ShowArp xmlns="ODM://disk0:/spec.odm//show_arp">
<ARPTable>
<entry>
<Protocol>Internet</Protocol>
<Address>10.10.20.48</Address>
<MAC>0050.56bb.18c4</MAC>
<Type>ARPA</Type>
<Interface>GigabitEthernet1</Interface>
</entry>
<entry>
<Protocol>Internet</Protocol>
<Address>10.10.20.253</Address>
<Age>0</Age>
<MAC>0896.ad9e.444c</MAC>
<Type>ARPA</Type>
<Interface>GigabitEthernet1</Interface>
</entry>
<entry>
<Protocol>Internet</Protocol>
<Address>10.10.20.254</Address>
<Age>161</Age>
<MAC>0008.e3ff.fd90</MAC>
<Type>ARPA</Type>
<Interface>GigabitEthernet1</Interface>
</entry>
</ARPTable>
</ShowArp>
เพราะเมื่อเราได้ output มาแบบนี้ มันพร้อมนำไปใช้งานต่อในการเขียน code ได้ทันที อย่างใน Python เองก็มี library สำหรับ parse พวก XML, JSON หรือ YAML อยู่แล้ว หรือจะ convert กลับไปกลับมาก็ง่ายมาก
มาดูแบบเป็น JSON บ้าง อันนี้ดีกว่า XML เพราะมันไม่ต้อง parse อะไรเลย มันคือ data structure ของ Python โต้ง ๆ เลยครับ แถมการเล่นกับ JSON ใน Python ก็มี built-in library มาพร้อมเสร็จสรรพ
{
"ShowArp": {
"ARPTable": {
"entry": [
{
"Protocol": "Internet",
"Address": "10.10.20.48",
"MAC": "0050.56bb.18c4",
"Type": "ARPA",
"Interface": "GigabitEthernet1"
},
{
"Protocol": "Internet",
"Address": "10.10.20.253",
"Age": "0",
"MAC": "0896.ad9e.444c",
"Type": "ARPA",
"Interface": "GigabitEthernet1"
},
{
"Protocol": "Internet",
"Address": "10.10.20.253",
"Age": "161",
"MAC": "0008.e3ff.fd90",
"Type": "ARPA",
"Interface": "GigabitEthernet1"
}
]
}
}
}
โอเคครับ…ตอนนี้ผมคิดว่าหลาย ๆ คนน่าจะพอเห็นภาพว่า data format อย่าง XML, JSON และ YAML คืออะไรและมีประโยชน์กับ network engineer ยังไง ซึ่งจริง ๆ มันก็คือรูปแบบหรือวิธีในการเก็บข้อมูลนั่นแหละ และเป็นรูปแบบที่มันเหมาะจะนำไปเขียนโปรแกรมต่อมากกว่า output ที่เป็น CLI นั่นเอง
ทีนี้ใครอยากศึกษาให้ละเอียดขึ้น สามารถตามมาต่อได้ที่บทความนี้ครับ
JSON และ YAML คืออะไร? มาเรียนไปด้วยกันดีกว่า
— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (My Contents)
— — — — — — — — — — — — — — —