YAML Zen рүү 10 алхам

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

YAML Zen рүү 10 алхам

Хэрэв YAML таныг уурлуулж байвал та чадна, тэгэх ч болно! – Дараах 10 алхмыг хийснээр бухимдлаа хүлээн зөвшөөрөгдөх хэмжээнд хүртэл бууруулж, YAML-д дурла. Энэ жагсаалтад нийцүүлэн бидний арван зөвлөмжийг эхнээс нь дугаарлаж, бясалгал, оюун санааны дасгалуудыг өөрийн үзэмжээр нэмэх болно 😉

0. Засварлагчаа ажиллуул

Танд ямар текст засварлагч байгаа нь хамаагүй, YAML-тэй ажиллахад зориулсан ядаж нэг залгаас байгаа байх. Хэрэв танд байхгүй бол тэр даруй олж суулгаарай. Хайлт хийх, тохируулахад зарцуулсан хугацаа нь таныг YAML-г засварлах бүрт олон дахин үр дүнгээ өгөх болно.

Жишээлбэл, редактор Atom YAML-г анхдагчаар дэмждэг боловч GNU Emacs-ийн хувьд та нэмэлт багцуудыг суулгах хэрэгтэй болно, жишээлбэл, yaml горим.

YAML Zen рүү 10 алхам

YAML горимд байгаа Emacs ба орон зайг харуулах.

Хэрэв таны дуртай редактор YAML горимгүй бол тохиргоотой ажиллах замаар зарим асуудлыг шийдэж болно. Жишээлбэл, стандарт GNOME текст засварлагч Gedit нь YAML горимгүй боловч анхдагч байдлаар YAML синтаксийг онцолж, доголтой ажлыг тохируулах боломжийг танд олгоно.

YAML Zen рүү 10 алхам

Gedit дээр догол мөрийг тохируулах.

Plugin сул зай Gedit-ийн хувьд хоосон зайг цэг хэлбэрээр үзүүлж, доголын түвшний тодорхой бус байдлыг арилгадаг.

Өөрөөр хэлбэл, дуртай редакторынхаа талаар суралцах цагийг өнгөрөө. YAML-тэй ажиллахад түүнд эсвэл түүний хөгжлийн нийгэмлэг юу санал болгож байгааг олж мэдээд, эдгээр функцуудыг ашиглана уу. Та харамсахгүй нь гарцаагүй.

1. Линтер ашиглах

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

Суулгах ямлинт Та стандарт Linux багц менежерийг ашиглаж болно. Жишээлбэл, in Red Hat Enterprise Линукс 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-ийг буцаавал давхар тэмдэгт ажиллана. Мөн 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 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. The Tabs vs. Spaces дилемма

Та бэрхшээлийг шийдэх хэрэгтэй болно "таб эсвэл хоосон зай?". Дэлхий нийтийн утгаар биш, зөвхөн танай байгууллагын түвшинд, эсвэл ядаж л төсөл. Үүнд 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

сэтгэгдэл нэмэх