YAML، یک استاندارد طبقه بندی داده‌ها بصورت قابل درک برای انسان‌ها است که می‌تواند در ارتباط با تمام زبان‌های برنامه نویسی مورد استفاده قرار گیرد و اغلب برای نوشتن فایل‌های پیکربندی استفاده می‌شود.

 

کلمه YAML مخفف عبارت "YAML Ain't Markup Language" است و به عنوان یک استاندارد انعطاف پذیر و داده محور شناخته می‌شود. در حقیقت، YAML تقریباً با هر برنامه‌ای که نیاز به ذخیره یا انتقال داده دارد، قابل استفاده است. انعطاف پذیری YAML تا حدی به این دلیل است که از قسمت‌ها و قطعاتی از زبان‌های مختلف تشکیل شده است. چند نمونه از این شباهت‌ها عبارتند از:

  • مقیاس بندی، لیست‌ها و آرایه‌های انجمنی بر اساس Perl.
  • جداکننده داکیومنت "---" بر اساس MIME.
  • دنباله‌های Escape بر اساس C.
  • بسته بندی Whitespace بر اساس HTML.

 

در بسیاری از نرم‌افزار‌های مطرح که از آنها استفاده می‌کنیم، از این فرمت استفاده می‌شود؛ از جمله:

- داکر کامپوز (docker-compose)

- OpenAPI

- ...

 

این مطلب نیز ممکن است برای شما مفید باشد: نصب PyCharm برروی Ubuntu 20.04

 

ویژگی‌های YAML

مقاومت در برابر برخورد محدود کننده (Delimiter collision)

از آنجا که YAML عمدتا به تورفتگی کلی ساختار تکیه می‌کند، بطور ویژه در برابر برخورد محدود کننده مقاوم است. برخی از زبان‌ها برای مدیریت کاراکترهای خاص به دنباله‌ها یا کاراکترهای escape، علامت نقل قول و راه حل‌های دیگر نیاز دارند. YAML به طور طبیعی نسبت به علامت نقل قول و براکت حساسیت ندارد؛ به همین دلیل تعریف کاراکترهای خاص به ویژه در رشته‌ها آسان‌تر می‌شود.

 

امنیت

به خودی خود، YAML هیچ دستور قابل اجرایی ندارد؛ بلکه تنها یک زبان نمایش داده‌ها است. با این حال، ادغام آن با سایر زبان‌ها به عنوان مثال به تجزیه کنندگان Perl اجازه می‌دهد تا کد Perl را اجرا نمایند. PyYAML (یک تجزیه کننده و منتشر کننده برای پایتون) شامل اسنادی است که به طور خاص در برابر این آسیب پذیری امنیتی هشدار می‌دهد و دارای توابع داخلی برای محافظت در برابر objectهای خطرناک پایتون معروف به yaml.safe_load است.

 

نحوه کارکرد YAML

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

مقیاس‌ها یا متغیرها با استفاده از یک دو نقطه و فاصله تعریف می‌شوند.

integer: 25
string: "25"
float: 25.0
boolean: Yes

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

--- # Shopping List in Block Format
- milk
- eggs
- juice

--- # Shopping List in Inline Format
[milk, eggs, juice]

رشته‌ها را می‌توان با یک کاراکتر | (که خطوط جدید را حفظ می‌کند)، یا یک کاراکتر> (که خطوط جدید را ایجاد می‌کند) نشان داد.

data: |
   Each of these
   Newlines
   Will be broken up

data: >
   This text is
   wrapped and will
   be formed into
   a single paragraph

 

این مطلب نیز ممکن است برای شما مفید باشد: نصب بسته‌های پایتون از GitHub در لینوکس

 

YAML در مقابل JSON

