พื้นฐานของ YAML (101)
YAML เป็นอีกหนึ่งรูปแบบของข้อมูลที่ให้อ่านเข้าใจง่าย ถูกใช้อย่างมากในโลกของ DevOps และ Container ดังจะเห็นบ่อย ๆ ใน configuration ต่าง ๆ เช่น
2021-10-18 16:30:38 - @ratanon
- Docker compose
- Manifest file ของ Kubernetes
- Mock server
ดังนั้นมาทำความรู้จักและเข้าใจเกี่ยวกับ YAML กันหน่อย
YAML (YAML Ain’t Markup Language) คืออะไร โดยเริ่มต้นย่อมาจาก Yet Another Markup Language แต่เปลี่ยนมาเป็น YAML Ain’t Markup Language เพื่อทำให้ชัดเจนว่าแตกต่างจาก Markup Language นะ เพราะว่ามันคือ Data Serialization Language
จะมีรูปแบบคล้ายกับ XML และ JSON แต่ใช้ syntax ที่น้อยหรือง่ายกว่า เพื่อให้ใช้งานและดูแลได้ง่าย และบอกว่าถูกออกแบบมาให้คนอ่านง่ายขึ้น จริงไหมนะ ?
ปล. แต่ถ้าไม่ได้ใช้ Text Editor หรือ IDE ที่สนับสนุน YAML แล้ว อาจจะทำให้คุณมีปัญหาได้ยกตัวอย่าง เช่น เพียงแค่ผิด 1 space bar อาจจะใช้เวลาหาข้อผิดพลาดมากก็ได้
ความสามารถของ YAML ที่แจ่ม ๆ คือ
- มี Build-in data type มาให้
- Multi-document support นั่นคือ สามารถรวมหลาย ๆ ไฟล์ อยู่ด้วยกัน โดยคั่นด้วย dash 3 ตัว (—) หรือ === ก็ได้
- Build-in comment ด้วย # ได้เลย
- มี Syntax ที่ผ่านเข้าใจง่าย โดยจะใช้ indentation เป็นหลัก เหมือนกับภาษา Python เลย โดยจะใช้ space แทน tab ไป เพื่อไม่ให้เกิดความสับสนต่อการใช้งาน
- Auto data type หรือเราจะกำหนดเองก็ได้ สำหรับชนิดของข้อมูล
ยกตัวอย่างเช่น
id: 1 name: name 1 --- id: 2 name: name 2 #comment is-an-integer: !!int 11.11 is-a-string: !!str 12.3 is-a-boolean: !!bool yes --- integer: 25 hex: 0x12d4 #evaluates to 4820 octal: 023332 #evaluates to 9946 float: 25.0 exponent: 12.3015e+05 #evaluates to 1230150.0 boolean: Yes string: "25" infinity: .inf # evaluates to infinity neginf: -.Inf #evaluates to negative infinity not: .NAN # Not a Number
รูปแบบ หรือ syntax ของ YAML
- เป็นข้อมูล key-value ซึ่งคั่นด้วย :
- สำหรับ String data type ไม่ต้อง double quote
- รูปแบบข้อมูลของ value แบบ string มีหลายรูปแบบ ทั้ง
- | สำหรับใส่บรรทัดใหม่ของแต่ละข้อมูล
- > สำหรับการแสดงเป็น paragraph หรือต่อเนื่องกัน
message_string: Hello World data_01: | These Newlines data_02: > This text is a single paragraph
ต่อมาเก็บข้อมูลในรูปแบบของ sequence ซึ่งจะมีลักษณะคล้ายกับ array หรือ list สำหรับเก็บหลาย ๆ ค่าใน key เดียว ยกตัวอย่างเช่น
fruit: - apple - banana - orange
รูปแบบ dictionary ก็มี
customers: - custome1: name: Cust 01 age: 30 - custome2: name: Cust 02 age: 25
แน่นอนว่ายังมีรูปแบบอื่น ๆ ให้ศึกษาและใช้งานอีก แต่นี่คือความรู้เบื้องต้นที่ควรต้องรู้จักไว้บ้าง ยกตัวอย่างที่อาจจะเจอคือ Manifest file ของ Kubernetes เป็นต้น
kind: Service metadata: name: web-app-svc spec: type: NodePort ports: - port: 8080 targetPort: 8080 nodePort: 30012 selector: app: web-app