YAML Zenga 10 qadam

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.

YAML Zenga 10 qadam

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 atom sukut bo'yicha YAML-ni qo'llab-quvvatlaydi, lekin GNU Emacs uchun siz qo'shimcha paketlarni o'rnatishingiz kerak bo'ladi, masalan, yaml rejimi.

YAML Zenga 10 qadam

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:

YAML Zenga 10 qadam

Gedit-da chekinishlarni o'rnatish.

Plagin chizilgan joylar Gedit uchun bo'shliqlarni nuqta sifatida ko'rsatadi, chekinish darajalari bilan noaniqliklarni yo'q qiladi.

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 lintera. Agar mavjud bo'lgan 40 yil ichida u sizni chetlab o'tgan bo'lsa va siz hali ham YAML linteridan foydalanmasangiz, unda yallintni sinab ko'rish vaqti keldi.

O'rnatish yamlint Siz standart Linux paket menejeridan foydalanishingiz mumkin. Masalan, in Red Hat Enterprise Linux 8 yoki Fedora bu shunday amalga oshiriladi:

$ 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 pyyaml va ikkita konvertatsiya usuli: o'z-o'zini aylantirish va skriptlar orqali konvertatsiya qilish.

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 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"
			}
		  }
		}
	  }
	}

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 yaml.org va texnik xususiyatlarni (xususiyatlar) qayta o'qing. Agar siz YAML bilan bog'liq qiyinchiliklarga duch kelsangiz, lekin spetsifikatsiyaga erisha olmagan bo'lsangiz, bu vaziyatni tuzatish vaqti keldi. Xususiyatlarni yozish hayratlanarli darajada oson va sintaksis talablari ko'p sonli misollar bilan tasvirlangan. 6-bob.

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.

YAML Zenga 10 qadam

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 "yorliqlar yoki bo'shliqlar?". Global ma'noda emas, balki faqat tashkilotingiz darajasida yoki hech bo'lmaganda loyiha. Bu sed skript bilan post-processingdan foydalanishni, dasturchilarning mashinalarida matn muharrirlarini o'rnatishni yoki ishdan bo'shatish tahdidi ostida linterning ko'rsatmalariga qat'iy rioya qilinganligi to'g'risidagi kvitansiyalarni umumiy qabul qilishni o'z ichiga oladimi, muhim emas, lekin sizning jamoangizning barcha a'zolari. YAML bilan bog'liq bo'lgan u yoki bu usul faqat bo'shliqlardan foydalanishi kerak (YAML spetsifikatsiyasi talab qilganidek).

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 Aniq hujjatlar:

# 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

a Izoh qo'shish