YAML 1.2، مجموعه‌ای از JavaScript Object Notation (JSON) است که دارای یکسری ویژگی‌های اختصاصی است. به عنوان مثال، YAML می‌تواند به خود ارجاع دهد، از انواع داده‌های پیچیده پشتیبانی کند، literalهای بلاک را داراست، از کامنت‌ها پشتیبانی می‌نماید و موارد دیگر. به طور کلی، YAML نسبت به JSON بیشتر قابل خواندن است. در ادامه می‌توانید فرایندهای یکسان در JSON و YAML را مشاهده کنید.

نسخه JSON

{
  "json": [
    "rigid",
    "better for data interchange"
  ],
  "yaml": [
    "slim and flexible",
    "better for configuration"
  ],
  "object": {
    "key": "value",
    "array": [
      {
        "null_value": null
      },
      {
        "boolean": true
      },
      {
        "integer": 1
      }
    ]
  },
  "paragraph": "Blank lines denotenparagraph breaksn",
  "content": "Or wencan autonconvert line breaksnto save space"
}

 

نسخه YAML

---
# <- yaml supports comments, json does not # did you know you can embed json in yaml? # try uncommenting the next line # { foo: 'bar' } json: - rigid - better for data interchange yaml: - slim and flexible - better for configuration object: key: value array: - null_value: - boolean: true - integer: 1 paragraph: >
   Blank lines denote

   paragraph breaks
content: |-
   Or we
   can auto
   convert line breaks
   to save space

اکثراً می‌توان JSON را به YAML و YAML را به JSON تبدیل کرد. نسخه‌های قبلی YAML بطور کامل با JSON سازگار نیستند؛ اما اکثر اسناد JSON را می‌توان با استفاده از Syck یا XS تجزیه کرد.

 

نمونه‌هایی از YAML

بسته‌های نرم افزاری متعددی مانند Ansible مربوط به  Red Hat از YAML برای ایجاد ابزارهای مدیریت پیکربندی قدرتمند استفاده کرده‌اند.

Red Hat، با ادغام نرم افزار خود با YAML، یک نرم افزار منبع باز Ansible برای مدیریت پیکربندی و ابزار استقرار برنامه توسعه داد. Ansible موقتاً از طریق Secure Shell (SSH) به سرورها متصل می‌شود تا با استفاده از playbookها که بلوک‌های کد YAML هستند و وظایف دستی را به صورت خودکار انجام می‌دهند، کارهای مدیریتی را انجام دهند.

در مثال زیر، playbookای به نام verify-apache.yml تعریف شده است.

---
- hosts: webservers

  vars:
    http_port: 80
    max_clients: 200

  remote_user: root

  tasks:
  - name: ensure apache is at the latest version
    yum:
      name: httpd
      state: latest

  - name: write the apache config file
    template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf
    notify:
    - restart apache

  - name: ensure apache is running
    service:
      name: httpd
      state: started

  handlers:
    - name: restart apache
      service:
        name: httpd
        state: restarted

 

این job نشان می‌دهد که تنها باید روی میزبان‌های گروه وب سرور اجرا شود و این فرآیند باید به عنوان کاربر ریموت، root، اجرا شود. در این playbook سه تسک وجود دارد:

اولین تسک، Apache را با استفاده از دستور yum مربوط به Red Hat به آخرین نسخه به روز می‌کند.

دومین تسک، از template برای کپی کردن فایل پیکربندی برروی apache استفاده می‌نماید. پس از نوشتن فایل پیکربندی، سرویس Apache مجدداً راه‌اندازی می‌شود.

سومین تسک، سرویس Apache را (تنها در صورت بالا نیامدن سرویس) start می‌کند.

اکنون که playbook نوشته شده است، باید از طریق خط فرمان اجرا شود. اگرچه مسیرها بر اساس محیط متفاوت خواهد بود؛ اما playbook را می‌توان با استفاده از این دستور اجرا کرد:

ansible-playbook -i hosts/groups verify_apache.yml

گزینه i نشان می‌دهد که کدام فایل شامل لیست سرورها در گروه سرورهای وب است که سرورهایی را که playbook روی آن‌ها اجرا می‌شود، محدود می‌کند.

 

 

 

منبع:

stackpath