خانه » آموزش YAML | شروع کار با YAML
DevOPS آموزش ابزار شبکه

آموزش YAML | شروع کار با YAML

مبانی YAML

شما ممکن است به عنوان یک توسعه دهنده، مدیر، مهندس ابر یا مهندس DevOps کار کنید، و صرف نظر از نقش های خود، با YAML روبرو خواهید شد و مهم است که در خصوص چیستی و نحوه عملکرد yaml درک درستی داشته باشید. این مقاله به گونه ای تنظیم شده که شما را با اصول یامل آشنا کند.

قبل از شروع کار با مبانی YAML، اجازه دهید یک مقدمه کوتاه در مورد سریال سازی داده ها (Data Serialization) به شما ارائه دهم.

سریال سازی داده ها چیست؟

به عبارت ساده تر، سریال سازی داده ها فرآیند تبدیل داده های شما به فرمتی است که می تواند ذخیره شود، از طریق شبکه منتقل شود و توسط برنامه تفسیر شود.

سه فرمت متداول سریال سازی داده ها XML ، JSON ، YAML هستند . ما همچنین فرمت های دیگری مانند BSON، MessagePack و Protobuf و غیره داریم.

این راهنما فقط بر چیستی YAML و نحوه کار با YAML با مثال های عملی تمرکز دارد.

YAML چیست؟

YAML، مخفف YAML ain’t markup language، یک زبان سریال سازی داده ها است که اَبَر مجموعه ای از نوع JSON است. YAML به دلیل سادگی بسیار محبوب است. ایجاد و خواندن فایل های YAML در مقایسه با XML یا JSON آسان تر است.

ابزارهای مدرن مانند ansible، docker ، Kubernetes، Chef و غیره و محیط‌های ابری مانند AWS، Azure، GCP از YAML استفاده می‌کنند. فایل های پیکربندی و استقرار زیادی را خواهید دید که با استفاده از YAML نوشته شده اند. برای مثال playbookها در Ansible به زبان YAML نوشته می شوند.

بسیاری از زبان های برنامه نویسی محبوب دارای کتابخانه هایی برای کار با YAML هستند، بنابراین YAML می تواند به راحتی با هر محیطی ادغام شود.

پسوند YAML

فایل های YAML باید با پسوند yml یا  yamlذخیره شوند . هر ویرایشگر متن محبوب مانند vscode، atom، vim، sublime text و غیره، از زبان YAML پشتیبانی می کنند.

همچنین می‌توانید افزونه‌هایی مانند yaml linter، مبدل yaml به JSON/XML، YAML beautify و غیره را روی ویرایشگرهای متن خود نصب کنید که هنگام کار با YAML ویژگی‌های بیشتری را ارائه می‌دهند.

ساختار پایه YAML

ساختار اصلی YAML توالی یا نوع دیکشنری است. نوع توالی شبیه به لیست پایتون و نوع دیکشنری شبیه دیکشنری های پایتون است.

دیکشنری ها، جفت های کلید-مقدار هستند که کلید آنها از نوع رشته ای است و مقدار می تواند از هر نوعی باشد. برای جدا کردن کلید و مقدار از کولون ( : ) استفاده کنید.

Site_name: linuxme

هر سند در جریان YAML باید با استفاده از سه خط تیره ( ---) و سه نقطه ( ) از هم جدا شود. سه خط تیره ( ---) به شروع سند و سه نقطه ( ) به انتهای سند در جریان نشان می دهد. در صورت عدم وجود اسناد متعدد، استفاده از خط تیره و نقطه ضروری نیست.

---
operating_system: Redhat
version: 8
Same_family:
 - Rocky Linux
 - Alma Linux
 - Fedora Linux
...

---
operating_system: Debian
version: 11
Same_family:
 - Ubuntu
 - Linux Mint
 - Pop!_OS
...

YAML از تورفتگی برای تعریف ساختار شی استفاده می کند. TAB پشتیبانی نمی شوند و باید دو فاصله برای تورفتگی بگذارید. زمانی که از tabs در ویرایشگر متنی که از YAML پشتیبانی می کند استفاده می کنید، دو فاصله بجای آن درج می کند.

تورفتگی YAML

در بخش بعدی بیشتر در مورد تورفتگی یاد خواهید گرفت.

