誰ãã Ansible ãæããŠããŸãããAnsible 㯠YAML ã§ãã æ§æãã¡ã€ã«ã«ã¯ãå€ã®ãªã¹ãããã©ã¡ãŒã¿ãŒãšå€ã®ãã¢ãINI ãã¡ã€ã«ãYAMLãJSONãXML ãªã©ãããŸããŸãªåœ¢åŒããããŸãã ãã ããããã€ãã®çç±ãããYAML ã¯ãã®äžã§ãç¹ã«é£ãããšèããããããšããããããŸãã ç¹ã«ãYAML æ§æã¯ããã®æ°é®®ãªããããªãºã ãšéå±€å€ãæäœããåªããæ©èœã«ãããããããã€ã³ãã³ãã«å¯Ÿãã Python ã®ãããªã¢ãããŒããç ©ãããå ŽåããããŸãã
YAML ãè
¹ç«ãããå Žåã¯ãããããããšãã§ããŸããããããã¹ãã§ãã â 次㮠10 ã®ã¹ããããå®è¡ããŠãã€ã©ã€ã©ã蚱容ã§ããã¬ãã«ãŸã§è»œæžããYAML ã奜ãã«ãªã£ãŠãã ããã ãã®ãªã¹ãã«ãµãããããç§ãã¡ã® XNUMX ã®ãã³ãã«ã¯ãŒãããçªå·ãä»ããããçæ³ãã¹ããªãã¥ã¢ã«ãªå®è·µãèªç±ã«è¿œå ããŠãããŸã ð
0. ãšãã£ã¿ãæ©èœããã
ã©ã®ãããªããã¹ã ãšãã£ã¿ãŒã䜿çšããŠãããã¯é¢ä¿ãããŸãããYAML ãæäœããããã®ãã©ã°ã€ã³ãå°ãªããšã XNUMX ã€ã¯ããã¯ãã§ãã ãæã¡ã§ãªãå Žåã¯ãããã«èŠã€ããŠã€ã³ã¹ããŒã«ããŠãã ããã æ€çŽ¢ãšèšå®ã«è²»ããæéã¯ãYAML ãç·šéãããã³ã«äœåã«ããªããŸãã
ããšãã°ãç·šéè
YAML ã¢ãŒãã® Emacs ãšã¹ããŒã¹ã®è¡šç€ºã
ãæ°ã«å ¥ãã®ãšãã£ã¿ãŒã« YAML ã¢ãŒãããªãå Žåã¯ãèšå®ãæäœããããšã§åé¡ã®äžéšã解決ã§ããŸãã ããšãã°ãæšæºã® GNOME ããã¹ã ãšãã£ã¿ãŒã§ãã Gedit ã«ã¯ YAML ã¢ãŒãããããŸããããããã©ã«ãã§ã¯ YAML æ§æã匷調衚瀺ãããã€ã³ãã³ãã䜿çšããäœæ¥ãèšå®ã§ããŸãã
Gedit ã§ã€ã³ãã³ããèšå®ããŸãã
ãã©ã°ã€ã³
èšãæããã°ããæ°ã«å ¥ãã®ãšãã£ã¿ã«ã€ããŠåŠã¶ããšã«æéãè²»ãããŠãã ããã 圌ãŸãã¯åœŒã®éçºã³ãã¥ããã£ã YAML ãæäœããããã«æäŸããŠãããã®ã調ã¹ãŠããããã®æ©èœã䜿çšããŠãã ããã 絶察ã«åŸââæããªãã§ãããã
1. ãªã³ã¿ãŒã䜿çšãã
çæ³çã«ã¯ãããã°ã©ãã³ã°èšèªãšããŒã¯ã¢ããèšèªã¯äºæž¬å¯èœãªæ§æã䜿çšããŸãã ã³ã³ãã¥ãŒã¿ãŒã¯äºæž¬å¯èœæ§ã«åªããŠããããã
ã€ã³ã¹ããŒã«
$ 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)
å·ŠåŽã®æ°åã¯æéã§ã¯ãªãããšã©ãŒã®åº§æšãã€ãŸãè¡çªå·ãšåçªå·ã§ãã ãšã©ãŒã®èª¬æããã¯äœãåãããªããããããŸãããããšã©ãŒãã©ãã«ããã®ãã¯æ£ç¢ºã«ããããŸãã ã³ãŒãå ã®ãã®å Žæã確èªããã ãã§ããããããã¹ãŠãæããã«ãªãã§ãããã
yamllint ããã¡ã€ã«å ã«ãšã©ãŒãæ€åºããªãå Žåãç»é¢ã«ã¯äœã衚瀺ãããŸããã ãã®ãããªæ²é»ãæããŠãããå°ããã£ãŒãããã¯ãå¿ èŠãªå Žåã¯ã次ã®ããã«ãXNUMX ã€ã®ã¢ã³ããµã³ã (&&) ã䜿çšããŠæ¡ä»¶ä»ããšã³ãŒ ã³ãã³ãã䜿çšããŠãªã³ã¿ãŒãå®è¡ã§ããŸãã
$ yamllint perfect.yaml && echo "OK"
OK
POSIX ã§ã¯ãåã®ã³ãã³ãã 0 ãè¿ããå Žåã«éããäºéã¢ã³ããµã³ããèµ·åãããŸãããããŠãyamllint ã¯èŠã€ãã£ããšã©ãŒã®æ°ãè¿ãã ãã§ãããããããã®æ¡ä»¶æ§æå šäœãæ©èœããçç±ã§ãã
2. YAML ã§ã¯ãªã Python ã§æžã
YAML ãæ¬åœã«è
¹ç«ãããå Žåã¯ãæåéããYAML ã«æžã蟌ãŸãªãã§ãã ããã ã¢ããªã±ãŒã·ã§ã³ãç解ã§ããå¯äžã®åœ¢åŒã YAML ã§ããå ŽåããããŸãã ãã ãããã®å Žåã§ã YAML ãã¡ã€ã«ãäœæããå¿
èŠã¯ãããŸããã 奜ããªãã®ãæžããŠå€æããŸãã ããšãã°ãPython ã«ã¯åªããã©ã€ãã©ãªããããŸãã
èªå·±å€æ
ãã®å ŽåãããŒã¿ ãã¡ã€ã«ã¯ YAML ãçæãã Python ã¹ã¯ãªããã§ããããŸãã ãã®æ¹æ³ã¯ãå°èŠæš¡ãªããŒã¿ ã»ããã«æé©ã§ãã JSON ããŒã¿ã Python å€æ°ã«æžã蟌ã¿ãã€ã³ããŒã ãã£ã¬ã¯ãã£ããå é ã«çœ®ãããã¡ã€ã«ã®æåŸã«åºåãå®è£ ãã XNUMX è¡ãè¿œå ããã ãã§ãã
#!/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 ã®æäœã«æ £ããŠããå Žåã¯ã察話å Python ã·ã§ã«ã§ XNUMX ã€ã®ã³ãã³ããå®è¡ããã ã㧠YAML ã JSON ã«å€æã§ããŸãã 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. ç䌌æ§æ
æ¬ãèšäºãæžããšãã¯ãæåã«å°ãªããšãç®æ¬¡ã®åœ¢åŒã§äºåçãªæŠèŠãã¹ã±ãããããšåžžã«åœ¹ã«ç«ã¡ãŸãã YAMLãåæ§ã§ãã ãããããã©ã®ããŒã¿ã YAML ãã¡ã€ã«ã«æžã蟌ãå¿ èŠããããã«ã€ããŠã¯ç解ããŠããŸããããããçžäºã«æ¥ç¶ããæ¹æ³ã¯ããç解ããŠããŸããã ãããã£ãŠãYAML ãã¹ã«ã«ããããåã«ãç䌌ã³ã³ãã£ã°ãæç»ããŸãã
æ¬äŒŒæ§æã¯æ¬äŒŒã³ãŒãã«äŒŒãŠãããæ§é ãã€ã³ãã³ãã芪åé¢ä¿ãç¶æ¿ããã¹ãã«ã€ããŠå¿é ããå¿ èŠããããŸããã ããã§ãåãã§ããé ã®äžã§ããŒã¿ãçºçãããã³ã«ãããŒã¿ã®å埩ãæç»ããŸãã
ããã°ã©ã㌠(Martin ãš Tabitha) ãšãã®ã¹ãã« (ããã°ã©ãã³ã°èšèª: ãããã PythonãPerlãPascalãLispãFortranãErlang) ããªã¹ãããç䌌æ§æã
çŽã«ç䌌æ§æãæç»ããåŸãããã泚ææ·±ãåæãããã¹ãŠãæ£åžžã§ããã°ãæå¹ãª YAML ãã¡ã€ã«ã®åœ¢åŒã«ãã©ãŒãããããŸãã
6. ã¿ããšã¹ããŒã¹ã®ãžã¬ã³ã
ãžã¬ã³ãã解決ããªããã°ãªããŸãã
éåžžã®ããã¹ã ãšãã£ã¿ã§ã¯ãã¿ããæå®ããæ°ã®ã¹ããŒã¹ã«èªåä¿®æ£ããããã«èšå®ã§ãããããäž»èŠãªæ¯æè ã®åéãèµ·ãããŸãã ã¿ã æããå¿ èŠã¯ãããŸããã
YAML å«ãã®äººãªã誰ã§ãããç¥ã£ãŠããããã«ãç»é¢äžã§ã¯ã¿ããšã¹ããŒã¹ã®éããããããŸããã ãããŠãäœããç®ã«èŠããªããšããããã¯éåžžãä»ã®èããããåé¡ããã¹ãŠæŽçãã確èªããæé€ããåŸãæåŸã«èŠããŠããããšã«ãªããŸãã éèšæ²ç·ãã¹ããŒã¹ã®ãããã¯ãæ€çŽ¢ããã®ã« XNUMX æéãè²»ãããå Žåãã©ã¡ããã®äœ¿çšã«é¢ããããªã·ãŒãæ©æ¥ã«äœæããããã«åŸã£ãŠãããã©ããéçã³ã³ã¯ãªãŒãã®ãã§ãã¯ãå®è£ ããå¿ èŠãããããšãå«ã°ããã ãã§ã (ããšãã°ããªã³ã¿ãŒã匷å¶çã«ééãããããã® 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 ã«å¯Ÿããå«ããå®å
šã«å
æããŠãã ããã
åºæïŒ habr.com