10 қадам ба YAML Zen

Мо ҳама Ansible-ро дӯст медорем, аммо Ansible YAML аст. Форматҳои зиёди файлҳои конфигуратсия мавҷуданд: рӯйхати арзишҳо, ҷуфтҳои параметр-арзиш, файлҳои INI, YAML, JSON, XML ва бисёр дигарон. Бо вуҷуди ин, бо якчанд сабаб аз ҳамаи онҳо, YAML аксар вақт махсусан душвор ҳисобида мешавад. Махсусан, сарфи назар аз минимализми тароватбахш ва қобилиятҳои таъсирбахши кор бо арзишҳои иерархӣ, синтаксиси YAML метавонад бо равиши Python-и худ ба қафо озоровар бошад.

10 қадам ба YAML Zen

Агар YAML шуморо хашмгин кунад, шумо метавонед - ва шумо бояд! - 10 қадами зеринро иҷро кунед, то ноумедии худро ба сатҳи қобили қабул кам кунед ва ба YAML ошиқ шавед. Мувофиқи ин рӯйхат, даҳ маслиҳати мо аз сифр рақамгузорӣ карда мешавад, мо бо хоҳиши худ медитатсия ва таҷрибаҳои рӯҳонӣ илова мекунем 😉

0. Муҳаррири худро кор кунед

Муҳаррир нест, ки шумо кадом муҳаррири матн доред, эҳтимолан ҳадди аққал як плагин барои кор бо YAML мавҷуд аст. Агар шумо надошта бошед, онро фавран пайдо кунед ва насб кунед. Вақти сарфшуда барои ҷустуҷӯ ва насб кардани ҳар дафъае, ки шумо бояд YAML-ро таҳрир кунед, чанд маротиба фоида меорад.

Масалан, муҳаррир атом YAML-ро бо нобаёнӣ дастгирӣ мекунад, аммо барои GNU Emacs шумо бояд бастаҳои иловагӣ насб кунед, масалан, режими ямл.

10 қадам ба YAML Zen

Emacs дар ҳолати YAML ва намоиши ҷойҳо.

Агар муҳаррири дӯстдоштаи шумо режими YAML надошта бошад, пас баъзе мушкилотро тавассути кор бо танзимот ҳал кардан мумкин аст. Масалан, муҳаррири матнии стандартии GNOME Gedit режими YAML надорад, аммо ба таври нобаёнӣ он синтаксиси YAML-ро таъкид мекунад ва ба шумо имкон медиҳад, ки корро бо абзорҳо танзим кунед:

10 қадам ба YAML Zen

Муқаррар кардани абзорҳо дар Gedit.

Плагин фосилаҳо барои Gedit, фосилаҳоро ҳамчун нуқтаҳо нишон медиҳад, ки номуайяниро бо сатҳҳои дохилшавӣ бартараф мекунад.

Ба ибораи дигар, вақти омӯхтани муҳаррири дӯстдоштаи худро сарф кунед. Бифаҳмед, ки ӯ ё ҷомеаи рушди ӯ барои кор бо YAML чӣ пешниҳод мекунад ва аз ин хусусиятҳо истифода баред. Шумо бешубҳа пушаймон нахоҳед шуд.

1. Линтерро истифода баред

Идеалӣ, забонҳои барномасозӣ ва забонҳои аломатгузорӣ синтаксиси пешбинишавандаро истифода мебаранд. Компютерҳо дар пешгӯӣ хубанд, аз ин рӯ мафҳуми линтера. Агар дар тӯли 40 соли мавҷудияти худ он аз шумо гузашта бошад ва шумо то ҳол linter YAML-ро истифода набаред, пас вақти он расидааст, ки yamllint-ро санҷед.

Насб кунед ямлинт Шумо метавонед менеҷери бастаи стандартии Linux-ро истифода баред. Масалан, дар Red Hat Enterprise Linux 8 ё Федора он чунин анҷом дода мешавад:

