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 ืชืฆื˜ืจืš ืœื”ืชืงื™ืŸ ื—ื‘ื™ืœื•ืช ื ื•ืกืคื•ืช, ืœืžืฉืœ, yaml-mode.

10 ืฆืขื“ื™ื ืœ-YAML Zen

Emacs ื‘ืžืฆื‘ YAML ื•ื”ืฆื’ืช ืจื•ื•ื—ื™ื.

ืื ืœืขื•ืจืš ื”ืžื•ืขื“ืฃ ืขืœื™ืš ืื™ืŸ ืžืฆื‘ YAML, ื ื™ืชืŸ ืœืคืชื•ืจ ื—ืœืง ืžื”ื‘ืขื™ื•ืช ืขืœ ื™ื“ื™ ืขื‘ื•ื“ื” ืขื ื”ื”ื’ื“ืจื•ืช. ืœื“ื•ื’ืžื”, ืœืขื•ืจืš ื”ื˜ืงืกื˜ ื”ืจื’ื™ืœ ืฉืœ GNOME Gedit ืื™ืŸ ืžืฆื‘ YAML, ืื‘ืœ ื›ื‘ืจื™ืจืช ืžื—ื“ืœ ื”ื•ื ืžื“ื’ื™ืฉ ืืช ืชื—ื‘ื™ืจ YAML ื•ืžืืคืฉืจ ืœืš ืœื”ื’ื“ื™ืจ ืขื‘ื•ื“ื” ืขื ื”ื–ื—ื”:

10 ืฆืขื“ื™ื ืœ-YAML Zen

ื”ื’ื“ืจืช ื›ื ื™ืกื•ืช ื‘ื’ื“ื™ืช.

ืชื•ืกืฃ ืžืจื—ื‘ื™ ืžืฉื™ื›ื” ืขื‘ื•ืจ Gedit, ืžืฆื™ื’ ืจื•ื•ื—ื™ื ื›ื ืงื•ื“ื•ืช, ืžื‘ื˜ืœ ืื™ ื‘ื”ื™ืจื•ืช ืขื ืจืžื•ืช ื”ื–ื—ื”.

ื‘ืžื™ืœื™ื ืื—ืจื•ืช, ื”ืงื“ื™ืฉื• ื–ืžืŸ ืœืœืžื™ื“ื” ืขืœ ื”ืขื•ืจืš ื”ืื”ื•ื‘ ืขืœื™ื›ื. ื’ืœื” ืžื” ื™ืฉ ืœื• ืื• ืœืงื”ื™ืœืช ื”ืคื™ืชื•ื— ืฉืœื• ืœื”ืฆื™ืข ืœืขื‘ื•ื“ื” ืขื YAML, ื•ื”ืฉืชืžืฉ ื‘ืชื›ื•ื ื•ืช ื”ืœืœื•. ืืชื” ื‘ื”ื—ืœื˜ ืœื ืชืฆื˜ืขืจ ืขืœ ื–ื”.

1. ื”ืฉืชืžืฉ ื‘ืœื™ื˜ืจ

ื‘ืื•ืคืŸ ืื™ื“ื™ืืœื™, ืฉืคื•ืช ืชื›ื ื•ืช ื•ืฉืคื•ืช ืกื™ืžื•ืŸ ืžืฉืชืžืฉื•ืช ื‘ืชื—ื‘ื™ืจ ืฆืคื•ื™. ืžื—ืฉื‘ื™ื ื˜ื•ื‘ื™ื ื‘ื—ื™ื–ื•ื™, ื•ื–ื• ื”ืกื™ื‘ื” ืฉื”ืžื•ืฉื’ ืฉืœ lintera. ืื ื‘-40 ืฉื ื•ืช ืงื™ื•ืžื• ื”ื•ื ื—ืœืฃ ืขืœ ืคื ื™ื›ื ื•ืืชื ืขื“ื™ื™ืŸ ืœื ืžืฉืชืžืฉื™ื ื‘-YAML linter, ืื– ื–ื” ื”ื–ืžืŸ ืœื ืกื•ืช ืืช yamllint.

ืœื”ืชืงื ื” ื™ืžืœื™ื ื˜ ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืžื ื”ืœ ื”ื—ื‘ื™ืœื•ืช ื”ืจื’ื™ืœ ืฉืœ ืœื™ื ื•ืงืก. ืœื“ื•ื’ืžื”, ื‘ Red Hat Enterprise ืœื™ื ื•ืงืก 8 ืื• ืคื“ื•ืจื” ื–ื” ื ืขืฉื” ื›ืš:

$ sudo dnf install yamllint

ืื– ืืชื” ืคืฉื•ื˜ ืžืคืขื™ืœ ืืช yamllint, ืžืขื‘ื™ืจ ืœื• ืืช ืงื•ื‘ืฅ ื”-YAML ื›ื“ื™ ืœื‘ื“ื•ืง. ื›ืš ื–ื” ื ืจืื” ืื โ€‹โ€‹ืืชื” ืžืขื‘ื™ืจ ืงื•ื‘ืฅ ืขื ืฉื’ื™ืื” ืœ-linter:

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

