ืืืื ื ืืืืืื ืืช Ansible, ืืื Ansible ืื YAML. ืืฉื ื ืคืืจืืืื ืจืืื ืืงืืืฆื ืชืฆืืจื: ืจืฉืืืืช ืขืจืืื, ืฆืืื ืคืจืืืจืื-ืขืจืืื, ืงืืฆื INI, YAML, JSON, XML ืืขืื ืจืืื ืืืจืื. ืขื ืืืช, ืืืื ืกืืืืช ืืืืื, YAML ื ืืฉืืช ืืจืื ืืงืฉื ืืืืืื. ืืคืจื, ืืืจืืช ืืืื ืืืืืื ืืืจืขื ื ืืืืืืืืช ืืืจืฉืืืืช ืฉืื ืืขืืืื ืขื ืขืจืืื ืืืจืจืืืื, ืชืืืืจ YAML ืืืื ืืืืืช ืืขืฆืื ืขื ืืืืฉื ืืืืืช ื-Python ืฉืื ืืืืื.
ืื YAML ืืขืฆืื ืืืชื, ืืชื ืืืื - ืืืืื ืื! - ืืฆืข ืืช 10 ืืฆืขืืื ืืืืื ืืื ืืืคืืืช ืืช ืืชืกืืื ืฉืื ืืจืื ืืงืืืืช ืืืืชืืื ื-YAML. ืืืื ืืจืฉืืื ืื, ืขืฉืจืช ืืขืฆืืช ืฉืื ื ืืกืคืจื ืืืคืก, ื ืืกืืฃ ืืืืืฆืื ืืชืจืืืืื ืจืืื ืืื ืืจืฆืื ื ื ๐
0. ืชืืจืื ืืขืืจื ืฉืื ืืขืืื
ืื ืื ืืฉื ื ืืืื ืขืืจื ืืงืกื ืืฉ ืื, ืื ืจืื ืฉืืฉ ืืคืืืช ืชืืกืฃ ืืื ืืขืืืื ืขื YAML. ืื ืืื ืื ืืื ืืื, ืืฆื ืืืชืงื ืืืชื ืืื. ืืื ืืืืคืืฉ ืืืืืืจื ืืฉืชืื ืคืขืืื ืจืืืช ืืื ืคืขื ืฉืชืฆืืจื ืืขืจืื ืืช YAML.
ืืืฉื, ืขืืจื
Emacs ืืืฆื YAML ืืืฆืืช ืจืืืืื.
ืื ืืขืืจื ืืืืขืืฃ ืขืืื ืืื ืืฆื YAML, ื ืืชื ืืคืชืืจ ืืืง ืืืืขืืืช ืขื ืืื ืขืืืื ืขื ืืืืืจืืช. ืืืืืื, ืืขืืจื ืืืงืกื ืืจืืื ืฉื GNOME Gedit ืืื ืืฆื YAML, ืืื ืืืจืืจืช ืืืื ืืื ืืืืืฉ ืืช ืชืืืืจ YAML ืืืืคืฉืจ ืื ืืืืืืจ ืขืืืื ืขื ืืืื:
ืืืืจืช ืื ืืกืืช ืืืืืช.
ืชืืกืฃ
ืืืืืื ืืืจืืช, ืืงืืืฉื ืืื ืืืืืื ืขื ืืขืืจื ืืืืื ืขืืืื. ืืื ืื ืืฉ ืื ืื ืืงืืืืช ืืคืืชืื ืฉืื ืืืฆืืข ืืขืืืื ืขื YAML, ืืืฉืชืืฉ ืืชืืื ืืช ืืืื. ืืชื ืืืืื ืื ืชืฆืืขืจ ืขื ืื.
1. ืืฉืชืืฉ ืืืืืจ
ืืืืคื ืืืืืืื, ืฉืคืืช ืชืื ืืช ืืฉืคืืช ืกืืืื ืืฉืชืืฉืืช ืืชืืืืจ ืฆืคืื. ืืืฉืืื ืืืืื ืืืืืื, ืืื ืืกืืื ืฉืืืืฉื ืฉื
ืืืชืงื ื
$ 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
ืืืจื ืขืฆืืืช
ืืืงืจื ืื, ืงืืืฅ ืื ืชืื ืื ืืื ืื ืกืงืจืืคื 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, ืืืืืื, ืืชื ืืืื ืืงืืช ืืืชื
{
"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 ืืืืจ ืืคืกืงื ืืจืืื, ืืืื ืืืงืจ
5. Pseudo-configs
ืืขืช ืืชืืืช ืกืคืจ ืื ืืืืจ, ืชืืื ืืืื ืืฉืจืื ืชืืืื ืืชืืื ืจืืฉืื ื, ืืคืืืช ืืฆืืจื ืฉื ืชืืื ืขื ืืื ืื. ืื ืืืชื ืืืจ ืขื YAML. ืกืืืจ ืืื ืื ืฉืืฉ ืื ืืืฉื ืืืื ื ืชืื ืื ืฆืจืืืื ืืืืืชื ืืงืืืฅ YAML, ืืื ืืชื ืื ืืืฉ ืืืื ืืื ืืืืจ ืืืชื ืืื ืขื ืืฉื ื. ืืื, ืืคื ื ืคืืกืื YAML, ืฆืืืจ ืคืกืืืื-ืงืื ืคืื.
Pseudo-config ืืืื ืืคืกืืืื-ืงืื, ืฉืื ืืื ื ืฆืจืื ืืืืื ืืืื ืืื ื ืื ืืืื, ืืืกื ืืืจืื ืืืืืื, ืืจืืฉื ืืงืื ืื. ืื ืืืชื ืืืจ ืืื: ืืชื ืืฆืืืจ ืืืืจืฆืืืช ืฉื ืื ืชืื ืื ืืฉืื ืขืืืื ืืจืืฉ ืฉืื.
ืชืฆืืจืช ืคืกืืืื ืฉื ืืชืื ืชืื (ืืจืืื ืืืืืื) ืืืืฉืืจืืื (ืฉืคืืช ืชืื ืืช: Python, Perl, Pascal ื-Lisp, Fortran, Erlang, ืืืชืืื).
ืืืืจ ืฆืืืจ ืคืกืืืื-ืงืื ืคืืืืจืฆืื ืขื ืคืืกืช ื ืืืจ, ื ืชื ืืืชื ืืืืืจืืช ืืื ืืื ืชืงืื, ืคืจืื ืืืชื ืืฆืืจื ืฉื ืงืืืฅ YAML ืืืงื.
6. ืืืืืช ืืืืืื ืืื ืืืืืื
ืชืฆืืจื ืืคืชืืจ ืืช ืืืืืื
ืืื ืขืืจื ืืงืกื ืจืืื, ืืชื ืืืื ืืืืืืจ ืืืืื ืืชืืงืื ืืืืืืื ืืืกืคืจ ืืืืืจ ืฉื ืจืืืืื, ืื ืฉืืจื ืฉื ืืกืืื ืืคืชื 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