$ sudo dnf install yamllint

Пас шумо танҳо yamllint-ро иҷро карда, онро файли YAML барои тафтиш мегузоред. Агар шумо файли хатогиро ба линтер интиқол диҳед, ин чунин ба назар мерасад:

$ yamllint errorprone.yaml
errorprone.yaml
23:10     error    syntax error: mapping values are not allowed here
23:11     error    trailing spaces  (trailing-spaces)

Рақамҳои тарафи чап на вақт, балки координатаҳои хатогӣ мебошанд: рақами сатр ва сутун. Тавсифи хато метавонад ба шумо чизе нагӯяд, аммо шумо аниқ медонед, ки он дар куҷост. Танҳо ба ин ҷой дар код нигаред ва эҳтимолан ҳама чиз равшан мешавад.

Вақте ки yallint дар файл ягон хатогие наёбад, ҳеҷ чиз дар экран чоп карда намешавад. Агар чунин хомӯшӣ шуморо тарсонад ва шумо каме фикру мулоҳиза мехоҳед, пас шумо метавонед линтерро бо фармони шартии echo тавассути амперсанди дукарата (&&) иҷро кунед, ба монанди:

$ yamllint perfect.yaml && echo "OK"
OK

Дар POSIX, амперсанди дукарата оташ мезанад, агар фармони қаблӣ 0 баргардад.

2. Бо Python нависед, на YAML

Агар YAML воқеан шуморо хашмгин кунад, танҳо дар он нанависед. Чунин мешавад, ки YAML ягона форматест, ки барнома мефаҳмад. Аммо ҳатто дар ин ҳолат, эҷод кардани файли YAML шарт нест. Он чизеро, ки ба шумо маъқул аст, нависед ва сипас табдил диҳед. Масалан, китобхонаи олӣ барои Python вуҷуд дорад пиямл ва ду усули табдил: табдили худидоракунии ва табдил тавассути скриптҳо.

Табдилдиҳии худ

Дар ин ҳолат, файли маълумот инчунин скрипти 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 шуморо огоҳ мекунад, ки он бо - оғоз намешавад. Хуб, инро метавон ба осонӣ дастӣ ислоҳ кард ё дар скрипти Python каме тағир дод.

Табдил тавассути скриптҳо

Дар ин ҳолат, мо аввал дар 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 кор кардан бароҳат бошед, шумо метавонед танҳо бо ду фармон дар қабати интерактивии Python YAML-ро ба JSON табдил диҳед. Фарз мекунем, ки шумо файли 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 Roadn', 'city': 'Brooklyn', 'state': 'Wellington', 'postal': 6021, 'country': 'NZ'}}, 'words': 938, 'comments': 'Good article. Could be better.'}

Шумо метавонед дар ин мавзӯъ бисёр мисолҳои дигарро пайдо кунед. Илова бар ин, бисёр конвертерҳои онлайн ва таҳлилгари маҳаллӣ мавҷуданд. Аз ин рӯ, шарм надоред, ки маълумотро аз нав формат кунед, вақте ки шумо дар он танҳо як печидагии нофаҳмо мебинед.

4. Мушаххасотро хонед

Пас аз танаффуси тӯлонӣ ба YAML баргаштан, дидан муфид аст yaml.org ва мушаххасотро (мушаххасот) дубора хонед. Агар шумо бо YAML мушкилот дошта бошед, аммо ба мушаххасот наомадаед, пас вақти ислоҳ кардани ин вазъият расидааст. Навиштани мушаххасот ба таври ҳайратангез осон аст ва талаботи синтаксис бо миқдори зиёди мисолҳо дар банди 6.

5. Конфигуратсияҳои псевдо