ื”ืžืกืคืจื™ื ืžืฉืžืืœ ื”ื ืœื ื”ื–ืžืŸ, ืืœื ื”ืงื•ืื•ืจื“ื™ื ื˜ื•ืช ืฉืœ ื”ืฉื’ื™ืื”: ืฉื•ืจื” ื•ืžืกืคืจ ืขืžื•ื“ื”. ืชื™ืื•ืจ ื”ืฉื’ื™ืื” ืื•ืœื™ ืœื ืื•ืžืจ ืœืš ื›ืœื•ื, ืื‘ืœ ืืชื” ื™ื•ื“ืข ื‘ื“ื™ื•ืง ื”ื™ื›ืŸ ื”ื™ื ื ืžืฆืืช. ืคืฉื•ื˜ ืชืกืชื›ืœ ืขืœ ื”ืžืงื•ื ื”ื–ื” ื‘ืงื•ื“, ื•ื›ื›ืœ ื”ื ืจืื” ื”ื›ืœ ื™ืชื‘ื”ืจ.

ื›ืืฉืจ yamllint ืœื ืžื•ืฆื ืฉื’ื™ืื•ืช ื‘ืงื•ื‘ืฅ, ืฉื•ื ื“ื‘ืจ ืœื ืžื•ื“ืคืก ืขืœ ื”ืžืกืš. ืื ืฉืงื˜ ื›ื–ื” ืžืคื—ื™ื“ ืื•ืชืš ื•ืืชื” ืจื•ืฆื” ืขื•ื“ ืงืฆืช ืคื™ื“ื‘ืง, ืื– ืืชื” ื™ื›ื•ืœ ืœื”ืคืขื™ืœ ืืช ื”-linter ืขื ืคืงื•ื“ืช ื”ื”ื“ ื”ืžื•ืชื ื™ืช ื‘ืืžืฆืขื•ืช ืืžืคืจืกื ื“ ื›ืคื•ืœ (&&), ื›ืš:

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

ื‘-POSIX, ืืžืคืจืกื ื“ ื›ืคื•ืœ ื ื“ืœืง ืื ื•ืจืง ืื ื”ืคืงื•ื“ื” ื”ืงื•ื“ืžืช ืžื—ื–ื™ืจื” 0. ื•-yamllint ืคืฉื•ื˜ ืžื—ื–ื™ืจ ืืช ืžืกืคืจ ื”ืฉื’ื™ืื•ืช ืฉื ืžืฆืื•, ื•ื–ื• ื”ืกื™ื‘ื” ืฉื›ืœ ื”ืžื‘ื ื” ื”ืžื•ืชื ื” ื”ื–ื” ืขื•ื‘ื“.

2. ื›ืชื•ื‘ ื‘-Python, ืœื ื‘-YAML

ืื YAML ื‘ืืžืช ืžืขืฆื‘ืŸ ืื•ืชืš, ืคืฉื•ื˜ ืืœ ืชื›ืชื•ื‘ ื‘ื•, ืคืฉื•ื˜ื• ื›ืžืฉืžืขื•. ืงื•ืจื” ืฉ-YAML ื”ื•ื ื”ืคื•ืจืžื˜ ื”ื™ื—ื™ื“ ืฉื”ืืคืœื™ืงืฆื™ื” ืžื‘ื™ื ื”. ืื‘ืœ ื’ื ื‘ืžืงืจื” ื–ื”, ืื™ืŸ ืฆื•ืจืš ืœื™ืฆื•ืจ ืงื•ื‘ืฅ YAML. ื›ืชื•ื‘ ืขืœ ืžื” ืฉืืชื” ืื•ื”ื‘ ื•ืื– ื”ืžืจื”. ืœื“ื•ื’ืžื”, ื™ืฉ ืกืคืจื™ื™ื” ืžืฆื•ื™ื ืช ืขื‘ื•ืจ Python pyyaml ื•ืฉืชื™ ืฉื™ื˜ื•ืช ื”ืžืจื”: ื”ืžืจื” ืขืฆืžื™ืช ื•ื”ืžืจื” ื‘ืืžืฆืขื•ืช ืกืงืจื™ืคื˜ื™ื.

ื”ืžืจื” ืขืฆืžื™ืช

ื‘ืžืงืจื” ื–ื”, ืงื•ื‘ืฅ ื”ื ืชื•ื ื™ื ื”ื•ื ื’ื ืกืงืจื™ืคื˜ 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, ืืชื” ื™ื›ื•ืœ ืœื”ืžื™ืจ YAML ืœ-JSON ืขื ืฉืชื™ ืคืงื•ื“ื•ืช ื‘ืœื‘ื“ ื‘ืžืขื˜ืคืช Python ื”ืื™ื ื˜ืจืืงื˜ื™ื‘ื™ืช. ื ื ื™ื— ืฉื™ืฉ ืœืš ืงื•ื‘ืฅ 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. Pseudo-configs

