Biz hammamiz Ansibleni yaxshi ko'ramiz, lekin Ansible - YAML. Konfiguratsiya fayllari uchun ko'plab formatlar mavjud: qiymatlar ro'yxati, parametr-qiymat juftlari, INI fayllari, YAML, JSON, XML va boshqalar. Biroq, ularning barchasidan bir nechta sabablarga ko'ra, YAML ko'pincha ayniqsa qiyin deb hisoblanadi. Xususan, tetiklantiruvchi minimalizm va ierarxik qiymatlar bilan ishlashning ta'sirchan imkoniyatlariga qaramay, YAML sintaksisi Python-ga o'xshash chekinish yondashuvi bilan bezovta qilishi mumkin.
Agar YAML sizni g'azablantirsa, qila olasiz va kerak! - umidsizlikni maqbul darajaga tushirish va YAMLga oshiq bo'lish uchun quyidagi 10 ta qadamni bajaring. Ushbu ro'yxatga mos keladigan tarzda, bizning o'nta maslahatimiz noldan boshlab raqamlanadi, biz o'z xohishimiz bilan meditatsiya va ruhiy amaliyotlarni qo'shamiz 😉
0. Muharriringizning ishlashini ta'minlang
Qaysi matn muharriri borligidan qat'i nazar, YAML bilan ishlash uchun kamida bitta plagin bo'lishi mumkin. Agar sizda yo'q bo'lsa, uni darhol toping va o'rnating. Qidiruv va sozlash uchun sarflangan vaqt har safar YAML tahrirlashda ko'p marta to'lanadi.
Masalan, muharrir
YAML rejimida Emacs va bo'shliqlarni ko'rsatish.
Sevimli muharriringizda YAML rejimi bo'lmasa, ba'zi muammolarni sozlamalar bilan ishlash orqali hal qilish mumkin. Masalan, standart GNOME matn muharriri Gedit YAML rejimiga ega emas, lekin sukut bo'yicha u YAML sintaksisini ta'kidlaydi va chekinishlar bilan ishlashni sozlash imkonini beradi:
Gedit-da chekinishlarni o'rnatish.
Plagin
Boshqacha qilib aytganda, sevimli muharriringiz haqida o'rganishga vaqt ajrating. U yoki uning rivojlanish hamjamiyati YAML bilan ishlash uchun nimani taklif qilishini bilib oling va ushbu xususiyatlardan foydalaning. Siz, albatta, afsuslanmaysiz.
1. Linterdan foydalaning
Ideal holda, dasturlash tillari va belgilash tillari bashorat qilinadigan sintaksisdan foydalanadi. Kompyuterlar bashorat qilishda yaxshi, shuning uchun kontseptsiya
O'rnatish
$ sudo dnf install yamllint
Keyin tekshirish uchun YAML faylini uzatib, yamllint-ni ishga tushirasiz. Xatoli faylni linterga uzatsangiz, shunday ko'rinadi:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 error syntax error: mapping values are not allowed here
23:11 error trailing spaces (trailing-spaces)
Chapdagi raqamlar vaqt emas, balki xatoning koordinatalari: qator va ustun raqami. Xatoning tavsifi sizga hech narsa aytmasligi mumkin, lekin siz uning qaerdaligini aniq bilasiz. Koddagi bu joyga qarang va ehtimol hamma narsa aniq bo'ladi.
Yallint faylda xato topmasa, ekranga hech narsa chop etilmaydi. Agar bunday sukunat sizni qo'rqitsa va siz biroz ko'proq fikr-mulohaza bildirmoqchi bo'lsangiz, linterni shartli echo buyrug'i bilan ikkita ampersand (&&) orqali ishga tushirishingiz mumkin, masalan:
$ yamllint perfect.yaml && echo "OK"
OK
POSIX da qo'sh ampersand faqat oldingi buyruq 0 ni qaytarsagina yonadi. Yamllint esa topilgan xatolar sonini qaytaradi, shuning uchun bu shartli konstruksiya ishlaydi.
2. YAML emas, Python da yozing
Agar YAML haqiqatan ham sizni g'azablantirsa, unda tom ma'noda yozmang. YAML - bu dastur tushunadigan yagona format. Ammo bu holatda ham YAML faylini yaratish shart emas. O'zingiz yoqtirgan narsani yozing va keyin aylantiring. Masalan, Python uchun ajoyib kutubxona mavjud
O'z-o'zini aylantirish
Bunday holda, ma'lumotlar fayli ham YAML ni yaratadigan Python skriptidir. Ushbu usul kichik ma'lumotlar to'plamlari uchun eng mos keladi. Siz shunchaki JSON ma'lumotlarini Python o'zgaruvchisiga yozasiz, uni import direktivasi bilan so'zlab qo'yasiz va fayl oxirida chiqishni amalga oshirish uchun uchta qator qo'shing.
#!/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
Endi biz ushbu faylni Python da ishga tushiramiz va output.yaml faylini olamiz:
$ 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
Bu YAML to'liq amal qiladi, ammo yallint sizni - bilan boshlanmasligi haqida ogohlantiradi. Buni qo'lda osongina tuzatish yoki Python skriptida biroz o'zgartirish mumkin.
Skriptlar orqali konvertatsiya qilish
Bunday holda, biz avval JSON-da yozamiz, so'ngra konvertorni alohida Python skripti sifatida ishga tushiramiz, bu esa chiqish sifatida YAML ni ishlab chiqaradi. Oldingi usul bilan solishtirganda, bu usul yaxshi miqyosda, chunki konvertatsiya ma'lumotlardan alohida.
Birinchidan, misol.json JSON faylini yaratamiz, masalan, siz undan olishingiz mumkin
{
"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"
}
}
}
}
}
Keyin oddiy konvertor skriptini yaratamiz va uni json2yaml.py nomi bilan saqlaymiz. Ushbu skript YAML va JSON Python modullarini import qiladi va foydalanuvchi tomonidan belgilangan JSON faylini yuklaydi, konversiyani amalga oshiradi va ma'lumotlarni output.yaml fayliga yozadi.
#!/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()
Ushbu skriptni tizim yo'liga saqlang va kerak bo'lganda ishga tushiring:
$ ~/bin/json2yaml.py example.json
3. Ko'p va tez-tez tahlil qiling
Ba'zan muammoga boshqa tomondan qarash foydali bo'ladi. Agar siz YAMLda maʼlumotlaringiz oʻrtasidagi munosabatlarni ifodalashda muammoga duch kelsangiz, uni vaqtincha tanishroq narsaga aylantirishingiz mumkin.
Misol uchun, lug'at ro'yxatlari yoki JSON bilan ishlash qulay bo'lsa, Python interaktiv qobig'idagi atigi ikkita buyruq yordamida YAMLni JSONga o'zgartirishingiz mumkin. Aytaylik, sizda mydata.yaml YAML fayli bor, u holda u shunday ko'rinadi:
$ 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 Roadn', 'city': 'Brooklyn', 'state': 'Wellington', 'postal': 6021, 'country': 'NZ'}}, 'words': 938, 'comments': 'Good article. Could be better.'}
Ushbu mavzu bo'yicha boshqa ko'plab misollarni topishingiz mumkin. Bundan tashqari, ko'plab onlayn konvertorlar va mahalliy tahlilchilar mavjud. Shunday ekan, unda tushunarsiz chalkashlikni ko'rsangiz, ma'lumotlarni qayta formatlashdan tortinmang.
4. Texnik xususiyatlarni o'qing
Uzoq tanaffusdan keyin YAML ga qaytib, tashrif buyurish foydalidir
5. Pseudo-konfiguratsiyalar
Kitob yoki maqola yozayotganda, avvalo, hech bo'lmaganda mundarija ko'rinishida dastlabki konturni chizish har doim foydalidir. YAML bilan ham xuddi shunday. Ehtimol, sizda YAML fayliga qanday ma'lumotlarni yozish kerakligi haqida tasavvurga egasiz, lekin siz ularni bir-biringiz bilan qanday ulashni tushunmayapsiz. Shuning uchun, YAML haykalini yaratishdan oldin, psevdo-konfiguratsiyani chizing.
Pseudo-config psevdo-kodga o'xshaydi, bu erda tuzilish yoki chekinish, ota-ona va farzand munosabatlari, meros va uyalar haqida tashvishlanishingiz shart emas. Bu erda ham xuddi shunday: siz ma'lumotlarning takrorlanishini ular sizning boshingizda paydo bo'lganda chizasiz.
Pseudo-config listing dasturchilar (Martin va Tabitha) va ularning malakalari (dasturlash tillari: mos ravishda Python, Perl, Paskal va Lisp, Fortran, Erlang).
Qog'ozga soxta konfiguratsiyani chizganingizdan so'ng, uni diqqat bilan tahlil qiling va agar hamma narsa tartibda bo'lsa, uni haqiqiy YAML fayli shaklida formatlang.
6. Tabs va Spaces dilemmasi
Siz dilemmani hal qilishingiz kerak bo'ladi
Har qanday oddiy matn muharririda siz yorliqlarni belgilangan bo'shliqlar soniga avtomatik ravishda sozlashingiz mumkin, shuning uchun asosiy tarafdorlarning isyoni. tab qo'rqishingiz shart emas.
Har bir YAML nafratchisi yaxshi biladi, siz ekrandagi yorliqlar va bo'shliqlar o'rtasidagi farqni ko'ra olmaysiz. Va agar biror narsa ko'rinmasa, bu odamlar boshqa barcha mumkin bo'lgan muammolarni hal qilgandan, tekshirgandan va bartaraf etgandan so'ng, odatda oxirgi narsa eslashadi. Jadval egri chizig'ini yoki bo'shliqlar blokini qidirishga sarflangan bir soat vaqt siz zudlik bilan u yoki boshqasidan foydalanish siyosatini yaratishingiz va keyin unga muvofiqligini temir-beton tekshiruvini amalga oshirishingiz kerakligi haqida qichqiradi (masalan, uni linter orqali majburlash uchun Git kancasi).
7. Kamroq - ko'p (yoki ko'p - kamroq)
Ba'zi odamlar YAMLda yozishni yaxshi ko'radilar, chunki u tuzilishga urg'u beradi. Shu bilan birga, ular ma'lumotlar bloklarini ajratib ko'rsatish uchun indentatsiyadan faol foydalanadilar. Bu aniq chegaralovchilardan foydalanadigan belgilash tillariga taqlid qilish uchun qandaydir firibgarlikdir.
Mana shunday tuzilishga misol
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
Ba'zilar uchun bu variant YAML tuzilmasini boshlarida saralashga yordam beradi, boshqalar uchun esa, aksincha, ularni juda ko'p keraksiz, ularning fikricha, chekinishlar bilan bezovta qiladi.
Ammo agar siz YAML hujjatining egasi bo'lsangiz va uni saqlash uchun javobgar bo'lsangiz, unda siz va faqat siz chekinishdan qanday foydalanishni belgilashi kerak. Agar katta to'ldirish sizni bezovta qilsa, uni YAML spetsifikatsiyasiga muvofiq minimal darajada saqlang. Masalan, Ansible hujjatlaridagi yuqoridagi faylni hech qanday yo'qotishsiz shunday qayta yozish mumkin:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Blankalardan foydalaning
Agar siz YAML faylini to'ldirishda doimo bir xil xatolarni takrorlasangiz, unga sharh sifatida shablonni kiritish mantiqan to'g'ri keladi. Keyingi safar siz ushbu shablonni shunchaki nusxalashingiz va u erga haqiqiy ma'lumotlarni kiritishingiz mumkin, masalan:
---
# - <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. Boshqa narsadan foydalaning
Agar ilovada sizda bo'g'uvchi bo'lmasa, YAMLni boshqa formatga o'zgartirishga arziydi. Vaqt o'tishi bilan konfiguratsiya fayllari o'z-o'zidan oshib ketishi mumkin va keyin ularni Lua yoki Python-da oddiy skriptlarga aylantirish yaxshiroqdir.
YAML - bu juda ko'p odamlar o'zining minimalizmi va soddaligi uchun yaxshi ko'radigan ajoyib narsa, ammo u sizning arsenalingizdagi yagona vosita emas. Shunday qilib, ba'zida siz buni rad qilishingiz mumkin. YAML uchun tahlil qilish kutubxonalarini topish oson, shuning uchun siz oson migratsiya variantlarini taklif qilsangiz, foydalanuvchilaringiz bu nosozlikdan nisbatan og'riqsiz omon qoladilar.
Agar siz YAMLsiz qilolmasangiz, unda ushbu 10 ta maslahatni oling va YAMLni yoqtirmasligingizni bir marta va umuman yengib chiqing!
Manba: www.habr.com