من قصد دارم قطعه کد پایتون زیر را اجرا کنم که فایل yaml را تجزیه می کند و نوع داده را به یک نوع داده پایتون تبدیل می کند.

#!/usr/bin/python3

import yaml

with open("input.yaml", 'r') as f:
   dict = yaml.load(f, yaml.FullLoader)
   for k, v in dict.items():
       print (k + " : " + str(v))
       print("data type", " = ", type(v))
       print()

می توانید از این کد یا یک مترجم آنلاین برای اجرا و آزمایش کدهای yaml در این مقاله استفاده کنید.

توضیحات در YAML

commentها برای کسی که فایل yaml را می خواند درک بهتری ایجاد می کند. برای افزودن توضیحات در فایل yaml خود، از نماد # استفاده کنید. Yaml از comment چند خطی پشتیبانی نمی کند. بنابراین اگر می‌خواهید نظرات چند خطی اضافه کنید، باید در ابتدای هر خط علامت # اضافه کنید.

# CONFIGURATION FILE BASED ON PoP_!OS COSMIC DESKTOP

OS_NAME: "Pop!_OS"
VERSION: 21.04       # VERSION 21.10 REACHED EOL
CODE_NAME: COSMIC  

در مثال بالا، دو نظر comment شده است. بلوک توضیحات در خط اول اضافه شده است و دومی توضیح درون خطی است که در خط چهارم اضافه شده است.

نوع داده رشته در YAML

رشته ها در yaml می توانند با علامت نقل قول یا بدون علامت نقل قول ایجاد شوند. Yaml به اندازه کافی هوشمند است تا نوع داده را به صورت داخلی تفسیر کند. در این مثال کلید از نوع رشته ای است و مقدار نیز از نوع رشته ای تنظیم شده است.

نکات مهمی که باید به خاطر بسپارید:

  • رشته ها را بدون استفاده از نقل قول ایجاد کنید مگر اینکه لازم باشد.
  • اگر رشته حاوی escape character باشد، از ” استفاده کنید.
  • اگر قرار است escape characterها به صورت تحت اللفظی تفسیر شوند، از ‘ استفاده کنید.
User1_review: Pop_!os is great to work with
User2_review: "Pop_!os \t is great to work with"
User3_review: 'Pop_!os \t is great to work with'
نوع رشته یامل

همانطور که قبلاً گفتم، yaml به طور پیش فرض نوع داده را می شناسد. همچنین یک روش صریح برای تعیین نوع داده وجود دارد. از نماد !! استفاده کنید و به دنبال آن نوع داده و مقدار رشته استفاده کنید.

User1_review: !!str Pop_!os is great to work with
تعریف ضمنی

اگر یک خط طولانی از رشته دارید اما می خواهید آن را در چندین خط در داخل فایل yaml خود بنویسید، می توانید این کار را با استفاده از نماد > انجام دهید. این روش استایل تاشو (folded style) نامیده می شود . پارسر شما رشته را به عنوان یک خط تفسیر می کند، اگرچه شما آن را در چندین خط نوشته اید.

User4_review: >
 Among all the distribution
 I used
 PoP_!OS looks great
رشته چند خطی به سبک تا شده

هنگامی که باید رشته چند خطی به همان شکلی که هست چاپ شود، از نماد لوله (|) استفاده کنید . به این سبک تحت اللفظی (literal style) می گویند.

User5_review: |
 Among all the distribution
 I used
 PoP_!OS looks great
رشته چند خطی سبک تحت اللفظی

می توانید از اصلاح کننده های chomp برای حذف یا حفظ فضای سفید در انتهای مقادیر استفاده کنید. می توانید از علامت "-" بعد > یا |برای حذف فضای سفید استفاده کنید.

User4_review: >-
Among all the distribution
I used
PoP_!OS looks great.
User5_review: |-
Among all the distribution
I used
PoP_!OS looks great.

اگر می‌خواهید فضاهای سفید را حفظ کنید ، می‌توانید علامت + بعد از نمادهای | یا > اضافه کنید.

User4_review: >+
Among all the distribution
I used
PoP_!OS looks great.
User5_review: |+
Among all the distribution
I used
PoP_!OS looks great.

نوع داده عددی در YAML