ื‘ืขืช ื›ืชื™ื‘ืช ืกืคืจ ืื• ืžืืžืจ, ืชืžื™ื“ ื›ื“ืื™ ืœืฉืจื˜ื˜ ืชื—ื™ืœื” ืžืชื•ื•ื” ืจืืฉื•ื ื™, ืœืคื—ื•ืช ื‘ืฆื•ืจื” ืฉืœ ืชื•ื›ืŸ ืขื ื™ื™ื ื™ื. ื–ื” ืื•ืชื• ื“ื‘ืจ ืขื YAML. ืกื‘ื™ืจ ืœื”ื ื™ื— ืฉื™ืฉ ืœืš ืžื•ืฉื’ ืื™ืœื• ื ืชื•ื ื™ื ืฆืจื™ื›ื™ื ืœื”ื™ื›ืชื‘ ื‘ืงื•ื‘ืฅ YAML, ืื‘ืœ ืืชื” ืœื ืžืžืฉ ืžื‘ื™ืŸ ืื™ืš ืœื—ื‘ืจ ืื•ืชื ืื—ื“ ืขื ื”ืฉื ื™. ืœื›ืŸ, ืœืคื ื™ ืคื™ืกื•ืœ YAML, ืฆื™ื™ืจ ืคืกืื•ื“ื•-ืงื•ื ืคื™ื’.

Pseudo-config ื“ื•ืžื” ืœืคืกืื•ื“ื•-ืงื•ื“, ืฉื‘ื• ืื™ื ืš ืฆืจื™ืš ืœื“ืื•ื’ ืœื’ื‘ื™ ืžื‘ื ื” ืื• ื”ื–ื—ื”, ื™ื—ืกื™ ื”ื•ืจื™ื ื•ื™ืœื“ื™ื, ื™ืจื•ืฉื” ื•ืงื™ื ื•ืŸ. ื–ื” ืื•ืชื• ื“ื‘ืจ ื›ืืŸ: ืืชื” ืžืฆื™ื™ืจ ืื™ื˜ืจืฆื™ื•ืช ืฉืœ ื”ื ืชื•ื ื™ื ื›ืฉื”ื ืขื•ืœื™ื ื‘ืจืืฉ ืฉืœืš.

10 ืฆืขื“ื™ื ืœ-YAML Zen

ืชืฆื•ืจืช ืคืกืื•ื“ื• ืฉืœ ืžืชื›ื ืชื™ื (ืžืจื˜ื™ืŸ ื•ื˜ื‘ื™ื˜ื”) ื•ื›ื™ืฉื•ืจื™ื”ื (ืฉืคื•ืช ืชื›ื ื•ืช: Python, Perl, Pascal ื•-Lisp, Fortran, Erlang, ื‘ื”ืชืืžื”).

ืœืื—ืจ ืฆื™ื•ืจ ืคืกืื•ื“ื•-ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ืขืœ ืคื™ืกืช ื ื™ื™ืจ, ื ืชื— ืื•ืชื” ื‘ื–ื”ื™ืจื•ืช ื•ืื ื”ื›ืœ ืชืงื™ืŸ, ืคืจืžื˜ ืื•ืชื” ื‘ืฆื•ืจื” ืฉืœ ืงื•ื‘ืฅ YAML ื—ื•ืงื™.

6. ื“ื™ืœืžืช ื”ื˜ืื‘ื™ื ืžื•ืœ ื”ื—ืœืœื™ื

ืชืฆื˜ืจืš ืœืคืชื•ืจ ืืช ื”ื“ื™ืœืžื” "ื˜ืื‘ื™ื ืื• ืจื•ื•ื—ื™ื?". ืœื ื‘ืžื•ื‘ืŸ ื”ื’ืœื•ื‘ืœื™, ืืœื ืจืง ื‘ืจืžืช ื”ืืจื’ื•ืŸ ืฉืœืš, ืื• ืœืคื—ื•ืช ืคืจื•ื™ืงื˜. ื–ื” ืœื ืžืฉื ื” ืื ื–ื” ื›ืจื•ืš ื‘ืฉื™ืžื•ืฉ ืœืื—ืจ ืขื™ื‘ื•ื“ ืขื ืกืงืจื™ืคื˜ sed, ื”ื’ื“ืจืช ืขื•ืจื›ื™ ื˜ืงืกื˜ ื‘ืžื›ื•ื ื•ืช ืฉืœ ืžืชื›ื ืชื™ื, ืื• ืงื‘ืœื” ืื•ื ื™ื‘ืจืกืœื™ืช ืขืœ ืฆื™ื•ืช ืงืคื“ื ื™ ืœื”ื•ืจืื•ืช ื”-linter ืชื—ืช ืื™ื•ื ื‘ืคื™ื˜ื•ืจื™ื, ืื‘ืœ ื›ืœ ื—ื‘ืจื™ ื”ืฆื•ื•ืช ืฉืœืš ืืฉืจ ื‘- ื›ืš ืื• ืื—ืจืช ื‘ื”ืชื™ื™ื—ืกื•ืช ืœ-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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”