10 soļi uz YAML zen

Mēs visi mÄ«lam Ansible, taču Ansible ir YAML. Konfigurācijas failiem ir daudz formātu: vērtÄ«bu saraksti, "atslēga-vērtÄ«ba" pāri, INI faili, YAML, JSON, XML un vēl daudz citu. Tomēr vairākos iemeslos no visiem Å”iem formātiem YAML bieži tiek uzskatÄ«ts par Ä«paÅ”i sarežģītu. ÄŖpaÅ”i, neskatoties uz tā atsvaidzinoÅ”o minimālismu un ievērojamo spēju strādāt ar hierarhiskām vērtÄ«bām, YAML sintakse var kaitināt ar savu Python lÄ«dzÄ«go pieeju atkāpēm.

10 soļi uz YAML zen

Ja jÅ«s kaitina YAML, jÅ«s varat – un jums vajadzētu! – veikt Å”os 10 nākamos soļus, lai samazinātu savu nepatiku lÄ«dz pieņemamam lÄ«menim un iemÄ«lēties YAML. Kā Ä«stam sarakstam, mÅ«su desmit padomi tiks numurēti no nulles, meditāciju un garÄ«gās prakses pievienojam pēc izvēles šŸ˜‰

0. Pārlieciniet savu redaktoru strādāt

Nav svarÄ«gi, kādu teksta redaktoru izmantojat – tam noteikti ir vismaz viens spraudnis, lai strādātu ar YAML. Ja tāda nav, nekavējoties atrodiet un instalējiet. Laiks, ko pavadÄ«siet meklējot un iestataot, tiks vairākkārt atgÅ«ts, katru reizi, kad nāksies rediģēt YAML.

Piemēram, redaktors Atom atbalsta YAML pēc noklusējuma, bet GNU Emacs gadījumā ir jāsagatavo papildu pakotnes, piemēram, yaml-mode.

10 soļi uz YAML zen

Emacs YAML režīmā un attēlojot atkāpes.

Ja jūsu iecienītajā redaktorā nav YAML režīma, daļu problēmu var atrisināt, strādājot ar iestatījumiem. Piemēram, noklusējuma GNOME teksta redaktors Gedit nav YAML režīma, bet pēc noklusējuma izceļ YAML sintaksi un ļauj iestatīt atkāpes:

10 soļi uz YAML zen

Atkāpes iestatīŔana Gedit.

Un spraudnis drawspaces Gedit attēlo atkāpes kā punktus, novērÅ”ot neskaidrÄ«bas attiecÄ«bā uz atkāpju lÄ«meņiem.

Citiem vārdiem sakot, veltiet laiku, lai izpētÄ«tu savu iecienÄ«to redaktoru. Noskaidrojiet, ko tas pats vai tā izstrādātāju kopiena piedāvā darbam ar YAML, un izmantojiet Ŕīs iespējas. JÅ«s tieŔām to nenožēlosiet.

1. Izmantojiet linters

Ideālā gadÄ«jumā programmēŔanas un marķēŔanas valodām ir paredzamas sintakses. Datori labi tiek galā ar paredzamÄ«bu, tādēļ jau 1978. gadā radās linters koncepcija. Ja tas 40 gadu laikā ir pagājis garām un jÅ«s joprojām neizmantojat YAML linters, tad vislabākais laiks, lai izmēģinātu yamllint.to var izdarÄ«t, izmantojot noklusējuma Linux pakotņu pārvaldnieku. Piemēram,

Uzstādīt yamllint in Red Hat Enterprise Linux 8 vai Fedora to tiek darīts Ŕādi:

$ sudo dnf install yamllint

Tad jūs vienkārŔi palaidīsiet yamllint, nododot tam YAML failu pārbaudei. Lūk, kā tas izskatās, ja nododat linternim failu ar kļūdu:

$ yamllint errorprone.yaml
errorprone.yaml
23:10     kļūda    sintakses kļūda: mapping values nav atļauti Ŕeit
23:11     kļūda    pēdējie atstarpes (trailing-spaces)