Yaml از انواع عددی Integer، Float، Decimal یا Hexadecimal پشتیبانی می کند. به طور پیش‌فرض پارسر yaml نوع داده را تشخیص می‌دهد، اما یک روش صریح نیز برای تعریف انواع داده‌های int و float مانند آنچه در مثال زیر نشان داده شده است، وجود دارد.

int1: 98765
int2: !!int 56789 # Explicit Integer definition

float1: 20.0481
float2: !!float 20.0482 # Explicit Float definition
نوع داده Int و Float

مقادیر هگزادسیمال و اکتال توسط مفسر به مقادیر decimal تبدیل می شوند.

hex1: 0x14d3
oct1: 014442
مقادیر هگزادسیمال و اکتال

نوع داده منطقی در YAML

Yaml از مقادیر منطقی ” True ” و ” False ” پشتیبانی می کند. همچنین می‌توانید از « Yes » یا « on » که به « True » اشاره می‌کند، و « no » یا « off » که به « False » اشاره می‌کند، استفاده کنید. همچنین می توانید نوع داده را با استفاده از bool!! به صراحت تعریف کنید .

هیچ محدودیتی برای مقادیر منطقی وجود ندارد. در مثال زیر، می بینید که در بسیاری از موارد ” True ” نوشته ام و پارسر همه چیز را به مقدار ” True ” تفسیر می کند.

upgrade: True
Reboot_After_Upgrade: TRUE
Enable_Firewall: on
Set_Power_Profile: yes
ارزش واقعی منطقی YAML

این شرایط مشابه برای مقدار ” False ” نیز قابل اعمال است.

upgrade: False
Reboot_After_Upgrade: FALSE
Enable_Firewall: off
Set_Power_Profile: no
مقدار نادرست منطقی YAML

نکته: اگر سعی کنید مقدار منطقی را با نقل قول محصور کنید، به عنوان یک رشته در نظر گرفته می شود.

نوع داده null در YAML

برای تهی کردن مقدار می توانید از نماد “~” یا کلمه کلیدی “null” استفاده کنید. همچنین می توانید کلید را تعریف کنید و مقدار آن را خالی بگذارید که به عنوان null در نظر گرفته می شود. همچنین می توانید از !!null استفاده کنید.

مشابه نوع داده منطقی ، هیچ محدودیتی برای کلمه کلیدی “null” وجود ندارد. در مثال زیر مشاهده می کنید که کلمه کلیدی null در سه حالت مختلف نوشته شده است.

upgrade: !!null null
Reboot_After_Upgrade: NULL
Enable_Firewall: Null
Set_Power_Profile: ~
Set_Network_Interface: # NO VALUES PASSED
نوع پوچ YAML

در پایتون مقدار NULL به عنوان نوع “هیچ” تفسیر می شود و اگر سعی کنید yaml را به json تبدیل کنید، مقادیر null فقط به عنوان مقدار null تفسیر می شوند.

نوع داده دنباله (Sequence) در YAML

دنباله Yaml لیستی از مقادیر ذخیره شده به ترتیب است. دنباله هایی مانند لیست پایتون یا آرایه ها در پرل را در نظر بگیرید که در آن یک متغیر تعریف می کنید و یک یا چند مقدار را ذخیره می کنید.

چند راه برای تعریف دنباله در YAML وجود دارد. اول سبک in-flow است که در آن شما یک نام کلید و به دنبال آن لیستی از مقادیر داخل پرانتز می دهید. این شبیه به لیست پایتون است.

# INFLOW STYLE SEQUENCE
app_to_be_updated: [ "firefox", "timeshift"]
دنباله سبک ورودی

راه دوم ایجاد یک دنباله با استفاده از سبک بلوک است. هر عنصر در دنباله با یک خط تیره و سپس یک فاصله و مقدار عنصر مشخص می شود . هر عنصر باید در یک خط جداگانه نوشته شود. شما می توانید یک تورفتگی از دو فاصله داشته باشید یا یک دنباله بدون تورفتگی ایجاد کنید. اما بهتر است، به تورفتگی پایبند باشید.

# BLOCK STYLE SEQUENCE

app_to_be_installed:
 - vscode
 - virtualbox
 - tilix

app_to_be_removed:
- pycharm
- stacer
- ufw
دنباله سبک بلوک

همچنین می توان یک دنباله تودرتو مانند شکل زیر ایجاد کرد.

# NESTED SEQUENCE
applications:
 - Productivity:
   - vscode
   - vagrant
   - docker
   - python3
 - Browser:
   - firefox
   - chrome
   - brave
دنباله تو در تو

نوع داده دیکشنری در YAML

ما قبلاً انواع فرهنگ لغت را در بخش های ابتدایی این مقاله دیده ایم. دیکشنری یک جفت کلید-مقدار است که یکی از بلوک های اصلی در YAML است. “کلیدهای” فرهنگ لغت همیشه از نوع رشته ای هستند و مقادیر می توانند از هر نوعی باشند.

مانند نوع داده دنباله، فرهنگ لغت می تواند به روش های مختلف نوشته شود. اول سبک Inflow است و این سبک شبیه به نمایش دیکشنری های پایتون است .

application: { Install: "Vscode", Remove: Stacer, Update: Firefox}
فرهنگ لغت – سبک inflow

همچنین می توانند با استفاده از سبک بلوک ایجاد شوند.

application1:
 Install: Vscode
 Remove: Stacer
 Update: Firefox
فرهنگ لغت – سبک بلوک

همچنین می توانید فهرستی از دیکشنری های تودرتو ایجاد کنید.

application2:
 Install:
   python: 3.9
   Vscode: 1.58.2
 Remove:
   - Stacer
   - pycharm
 Update: Firefox
فرهنگ لغت تو در تو

Anchor و نام مستعار YAML

می توانید DRY (Don’t Repeat Yourself) را در فایل yaml خود با استفاده از anchorها و نام مستعار پیاده سازی کنید.

Anchor با نماد “&” و نام مستعار با نماد “*” نشان داده می شود.

Anchor شبیه یک متغیر در برنامه نویسی است. Anchor را با استفاده از نماد & و به دنبال آن یک کلمه کلیدی تعریف می کنیم و نام مستعار (*keyword) برای گسترش مقدار anchor استفاده خواهیم کرد.

به مثال زیر دقت کنید. &x به عنوان anchor تعریف می شود و بعداً با استفاده از نام مستعار x* گسترش می یابد.

User4_review: &x Among all the distribution I used PoP_!OS looks great.
User5_review: *x
User6_review: *x
Anchor & Alias

هنگام استفاده از anchor و نام مستعار با استفاده از نماد <<، می توانید هر مقداری را بازنویسی کنید. در اینجا، من مقدار نسخه را از 21.10 تا 21.04 لغو می کنم.

PoP_OS: &pos
 version: 21.10
 code_name: cosmic desktop
 d_flavour: gnome

rewrite:
 <<: *pos
 version: 21.04
بازنویسی مقادیر

نتیجه

در این مطلب دیدیم YAML چیست و چگونه با انواع مختلف در YAML کار کنیم. در این راهنما، من از پایتون به عنوان تجزیه کننده یامل استفاده کرده ام.

امیدواریم این آموزش YAML برای شما مفید بوده باشد. اگر تازه با YAML آشنا شدید، پیشنهاد می‌کنم هر آنچه را که در این مقاله یاد گرفتید تمرین کنید که به شما کمک می‌کند تا با YAML رابطه برقرار کنید و با توجه به نیاز خود شروع به استفاده از آن کنید.

مهدی منصوری

من مهدی منصوری و کارشناس حوزه نرم افزار و امنیت اطلاعات هستم. کارشناسی ارشد خودم را در رشته امنیت اطلاعات از دانشگاه مالک اشتر تهران گرفتم. هم اکنون در زمینه DevOPS مشغول هستم. و در زمان های ممکن در این سایت و چند سایت دیگه مطلب می گذارم

درباره نویسنده

مهدی منصوری

من مهدی منصوری و کارشناس حوزه نرم افزار و امنیت اطلاعات هستم. کارشناسی ارشد خودم را در رشته امنیت اطلاعات از دانشگاه مالک اشتر تهران گرفتم.
هم اکنون در زمینه DevOPS مشغول هستم. و در زمان های ممکن در این سایت و چند سایت دیگه مطلب می گذارم

افزودن نظر

برای ارسال نظرات خود اینجا را کلیک کنید