Ҳангоми навиштани китоб ё мақола ҳамеша нахуст нақшаи пешакӣ, ҳадди аққал дар шакли мундариҷа муфид аст. Бо YAML ҳамин тавр аст. Эҳтимол, шумо тасаввуроте доред, ки кадом маълумотро ба файли YAML навиштан лозим аст, аммо шумо аслан намефаҳмед, ки чӣ гуна онро бо ҳамдигар пайваст кунед. Аз ин рӯ, пеш аз муҷассамаи YAML, псевдо-конфигуратсияро кашед.

Pseudo-config ба псевдо-код шабоҳат дорад, ки дар он ба шумо лозим нест, ки дар бораи сохтор ё дохилшавӣ, муносибатҳои волидайн ва фарзанд, мерос ва лонасозӣ хавотир шавед. Дар ин ҷо ҳамин тавр аст: шумо такрори маълумотро ҳангоми пайдо шудани онҳо дар сари шумо мекашед.

10 қадам ба YAML Zen

Барномасозони псевдоконфигуратсияи листинг (Мартин ва Табита) ва малакаҳои онҳо (забонҳои барномасозӣ: мутаносибан Python, Perl, Pascal ва Lisp, Fortran, Erlang).

Пас аз кашидани псевдо-конфигуратсия дар варақ, онро бодиққат таҳлил кунед ва агар ҳама чиз дуруст бошад, онро дар шакли файли дурусти YAML формат кунед.

6. Дилеммаи ҷадвалҳо ва фосилаҳо

Шумо бояд мушкилиро ҳал кунед "ҷадвалҳо ё фосилаҳо?". На ба маънои ҷаҳонӣ, балки танҳо дар сатҳи созмони шумо ё ҳадди аққал лоиҳа. Фарқ надорад, ки ин истифодаи пас аз коркард бо скрипти sed, насб кардани муҳаррирони матнӣ дар мошинҳои барномасозон ё ба таври умум гирифтани квитансияҳои риояи қатъии дастурҳои линтерро таҳти таҳдиди аз кор озод кардан дар бар мегирад, аммо ҳамаи аъзоёни дастаи шумо, ки дар ин ё он роҳе, ки ба YAML марбут аст, бояд танҳо фосилаҳоро истифода барад (тавре ки мушаххасоти YAML талаб мекунад).

Дар ҳама гуна муҳаррири матнии муқаррарӣ, шумо метавонед ҷадвалҳои худкорро ба миқдори муайяни ҷойҳо танзим кунед, то исёни пайравони калидӣ Tab шумо набояд тарсид.

Тавре ки ҳар як бадбини YAML хуб медонад, шумо наметавонед фарқияти байни ҷадвалҳо ва фосилаҳоро дар экран бубинед. Ва ҳангоме ки чизе ба назар намерасад, ин одатан охирин чизест, ки одамон пас аз мураттаб, тафтиш ва бартараф кардани ҳама мушкилоти дигари имконпазир дар хотир доранд. Як соате, ки барои ҷустуҷӯи хатти ҷадвал ё блоки ҷойҳо сарф мешавад, танҳо дод мезанад, ки шумо бояд фавран сиёсати истифодаи ин ё он дигарро эҷод кунед ва сипас санҷиши оҳану бетонии мувофиқатро ба он гузаронед (масалан, тавассути қалмоқе Git барои маҷбур кардани он тавассути линтер).

7. Камтар зиёд аст (ё бештар камтар аст)

Баъзе одамон дар YAML навиштанро дӯст медоранд, зеро он сохторро таъкид мекунад. Ҳамзамон, онҳо барои таъкид кардани блокҳои додаҳо аз абзор истифода мебаранд. Ин як навъ қаллобӣ барои тақлид кардани забонҳои аломатгузорӣ мебошад, ки ҷудокунакҳои возеҳро истифода мебаранд.

Дар ин ҷо як мисоли чунин сохтор аз Ҳуҷҷатҳои оқилона:

# 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 кор карда натавонед, пас ин 10 маслиҳатро бигиред ва нохушбинии худро аз YAML як бор ва барои ҳама бартараф кунед!

Манбаъ: will.com

Илова Эзоҳ