Skaitļi pa kreisi – tas nav laiks, bet kļūdas koordinātas: rindu un kolonnu numuri. Kļūdas apraksts var jums neko neteikt, bet jÅ«s precÄ«zi zināt, kur tā atrodas. VienkārÅ”i aplÅ«kojiet Å”o vietu kodā, un, iespējams, viss kļūs skaidrs.

Kad yamllint neatrod kļūdas failā, ekrānā nekas netiek izvadÄ«ts. Ja jÅ«s uztrauc Ŕī klusēŔana un vēlaties nedaudz vairāk atsauksmju, varat palaist linterni ar nosacÄ«tu komandu echo, izmantojot dubultu ampersandu (&&), tādā veidā:

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

POSIX dubultais ampersands darbojas tad, kad tieÅ”i iepriekŔējā komanda atgriež 0. Un yamllint tieÅ”i atgriež atrasto kļūdu skaitu, tādēļ visa Ŕī nosacÄ«juma konstrukcija arÄ« darbojas.

2. Rakstiet Pythonā, nevis YAML

Ja jÅ«s tieŔām tracina YAML, tad vienkārÅ”i nerakstiet to, burtiski. Ir gadÄ«jumi, kad YAML ir vienÄ«gais formāts, ko lieto lietojumprogramma. Bet pat Å”ajā gadÄ«jumā nav obligāti jāveido YAML fails. Rakstiet tajā, kas jums patÄ«k, un vēlāk konvertējiet. Piemēram, Pythonā ir izcila bibliotēka pyyaml un veseli divi veidi konvertēŔanai: paÅ”konvertēŔana un konvertēŔana caur skriptiem.

PaÅ”konvertēŔana

Å ajā gadÄ«jumā datu fails ir arÄ« Python skripts, kas Ä£enerē YAML. Å Ä« metode vislabāk der nelieliem datu kopām. JÅ«s vienkārÅ”i rakstāt JSON datus Python mainÄ«gajā, ievadiet to ar import direktÄ«vu, un faila beigās pievienojat trÄ«s rindiņas izvadei.

#!/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

Tagad palaidīsim Ŕo failu Pythonā, un izejā iegūsim failu output.yaml:

$ python3 ./example.json
$ cat output.yaml
glossary:
  GlossDiv:
	GlossList:
	  GlossEntry:
		Abbrev: ISO 8879:1986
		Acronym: SGML
		GlossDef:
		  GlossSeeAlso: [GML, XML]
		  para: Meta-mākoni valoda, ko izmanto, lai izveidotu mākoni valodas, piemēram, DocBook.
		GlossSee: mākonīga
		GlossTerm: Standarta ģenerēta mākoni valoda
		ID: SGML
		SortAs: SGML
	title: S
  title: piemēra vārdnīca

Tas ir pilnÄ«gi pareizs YAML, bet yamllint izsniegs brÄ«dinājumu, ka tas nesākas ar —. Nu, to ir viegli salabot manuāli vai nedaudz uzlabojot Python skriptu.

KonvertēŔana caur skriptiem

Å ajā gadÄ«jumā vispirms rakstām JSON formātā, pēc tam palaidÄ«sim pārveidotāju kā atseviŔķu Python skriptu, kas gala rezultātā nodroÅ”ina YAML. SalÄ«dzinājumā ar iepriekŔējo, Ŕī metode labāk pielāgojas, jo pārveidoÅ”ana ir atdalÄ«ta no datiem.

Vispirms izveidosim JSON failu example.json, piemēram, to var ņemt no 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": "Meta-markup valoda, ko izmanto, lai izveidotu markup valodas, piemēram, DocBook.",
			  "GlossSeeAlso": ["GML", "XML"]
			  },
			"GlossSee": "markup"
			}
		  }
		}
	  }
	}

Pēc tam izveidosim vienkārÅ”u pārveidotāja skriptu un saglabāsim to ar nosaukumu json2yaml.py. Å is skripts importē abus moduļus — YAML un JSON Python, kā arÄ« ielādē lietotāja norādÄ«to JSON failu, veic pārveidoÅ”anu un raksta datus failā 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()

