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 режимі болмаса, онда кейбір мәселелерді параметрлермен жұмыс істеу арқылы шешуге болады. Мысалы, Gedit стандартты GNOME мәтіндік редакторында YAML режимі жоқ, бірақ әдепкі бойынша ол YAML синтаксисін ерекшелейді және шегіністермен жұмысты конфигурациялауға мүмкіндік береді:

YAML Zen-ге 10 қадам

Gedit ішіндегі шегіністерді орнату.

Плагин сызбалар Gedit үшін бос орындарды шегініс деңгейлері бар анық еместерді жоя отырып, нүктелер ретінде көрсетеді.

Басқаша айтқанда, сүйікті редакторыңыз туралы білуге ​​уақыт бөліңіз. YAML-мен жұмыс істеу үшін оның немесе оның даму қауымдастығы не ұсынатынын біліп, сол мүмкіндіктерді пайдаланыңыз. Сіз бұған міндетті түрде өкінбейсіз.

1. Линтерді пайдаланыңыз

Ең дұрысы, бағдарламалау тілдері мен белгілеу тілдері болжамды синтаксисті пайдаланады. Компьютерлер болжауда жақсы, сондықтан тұжырымдамасы линтера. Егер 40 жыл ішінде ол сізді айналып өтсе және сіз әлі де YAML линтерін пайдаланбасаңыз, онда 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 файлда қате таппаса, экранға ештеңе басып шығарылмайды. Егер мұндай үнсіздік сізді қорқытса және сіз көбірек кері байланыс алғыңыз келсе, қос амперсанд (&&) арқылы шартты echo пәрменімен линтерді іске қосуға болады, мысалы:

$ 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 тілінде жазамыз, содан кейін түрлендіргішті шығыс ретінде YAML шығаратын жеке Python сценарийі ретінде іске қосамыз. Алдыңғы әдіспен салыстырғанда бұл әдіс жақсырақ масштабталады, өйткені түрлендіру деректерден бөлек.

Алдымен, мысал.json 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 спецификациясы талап ететіндей).

Кез келген қалыпты мәтіндік редакторда сіз бос орындардың белгілі бір санына автоматты түрде түзетілген қойындыларды конфигурациялай аласыз, осылайша негізгі ұстанушылар бүлігі болады. 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-ді ұнатпауыңызды біржола жеңіңіз!

Ақпарат көзі: www.habr.com

пікір қалдыру