كلنا نحب Ansible ، لكن Ansible هو YAML. هناك العديد من التنسيقات لملفات التكوين: قوائم القيم ، أزواج قيم المعلمات ، ملفات INI ، YAML ، JSON ، XML ، وغيرها الكثير. ومع ذلك ، لعدة أسباب ، كل هذه ، غالبا ما تعتبر YAML صعبة للغاية. على وجه الخصوص ، على الرغم من بساطتها المنعشة وقدراتها المثيرة للإعجاب للعمل مع القيم الهرمية ، يمكن أن يكون بناء جملة YAML مزعجًا مع منهج المسافة البادئة الشبيهة ببايثون.

إذا YAML يغضب لك ، يمكنك - ويجب! - اتخذ الخطوات العشر التالية لتقليل تهيجك إلى مستوى مقبول وحب YAML. كما يجب أن يكون في هذه القائمة ، سيتم ترقيم نصائحنا العشر من الصفر ، نضيف الممارسات التأمل والروحية في الإرادة ؛-)
0. اجعل محرر العمل الخاص بك
لا يهم أي نوع من محرر النصوص لديك - بالنسبة له ، بالتأكيد ، هناك مكون إضافي واحد على الأقل للعمل مع YAML. إذا لم يكن لديك واحدة ، فابحث عنها وتثبيتها على الفور. إن الوقت الذي تقضيه في البحث والإعداد سيؤتي ثماره عدة مرات في كل مرة يتعين عليك فيها تحرير YAML.
على سبيل المثال ، يدعم محرر
Atom YAML افتراضيًا ، لكن سيتعين على GNU Emacs تثبيت حزم إضافية ، على سبيل المثال ،
وضع yaml .
Emacs في وضع YAML ومساحات العرض.إذا لم يكن لدى المحرر المفضل لديك وضع YAML ، فيمكن حل بعض المشاكل من خلال العمل مع الإعدادات. على سبيل المثال ، لا يحتوي محرر نصوص Gedit القياسي لـ GNOME على وضع YAML ، لكن من المفترض أن يتم تمييز بناء جملة YAML ويسمح لك بتكوين مسافة بادئة:
إعدادات المسافة البادئة Gedit.يعرض المكون الإضافي
لمساحات السحب في Gedit المسافات كنقاط ، مما يؤدي إلى إزالة الغموض بمستويات المسافة البادئة.
بمعنى آخر ، خذ الوقت الكافي لدراسة محررك المفضل. تعرف على ما يقدمه هو أو مجتمع التطوير لديه للعمل مع YAML ، واستخدم هذه الميزات. أنت بالتأكيد لن تندم.
1. استخدام linter (linter)
من الناحية المثالية ، تستخدم لغات البرمجة والترميز بناء جملة يمكن التنبؤ به. تقوم الحواسيب بعمل جيد للتنبؤ ، لذلك في عام 1978 ظهر مفهوم
اللنت . إذا مرت عليك لمدة 40 عامًا وما زلت لا تستخدم YAML-linter ، فقد حان الوقت لتجربة yamllint.
يمكنك تثبيت
yamllint باستخدام مدير حزم Linux القياسي. على سبيل المثال ، في
Red Hat Enterprise Linux 8 أو
Fedora ، يتم ذلك على النحو التالي:
$ sudo dnf install yamllint
ثم تقوم بتشغيل yamllint ، لتمرير ملف YAML للتحقق منه. إليك ما يبدو عليه إذا قمت بتمرير ملف خطأ إلى linter:
$ yamllint errorprone.yaml errorprone.yaml 23:10 error syntax error: mapping values are not allowed here 23:11 error trailing spaces (trailing-spaces)
الأرقام على اليسار ليست الوقت ، ولكن إحداثيات الخطأ: صف ورقم العمود. قد لا يخبرك وصف الخطأ بأي شيء ، لكنك تعرف بالضبط أين هو. انظر فقط إلى هذا المكان في الكود ، وعلى الأرجح ، سيكون كل شيء واضحًا.
عندما لا يجد yamllint أخطاء في الملف ، لا يتم عرض أي شيء. إذا كنت خائفًا من هذا الصمت وترغب في الحصول على مزيد من الملاحظات ، فيمكنك بدء تشغيل linter باستخدام أمر الصدى الشرطي من خلال علامة الضم المزدوجة (&&) ، مثل هذا:
$ yamllint perfect.yaml && echo "OK" OK
في POSIX ، يتم تشغيل علامة الضم المزدوجة إذا وفقط الأمر السابق بإرجاع 0. و yamllint فقط إرجاع عدد الأخطاء التي تم العثور عليها ، لذلك هذا البناء الشرطي بأكمله يعمل.
2. اكتب بايثون ، وليس YAML
إذا كان YAML يشغلك حقًا ، فلا تكتب عليه حرفيًا. يحدث أن YAML هو التنسيق الوحيد الذي ينظر إليه التطبيق. لكن في هذه الحالة ، ليس من الضروري إنشاء ملف YAML. اكتب ما تريد ، ثم قم بالتحويل. على سبيل المثال ، يوجد في Python مكتبة
pyyaml رائعة
وطريقتان للتحويل الكامل: التحويل الذاتي والتحويل القائم على البرنامج النصي.
Samokonvertirovanie
في هذه الحالة ، يعد ملف البيانات أيضًا برنامج نصي Python يقوم بإنشاء YAML. هذه الطريقة هي الأنسب لمجموعات البيانات الصغيرة. يمكنك ببساطة كتابة بيانات JSON إلى متغير Python ، بادئة مع توجيه الاستيراد ، وإضافة ثلاثة أسطر في نهاية الملف لتنفيذ الإخراج.
#!/usr/bin/python3 import yaml d={ "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossSee": "markup" } } } } } f=open('output.yaml','w') f.write(yaml.dump(d)) f.close
الآن قم بتشغيل هذا الملف في Python وملف الإخراج هو output.yaml:
$ python3 ./example.json $ cat output.yaml glossary: GlossDiv: GlossList: GlossEntry: Abbrev: ISO 8879:1986 Acronym: SGML GlossDef: GlossSeeAlso: [GML, XML] para: A meta-markup language, used to create markup languages such as DocBook. GlossSee: markup GlossTerm: Standard Generalized Markup Language ID: SGML SortAs: SGML title: S title: example glossary
هذا صحيح تمامًا YAML ، لكن yamllint سوف يحذرك أنه لا يبدأ بـ ---. حسنًا ، يمكن إصلاح ذلك يدويًا أو تعديل بيثون النصي بشكل بسيط.
تحويل عبر البرامج النصية
في هذه الحالة ، نكتب أولاً في JSON ثم نقوم بتشغيل المحول في شكل برنامج نصي Python منفصل ، ينتج عنه YAML في الإخراج. مقارنة بالطريقة السابقة ، يتم تحسين هذه الطريقة بشكل أفضل لأن التحويل مفصول بالبيانات.
أولاً ، قم بإنشاء ملف JSON example.json ، على سبيل المثال ، يمكنك تناوله على
json.org :
{ "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossSee": "markup" } } } } }
ثم قم بإنشاء محول نصي بسيط وحفظه تحت اسم json2yaml.py. يقوم هذا البرنامج النصي باستيراد كلتا الوحدتين - YAML و JSON Python ، ويقوم أيضًا بتحميل ملف JSON المحدد من قبل المستخدم ، ويقوم بإجراء التحويل وكتابة البيانات إلى ملف output.yaml.
#!/usr/bin/python3 import yaml import sys import json OUT=open('output.yaml','w') IN=open(sys.argv[1], 'r') JSON = json.load(IN) IN.close() yaml.dump(JSON, OUT) OUT.close()
حفظ هذا البرنامج النصي في مسار النظام وتشغيله حسب الحاجة:
$ ~/bin/json2yaml.py example.json
3. تحليل الكثير وغالبا
من المفيد أحيانًا النظر إلى المشكلة من زاوية مختلفة. إذا وجدت صعوبة في تخيل العلاقات بين البيانات في YAML ، فيمكنك تحويلها مؤقتًا إلى شيء أكثر دراية.
على سبيل المثال ، إذا كنت مرتاحًا للعمل مع قوائم القاموس أو JSON ، فيمكن تحويل YAML إلى JSON مع أمرين فقط في shell Python Interactive. لنفترض أن لديك ملف YAML mydata.yaml ، ثم هنا كيف سيبدو:
$ python3 >>> f=open('mydata.yaml','r') >>> yaml.load(f) {'document': 34843, 'date': datetime.date(2019, 5, 23), 'bill-to': {'given': 'Seth', 'family': 'Kenlon', 'address': {'street': '51b Mornington Road\n', 'city': 'Brooklyn', 'state': 'Wellington', 'postal': 6021, 'country': 'NZ'}}, 'words': 938, 'comments': 'Good article. Could be better.'}
يمكن العثور على الكثير من الأمثلة الأخرى حول هذا الموضوع. بالإضافة إلى ذلك ، هناك العديد من المحولات عبر الإنترنت والمحللين المحليين. لذلك لا تتردد في إعادة صياغة البيانات عندما ترى فيها فقط علامة غير مفهومة.
4. قراءة المواصفات
بالعودة إلى YAML بعد استراحة طويلة ، من المفيد الذهاب إلى
yaml.org وإعادة قراءة المواصفات. إذا كنت تواجه صعوبات في YAML ، لكن يديك لم تصل إلى المواصفات ، فقد حان الوقت لتصحيح هذا الموقف. من السهل أن تكتب المواصفات بسهولة ، ويتم توضيح متطلبات بناء الجملة بعدد كبير من الأمثلة في
الفصل السادس .
5. Pseudoconfigs
عند كتابة كتاب أو مقال ، من المفيد دائمًا تحديد مخطط أولي أولاً ، على الأقل في شكل جدول محتويات. هذا هو الحال مع YAML. على الأرجح ، تتخيل البيانات التي تحتاجها للكتابة إلى ملف YAML ، لكنك لا تفهم حقًا كيفية ربطها ببعضها البعض. لذلك ، قبل نحت YAML ، ارسم صيغة زائفة.
يشبه Pseudo-config الكود الزائف ، حيث لا داعي للقلق بشأن البنية أو المسافة البادئة والعلاقات بين الوالدين والطفل والميراث والتداخل. لذلك فمن هنا: يمكنك رسم تكرارات البيانات عند ظهورها في رأسك.
مبرمجو قائمة مزيفة (مارتن وتابيثا) ومهاراتهم (لغات البرمجة: بايثون ، بيرل ، باسكال وليشب ، فورتران ، إيرلانغ ، على التوالي).بعد رسم تكوين مزيف على قطعة من الورق ، قم بتحليلها بعناية ، وإذا كان كل شيء على ما يرام ، قم بتنسيقه في شكل ملف YAML صالح.
6. علامة التبويب أو معضلة
يجب عليك حل معضلة
"علامات التبويب أو المسافات؟" . ليس بالمعنى الشامل ، ولكن فقط على مستوى مؤسستك ، أو على الأقل مشروع. لا يهم إذا كنت تستخدم مرحلة ما بعد المعالجة باستخدام البرنامج النصي sed ، أو إعداد محررين نصيين على أجهزة المبرمجين ، أو استلام إيصالات بشأن الالتزام الصارم بتعليمات linter تحت تهديد الفصل ، ولكن يجب على جميع أعضاء فريقك الذين يرتبطون بطريقة ما بـ YAML استخدم المسافات فقط (كما هو مطلوب في مواصفات YAML).
في أي محرر نصوص عادي ، يمكنك تعيين علامات التصحيح التلقائي على عدد محدد من المسافات ، بحيث لا تخاف من أعمال شغب
علامة التبويب .
كما يدرك كل كره من YAML جيدًا ، فإن الفرق بين علامات التبويب والمسافات غير مرئي على الشاشة. وعندما يكون هناك شيء غير مرئي ، عادة ما يتم تذكر ذلك أخيرًا ، بعد أن تم الفرز والتحقق منه والقضاء على جميع المشاكل المحتملة الأخرى. إن ساعة الوقت التي قُتلت فيها للبحث عن منحنى علامات التبويب أو كتلة من المساحات تصرخ ببساطة أنك بحاجة ماسة إلى إنشاء سياسة لاستخدام واحد أو آخر ، ثم تنفيذ التحقق الملموس المعزز من توافقه (على سبيل المثال ، من خلال ربط Git للتشغيل القسري عبر linter).
7. الأفضل أقل هو الأفضل (أو أكثر أقل)
يحب بعض الناس الكتابة في YAML لأنها تؤكد على الهيكل. في الوقت نفسه ، يستخدمون بنشاط المسافة البادئة لتسليط الضوء على كتل البيانات. هذا نوع من عمليات الاحتيال لمحاكاة لغات الترميز التي تستخدم محددات واضحة.
فيما يلي مثال على هذه البنية من
وثائق Ansible :
# Employee records - martin: name: Martin D'vloper job: Developer skills: - python - perl - pascal - tabitha: name: Tabitha Bitumen job: Developer skills: - lisp - fortran - erlang
بالنسبة للبعض ، يساعد هذا الخيار في تحليل بنية YAML في الرأس ؛ بل على العكس ، يزعج الآخرين بالكثير من المسافة البادئة غير المرغوب فيها ، حسب رأيهم.
ولكن إذا كنت مالك مستند YAML وكنت مسؤولاً عن صيانته ، فيجب
عليك أنت وحدك تحديد كيفية استخدام المسافة البادئة. إذا كنت منزعجًا من المسافة البادئة الكبيرة ، فاحتفظ بها إلى الحد الأدنى الممكن وفقًا لمواصفات YAML. على سبيل المثال ، يمكن إعادة كتابة الملف أعلاه من وثائق Ansible دون أي خسارة مثل هذا:
--- - martin: name: Martin D'vloper job: Developer skills: - python - perl - pascal - tabitha: name: Tabitha Bitumen job: Developer skills: - lisp - fortran - erlang
8. استخدام الفراغات
إذا كنت تكرر باستمرار نفس الأخطاء عند ملء ملف YAML ، فمن المنطقي إدراج قالب فارغ فيه كتعليق. ثم في المرة القادمة سيكون من الممكن ببساطة نسخ هذه القطعة وإدخال بيانات حقيقية هناك ، على سبيل المثال:
--- # - <common name>: # name: Given Surname # job: JOB # skills: # - LANG - martin: name: Martin D'vloper job: Developer skills: - python - perl - pascal - tabitha: name: Tabitha Bitumen job: Developer skills: - lisp - fortran - erlang
9. استخدام شيء آخر
إذا كان التطبيق لا يمسك بك في قبضة الخنق ، فربما يستحق الأمر تغيير YAML إلى تنسيق آخر. بمرور الوقت ، يمكن أن تتفوق ملفات التكوين على نفسها ومن الأفضل تحويلها إلى برامج نصية بسيطة في Lua أو Python.
YAML شيء رائع يحبه الكثير من الناس بسبب بساطته وبساطته ، لكن هذا بعيد عن كونه الأداة الوحيدة في ترسانتك. حتى في بعض الأحيان يمكنك رفض ذلك. من السهل على YAML أن تجد مكتبات تحليل ، لذلك إذا عرضت خيارات الترحيل المريحة ، فسوف ينجو مستخدموك من هذا الفشل بشكل مؤلم نسبيًا.
إذا لم تتمكن من الاستغناء عن YAML ، فخذ هذه النصائح العشر في الخدمة وهزيمة كراهيتك لـ YAML مرة واحدة وإلى الأبد!