Saglabājiet Å”o skriptu sistēmas ceļā un palaidiet, kad nepiecieÅ”ams:

$ ~/bin/json2yaml.py example.json

3. Apstrādājiet daudz un bieži

Dažreiz uz problēmu ir noderīgi paskatīties no cita leņķa. Ja jums ir grūti iedomāties attiecības starp datiem YAML, to var pagaidu pārvērst par kaut ko ierastāku.

Piemēram, ja jums patīk strādāt ar vārdnīcu sarakstiem vai JSON, tad YAML var pārvērst JSON tikai ar divām komandām Python interaktīvajā saskarē. Pieņemsim, ka jums ir YAML fails mydata.yaml, tad lūk, kā tas izskatīsies:

$ 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': 'Labi raksts. Varētu būt labāks.'}

Par Å”o tēmu var atrast daudz citu piemēru. Turklāt pieejami daudzi tieÅ”saistes pārveidotāji un lokālie parseri. Tādēļ nebaidieties pārveidot datus, kad redzat tajos tikai neskaidru jucekli.

4. Lasiet specifikācijas

Atgriežoties pie YAML pēc ilgā pārtraukuma, noderÄ«gi ir apmeklēt yaml.org un pārlasÄ«t specifikācijas (specifikācijas). Ja jums ir grÅ«tÄ«bas ar YAML, bet lÄ«dz specifikāciju izlasīŔanai vēl neesat ticis, tad ir laiks to labot. Specifikācijas ir pārsteidzoÅ”i viegli uzrakstÄ«tas, un sintakses prasÄ«bas ir ilustrētas ar lielu skaitu piemēru. 6. nodaļā.

5. Pseudokonfigurācijas

Rakstot grāmatu vai rakstu, vienmēr ir noderÄ«gi vispirms izveidot sākotnēju plānu, vismaz tādu kā satura rādÄ«tāju. ArÄ« YAML gadÄ«jumā ir tāpat. VisdrÄ«zāk jÅ«s zināt, kādi dati jāieraksta YAML failā, bet neesat droÅ”i, kā tos savienot savā starpā. Tāpēc pirms YAML rakstīŔanas, uzzÄ«mējiet pseido konfigurāciju.

Pseido konfigurācija ir lÄ«dzÄ«ga pseido kodam, kur nav jāuztraucas par struktÅ«ru vai atkāpēm, attiecÄ«bām 'vecāks-bērns', mantoÅ”anu un iedziļināŔanu. ArÄ« Å”eit: jÅ«s zÄ«mējat datu iterācijas, kad tās rodas jÅ«su prātā.

10 soļi uz YAML zen

Pseido konfigurācija ar programmētāju sarakstu (Martin un Tabitha) un viņu prasmēm (programmēŔanas valodās: Python, Perl, Pascal un Lisp, Fortran, Erlang, attiecÄ«gi).

Uzzīmējot pseido konfigurāciju uz papīra, uzmanīgi to analizējiet un, ja viss ir kārtībā, sakārtot to derīgā YAML failā.

6. Dilemma 'tabulācija vai atstarpes'

Jums nāksies izŔķirt dilemma 'tabulācija vai atstarpes?'. Ne globālā nozÄ«mē, bet tikai jÅ«su organizācijas lÄ«menÄ«, vai vismaz projekta ietvaros. Nav svarÄ«gi, vai tajā tiks izmantota sed skriptu pēcapstrāde, programmētāju tekstu redaktoru konfigurācija vai vispārēja parakstu vākÅ”ana par stingru lintra norādÄ«jumu ievēroÅ”anu lÄ«dz darba zaudēŔanai, bet visiem jÅ«su komandas locekļiem, kuri kaut kādā veidā saskaras ar YAML, obligāti jāizmanto tikai atstarpes (kā to prasa YAML specifikācija).

Jebkurā normālā tekstu redaktorā var iestatÄ«t automātisko tabulācijas aizvietoÅ”anu ar noteiktu atstarpu skaitu, tāpēc nav jābaidās no sacelÅ”anās piekritējiem taustiņam Tab nav jāsatraucas.

