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
0 دیدگاه
نوشتن دیدگاه