YAML Zenге 10 кадам

Биз баарыбыз Ansibleди жакшы көрөбүз, бирок Ansible бул YAML. Конфигурация файлдары үчүн көптөгөн форматтар бар: баалуулуктардын тизмелери, параметр-маанилик жуптар, INI файлдары, YAML, JSON, XML жана башкалар. Бирок, алардын ичинен бир нече себептерден улам, YAML көбүнчө өзгөчө оор деп эсептелет. Атап айтканда, анын сергиткен минимализмине жана иерархиялык баалуулуктар менен иштөө үчүн таасирдүү мүмкүнчүлүктөрүнө карабастан, YAML синтаксиси Python сыяктуу чегинүүгө болгон мамилеси менен кыжырды келтириши мүмкүн.

YAML Zenге 10 кадам

Эгерде YAML сизди кыжырдантса, сиз жасай аласыз жана керек! – Сиздин нааразычылыгыңызды алгылыктуу деңгээлге түшүрүү жана YAMLди сүйүп калуу үчүн төмөнкү 10 кадамды жасаңыз. Бул тизмеге ылайык, биздин он кеңеш нөлдөн баштап номерленет, биз каалагандай медитация жана рухий практикаларды кошобуз 😉

0. Редакторуңузду иштетиңиз

Кандай текст редактору бар экенине карабай, YAML менен иштөө үчүн жок дегенде бир плагин бар болушу мүмкүн. Эгер сизде жок болсо, аны дароо таап, орнотуңуз. Издөөгө жана орнотууга кеткен убакыт YAMLди түзөтүүгө туура келген сайын көп эсе төлөйт.

Мисалы, редактор атом демейки боюнча YAML колдойт, бирок GNU Emacs үчүн кошумча пакеттерди орнотуу керек болот, мисалы, yaml режими.

YAML Zenге 10 кадам

YAML режиминде Emacs жана боштуктарды көрсөтүү.

Эгерде сиздин сүйүктүү редакторуңузда YAML режими жок болсо, анда кээ бир көйгөйлөрдү орнотуулар менен иштөө аркылуу чечсе болот. Мисалы, стандарттуу GNOME текст редакторунда YAML режими жок, бирок демейки боюнча ал YAML синтаксисин баса белгилейт жана чегинүүлөр менен иштөөнү конфигурациялоого мүмкүндүк берет:

YAML Zenге 10 кадам

Geditте чегинүүлөрдү орнотуу.

Плагин тартуу боштуктары Gedit үчүн боштуктарды чекиттер катары көрсөтүп, чегинүү деңгээли менен так эместиктерди жок кылат.

Башка сөз менен айтканда, сүйүктүү редакторуңуз жөнүндө үйрөнүүгө убакыт бөлүңүз. Ал же анын өнүктүрүү коомчулугу YAML менен иштөө үчүн эмне сунуш кыларын билип алыңыз жана ошол функцияларды колдонуңуз. Сиз, албетте, өкүнбөйсүз.

1. Линтер колдонуңуз

Идеалында, программалоо тилдери жана белгилөө тилдери болжолдуу синтаксисин колдонушат. Компьютерлер алдын ала айтууда жакшы, ошондуктан түшүнүк линтера. Эгерде 40 жыл ичинде ал сизден өтүп кетсе жана сиз дагы эле YAML линтерин колдонбосоңуз, анда yamllint сынап көрүүгө убакыт келди.

белгилөө yamllint Сиз стандарттуу Linux пакет менеджерин колдоно аласыз. Мисалы, в Red Hat Enterprise Linux 8 же Fedora мындай жасалат:

$ sudo dnf install yamllint

Андан кийин сиз текшерүү үчүн YAML файлын өткөрүп, yamllint иштетесиз. Катасы бар файлды линтерге өткөрүп берсеңиз, бул ушундай болот:

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

Сол жактагы сандар убакыт эмес, катанын координаттары: сап жана мамычанын номери. Катанын сүрөттөлүшү сизге эч нерсе айтпашы мүмкүн, бирок сиз анын кайда экенин так билесиз. Жөн гана коддон бул жерди карап, балким, баары ачык болуп калат.

Yallint файлда эч кандай ката таппаса, экранга эч нерсе басылбайт. Эгерде мындай жымжырттык сизди коркутуп жатса жана сиз дагы бир аз пикир айткыңыз келсе, анда сиз линтерди шарттуу жаңырык буйругу менен кош амперсанд (&&) аркылуу иштетсеңиз болот, төмөнкүдөй:

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

POSIXте кош амперсанд эгер мурунку команда 0 кайтарса гана күйөт. Ал эми yamllint табылган каталардын санын гана кайтарат, ошондуктан бул бүт шарттуу конструкция иштейт.

2. YAML эмес, Python менен жазыңыз

Эгерде YAML сизди чындап эле таарынтса, анда ага түз мааниде жазбаңыз. YAML колдонмо түшүнгөн жалгыз формат болуп калат. Бирок бул учурда да, YAML файлын түзүү зарыл эмес. Өзүңүзгө жаккан нерсени жазыңыз, анан конвертациялаңыз. Мисалы, Python үчүн сонун китепкана бар pyyaml жана эки айландыруу ыкмалары: өзүн-өзү өзгөртүү жана скрипт аркылуу кайра.

Өзүн-өзү конверсиялоо

Бул учурда, маалымат файлы дагы YAML түзүүчү Python скрипти болуп саналат. Бул ыкма кичинекей маалымат топтомдору үчүн эң ылайыктуу. Сиз жөн гана 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га айландырсаңыз болот. Сизде mydata.yaml 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 псевдокодго окшош, мында сиз түзүм же чегинүү, ата-эне менен баланын мамилеси, мурас жана уя жөнүндө кабатырланбайсыз. Бул жерде да ушундай: сиз маалыматтардын итерациясын алар башыңызда пайда болгондо тартасыз.

YAML Zenге 10 кадам

Pseudo-config листинг программисттери (Мартин жана Табита) жана алардын жөндөмдөрү (программалоо тилдери: Python, Perl, Pascal жана Lisp, Fortran, Erlang, тиешелүүлүгүнө жараша).

Кагазга псевдо-конфигурацияны тарткандан кийин, аны кылдаттык менен талдап, эгер баары жайында болсо, аны жарактуу YAML файлы түрүндө форматтаңыз.

6. Табалар жана боштуктар дилеммасы

Сиз дилемманы чечишиңиз керек "өтмөктөр же боштуктарбы?". Глобалдык мааниде эмес, сиздин уюмуңуздун деңгээлинде гана, же жок дегенде долбоор. Бул sed скрипт менен пост-процессингди колдонууну, программисттердин машиналарында тексттик редакторлорду орнотууну же иштен бошонуу коркунучу астында линтердин көрсөтмөлөрүн так аткаргандыгы жөнүндө дүмүрчөктөрдү бардыгын камтыйбы, маанилүү эмес, бирок сиздин командаңыздын бардык мүчөлөрү тигил же бул жол менен YAML тиешелүү боштуктарды гана колдонуу керек (YAML спецификациясы талап кылгандай).

Кадимки каалаган текст редакторунда сиз автоматтык түрдө туураланган өтмөктөрдү белгилүү бир сандагы боштуктарга конфигурациялай аласыз, андыктан негизги жактоочулар козголоң чыгарбайт. табулатура коркпошуңуз керек.

Ар бир 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ди жактырбооңузду биротоло жеңиңиз!

Source: www.habr.com

Комментарий кошуу