Kā katram YAML antipatijam ir labi zināms, ekrānā nav redzamas atŔķirÄ«bas starp tabulāciju un atstarpēm. Un, ja kaut kas nav redzams, parasti to atceras pēdējā brÄ«dÄ«, pēc tam, kad ir pārbaudÄ«tas un novērstas visas citas iespējamas problēmas. Stundas laikā, kas iztērēta, meklējot nepareizu tabulāciju vai atstarpu bloku, skaidri liecina, ka jums steidzami jāizveido politiku attiecÄ«bā uz tā izmantoÅ”anu, un pēc tam jārealizē stingra tās ievēroÅ”anas pārbaude (piemēram, ar Git hook, kas parāda, caur lintru).

7. Labāk mazāk, bet labāk (vai vairāk – tas ir mazāk)

Daži cilvēki mÄ«l rakstÄ«t YAML, jo tas uzsver struktÅ«ru. Tajā paŔā laikā viņi aktÄ«vi izmanto atkāpes, lai izceltu datu blokos. Tas ir sava veida krāpÅ”anās, lai imitētu atzÄ«mēŔanas valodas, kurās tiek izmantoti skaidri atdalÄ«tāji.

Å eit ir Ŕādas strukturētÄ«bas piemērs no Ansible dokumentācijas:

# Employee records
-  martin:
        name: Martin D'vloper
        job: Developer
        skills:
            - python
            - perl
            - pascal
-  tabitha:
        name: Tabitha Bitumen
        job: Developer
        skills:
            - lisp
            - fortran
            - erlang

Kādam Ŕāda iespēja palÄ«dz sakārtot YAML struktÅ«ru prātā, citiem tā gluži pretēji izraisa diskomfortu ar bezjēdzÄ«gajiem, viņuprāt, atkāpēm.

Bet, ja jÅ«s esat YAML dokumenta Ä«paÅ”nieks un atbildat par tā uzturēŔanu, tad jÅ«s un tikai jÅ«s jums jānosaka, kā izmantot atkāpes. Ja jÅ«s kaitina lielas atkāpes, samaziniet tās lÄ«dz minimumam, kas ir iespējams saskaņā ar YAML specifikāciju. Piemēram, iepriekÅ” minēto failu no Ansible dokumentācijas bez jebkādiem zaudējumiem var pārveidot Ŕādi:

---
- martin:
   name: Martin D'vloper
   job: Developer
   skills:
   - python
   - perl
   - pascal
- tabitha:
   name: Tabitha Bitumen
   job: Developer
   skills:
   - lisp
   - fortran
   - erlang

8. Izmantojiet Ŕablonus

Ja, aizpildot YAML failu, jÅ«s pastāvÄ«gi atkārtojat vienas un tās paÅ”as kļūdas, ir jēga iekļaut tajā veidni komentāra veidā. Tādējādi nākamreiz varēsiet vienkārÅ”i kopēt Å”o Å”ablonu un ierakstÄ«t tur reālos datus, piemēram:

---
# - <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. Izmantojiet kaut ko citu

Ja lietojumprogramma nenotur jÅ«s cieÅ”i rokās, tad, iespējams, ir vērts nomainÄ«t YAML uz citu formātu. Laika gaitā konfigurācijas faili var pāraugt sevi, un tad labāk ir tos pārveidot par vienkārÅ”iem skriptiem Lua vai Python.

YAML ir lieliska lieta, ko daudzi novērtē par minimālismu un vienkārŔību, taču tas nav vienÄ«gais instruments jÅ«su arsenālā. Tāpēc dažreiz no tā var atteikties. YAML ir viegli atrast parsēŔanas bibliotēkas, tāpēc, ja jÅ«s piedāvāsiet ērtas migrācijas iespējas, jÅ«su lietotāji relatÄ«vi nesāpÄ«gi piedzÄ«vos Ŕādu atteikÅ”anos.

Ja bez YAML nevar iztikt, tad paņemiet vērā Å”os 10 padomus un uzvariet savu nepatiku pret YAML reiz un uz visiem laikiem!

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster