در دنیای امروز، هر توسعه دهنده ای که با GitHub، Cloud Native Computing یا فرآیندهای DevOps سروکار دارد، به ناچار با فایلهایی با پسوند .yml یا .yaml مواجه شده است. YAML فراتر از یک قالب متنی ساده، یک زبان «سریالسازی داده» (Data Serialization) است که با اولویت قرار دادن خوانایی برای انسان، به استانداردی غیرقابل جایگزین در مدیریت تنظیمات تبدیل شده است.
YAML چیست؟
نام YAML در ابتدا مخفف "Yet Another Markup Language" بود، اما با تکامل این زبان و تغییر مسیر آن به سمت مدیریت داده، به یک مخفف بازگشتی (Recursive Acronym) یعنی "YAML Ain't Markup Language" تغییر یافت. این تغییر نام حامل یک پیام استراتژیک است: YAML برای نمایش دادههای ساختاریافته است، نه نشانهگذاری اسناد (Markup).
سه ویژگی محوری که YAML را متمایز میکند
- سادگی در نگارش
- استقلال از زبانهای برنامهنویسی
- ساختار درختی منعطف
نقلقول کلیدی:
"YAML برای داده است، نه اسناد؛ هدف آن فراهم کردن فرمتی استاندارد برای نمایش دادههای ساختاریافته است که هم برای انسان قابل درک باشد و هم توسط ماشینها تفسیر شود."
تحلیل قواعد سینتکسی و آناتومی یک فایل YAML
یادگیری قواعد YAML برای هر متخصص Configuration Management ضروری است. اشتباه در یک فاصله ساده میتواند کل زنجیره CI/CD را با اختلال مواجه کند.
قانون طلایی Indentation
YAML از «فاصله» (Space) برای تعیین سلسلهمراتب استفاده میکند. بر اساس استانداردهای صنعتی، استفاده از ۲ فاصله رایجترین متد است. نکته حیاتی: استفاده از کلید Tab اکیداً ممنوع است و منجر به خطای پارسر میشود.
جفتهای کلید-مقدار (Key-Value Pairs)
دادهها به صورت key: value تعریف میشوند. حتماً باید بعد از علامت دو نقطه، یک فاصله (Space) قرار گیرد.
لیستها و توالیها (Sequences)
برای تعریف لیستها، هر آیتم با یک خط تیره - و یک فاصله شروع میشود.
انواع داده (Scalars)
YAML هوشمند است، اما باید مراقب تفاوت نسخهها بود. در نسخه ۱.۱، عباراتی مثل Yes یا No به عنوان بولین شناخته میشدند، اما در نسخه YAML 1.2، این عبارات رشته (String) محسوب میشوند و فقط true / false به عنوان بولین استاندارد شناخته میشوند.
پشتیبانی از دادههای پیچیده
برخلاف JSON، YAML به طور ذاتی از انواع داده پیچیده مانند تاریخ (Date) و دادههای باینری (با تگ !!binary) پشتیبانی میکند.
نمونه کد استاندارد
پروفایل کاربر با رعایت ساختار سلسلهمراتبی:
user:
id: 101
is_active: true # بولین استاندارد در 1.2
tags: [devops, cloud, iaas] # لیست خطی (Inline)
hobbies:
- Reading
- Running
profile_image: !!binary |
R0lGODdhDQAIAIAAAAAAANn
Z2SwAAAAADQAIAAACF4SDGQ==
ویژگیهای پیشرفته: بهینهسازی و جلوگیری از تکرار (DRY)
برای مدیریت فایلهای بزرگ در مقیاس سازمانی، YAML ابزارهای پیشرفتهای ارائه میدهد:
استایلهای رشته چندخطی:
- Literal (|): حفظ دقیق خطوط جدید و فاصلهها (مناسب برای اسکریپتهای شل).
- Folded (>): تبدیل خطوط به فاصله و ایجاد یک پاراگراف واحد.
تفاوت در خروجی متنی
literal_block: |
خط اول
خط دوم
folded_block: >
این متن طولانی
در خروجی نهایی یک خط خواهد بود.
بصورت عملی تر:
literal1: &literal1 |
line
of
text and stuff
literal2: &literal2 |
another line
of text and new stuff
literals:
- *literal1
- *literal2
لنگرها و ارجاعها (Anchors & Aliases)
برای جلوگیری از تکرار دادهها (قانون DRY)، میتوان از & برای تعریف لنگر و * برای ارجاع استفاده کرد.
مثال کاربردی آدرس صورتحساب و ارسال
billing_address: &main_address
street: 123 Tech Ave
city: Tehran
shipping_address: *main_address
چند سندی بودن
استفاده از سه خط تیره (---) برای تفکیک چندین سند در یک جریان داده و سه نقطه (...) برای پایان اختیاری سند.
مقایسه YAML در مقابل JSON و XML
به عنوان یک توسعه دهنده، باید بدانید که YAML یک ابرمجموعه (Superset) از JSON است؛ یعنی هر فایل JSON معتبر، یک YAML معتبر نیز هست.
| ویژگی | YAML | JSON | XML |
|---|---|---|---|
| خوانایی برای انسان | عالی (ساختار بصری) | متوسط (شلوغ با براکت) | پایین (تگهای تکراری) |
| پشتیبانی از کامنت | بله (با #) | خیر | بله |
| انواع داده پیچیده | بله (Binary, Date) | خیر (محدود) | بله (بسیار پیچیده) |
| سرعت پردازش | متوسط | بسیار سریع | پایین |
| امنیت | ریسک اجرای کد (Turing Complete) | بسیار امن | متوسط (ریسک XXE) |
کاربرد YAML در دنیای واقعی
در حوزه DevOps، فایلهای YAML فقط تنظیمات نیستند، بلکه تعریفکننده زیرساخت هستند:
- Kubernetes: استفاده از YAML برای تعریف «وضعیت مطلوب» (Desired State) کانتینرها و سرویسها.
- Ansible: نگارش Playbookها برای اتوماسیون وظایف بدون نیاز به دانش برنامهنویسی پیشرفته.
- Docker Compose: مدیریت همزمان چندین کانتینر در قالب یک فایل واحد.
- GitHub Actions: تعریف مراحل CI/CD و اتوماسیون گردش کار توسعه.
امنیت و بهترین شیوهها: عبور از مرزهای Turing Complete
یک حقیقت مهندسی که اغلب نادیده گرفته میشود این است که YAML در برخی پیادهسازیها Turing Complete است؛ این یعنی پارسرهای ناامن ممکن است کدهای مخرب نهفته در تگهای خاص زبان (مثل پایتون یا پرل) را اجرا کنند (Arbitrary Code Execution).
توصیههای امنیتی:
- استفاده از Safe Load: همیشه در کدهای خود از تابع safe_load برای پارس کردن فایلهای YAML مشکوک استفاده کنید.
- اعتبارسنجی مداوم: ابزارهای Linter مانند yamllint را در PipeLine (خط لوله) CI/CD خود ادغام کنید تا از بروز خطاهای سینتکسی جلوگیری شود.
- ثبات در فاصله: همیشه تعداد فاصلههای ثابت (مثلاً ۲ فاصله) را در کل پروژه حفظ کنید.
- کوتیشن برای مقادیر حساس: برای جلوگیری از تفسیر اشتباه مقادیری که شبیه عدد یا بولین هستند (مثل کد کشور "NO" که ممکن است False تفسیر شود)، از کوتیشن استفاده کنید.
نتیجهگیری:
چرا تسلط بر YAML یک ضرورت است؟
YAML پل ارتباطی میان توسعهدهندگان، مدیران سیستم و ماشینهاست. به دلیل نقش محوری آن در DevOps Automation و Configuration Management، تسلط بر این زبان نه یک انتخاب، بلکه ضرورتی برای هر متخصص تکنولوژی است. خوانایی استثنایی و قدرت بالای آن در تعریف زیرساخت، YAML را به زبان اول دنیای DevOps تبدیل کرده است. با رعایت اصول امنیتی و استانداردهای نگارشی، این زبان به تمیزترین ابزار در جعبهابزار مهندسی شما بدل خواهد شد.