Nou tout renmen Ansible, men Ansible se YAML. Gen anpil fòma pou fichye konfigirasyon: lis valè, pè paramèt-valè, fichye INI, YAML, JSON, XML ak anpil lòt. Sepandan, pou plizyè rezon nan tout nan yo, YAML souvan konsidere kòm patikilyèman difisil. An patikilye, malgre minimalist entérésan li yo ak kapasite enpresyonan pou travay ak valè yerarchize, sentaks YAML a ka anmèdan ak apwòch Python li yo nan endentasyon.
Si YAML fache ou, ou kapab—e ou ta dwe! – Pran 10 etap sa yo pou redwi fristrasyon ou nan yon nivo akseptab epi tonbe damou ak YAML. Jan sa apwopriye pou lis sa a, dis konsèy nou yo pral konte apati de grafouyen, nou pral ajoute meditasyon ak pratik espirityèl nan volonte 😉
0. Fè editè ou travay
Li pa enpòtan ki editè tèks ou genyen, pwobableman gen omwen yon plugin pou travay ak YAML. Si ou pa gen youn, jwenn epi enstale li imedyatman. Tan ki pase pou chèche ak mete kanpe ap peye anpil fwa sou chak fwa ou oblije modifye YAML.
Pou egzanp, editè
Emacs nan mòd YAML ak ekspozisyon espas.
Si editè pi renmen ou a pa gen yon mòd YAML, Lè sa a, kèk nan pwoblèm yo ka rezoud pa travay ak anviwònman yo. Pou egzanp, estanda editè tèks GNOME Gedit la pa gen yon mòd YAML, men pa default li mete aksan sou sentaks YAML epi li pèmèt ou konfigirasyon travay ak endentasyon:
Mete endentasyon nan Gedit.
Yon plugin
Nan lòt mo, pase tan aprann sou editè pi renmen ou. Chèche konnen kisa li oswa kominote devlopman li gen pou l ofri pou travay ak YAML, epi sèvi ak karakteristik sa yo. Ou definitivman pa pral regrèt li.
1. Sèvi ak yon linter
Idealman, langaj pwogramasyon ak langaj maketing itilize sentaks previzib. Òdinatè yo bon nan previzibilite, ki se poukisa konsèp nan
Enstale
$ sudo dnf install yamllint
Lè sa a, ou tou senpleman kouri yamllint, pase li dosye a YAML yo tcheke. Men sa li sanble si ou pase yon dosye ki gen yon erè nan linter la:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 error syntax error: mapping values are not allowed here
23:11 error trailing spaces (trailing-spaces)
Nimewo yo sou bò gòch la se pa tan an, men kowòdone yo nan erè a: nimewo ranje ak kolòn. Deskripsyon erè a ka pa di ou anyen, men ou konnen egzakteman ki kote li ye. Jis gade kote sa a nan kòd la, epi gen plis chans tout bagay pral vin klè.
Lè yamllint pa jwenn okenn erè nan yon dosye, pa gen anyen ki enprime sou ekran an. Si silans sa yo fè ou pè epi ou vle yon ti kras plis fidbak, Lè sa a, ou ka kouri linter la ak kòmandman eko kondisyonèl la atravè yon doub ampersand (&&), tankou sa a:
$ yamllint perfect.yaml && echo "OK"
OK
Nan POSIX, yon doub ampersand dife si epi sèlman si kòmandman anvan an retounen 0. Ak yamllint jis retounen kantite erè yo jwenn, ki se poukisa tout konstriksyon kondisyonèl sa a ap travay.
2. Ekri nan Python, pa YAML
Si YAML vrèman fè w fache, jis pa ekri ladan l, literalman. Sa rive ke YAML se fòma a sèlman ke aplikasyon an konprann. Men, menm nan ka sa a, li pa nesesè yo kreye yon dosye YAML. Ekri sou sa ou renmen epi konvèti. Pou egzanp, gen yon bibliyotèk gwo pou Python
Oto-konvèsyon
Nan ka sa a, dosye done a se tou yon script Python ki jenere YAML. Metòd sa a pi byen adapte pou ti seri done. Ou senpleman ekri done JSON yo nan yon varyab Python, prefas li ak yon direktiv enpòte, epi nan fen fichye a ajoute twa liy pou aplike pwodiksyon an.
#!/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
Koulye a, nou kouri dosye sa a nan Python epi jwenn dosye a 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
Sa a se parfe valab YAML, men yamllint pral avèti ou ke li pa kòmanse ak -. Oke, sa a ka fasil korije manyèlman oswa yon ti kras modifye nan script la Python.
Konvèsyon atravè scripts
Nan ka sa a, nou premye ekri nan JSON, ak Lè sa a, kouri konvètisè a kòm yon script Python separe, ki pwodui YAML kòm pwodiksyon. Konpare ak metòd anvan an, metòd sa a balanse pi byen, depi konvèsyon an separe de done yo.
Premyèman, se pou yo kreye yon dosye JSON example.json, pou egzanp, ou ka pran li nan
{
"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"
}
}
}
}
}
Lè sa a, nou pral kreye yon script konvètisè senp epi sove li anba non json2yaml.py. Script sa a enpòte tou de modil YAML ak JSON Python, epi chaje yon fichye JSON itilizatè a espesifye, fè konvèsyon an, epi ekri done yo nan fichye output.yaml la.
#!/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()
Sove script sa a nan chemen sistèm lan epi kouri li jan sa nesesè:
$ ~/bin/json2yaml.py example.json
3. Analyse anpil e souvan
Pafwa li itil pou gade yon pwoblèm nan yon ang diferan. Si w gen pwoblèm pou reprezante relasyon ki genyen ant done ou yo nan YAML, ou ka tanporèman transfòme li nan yon bagay ki pi abitye.
Pou egzanp, si w konfòtab travay ak lis diksyonè oswa JSON, ou ka konvèti YAML an JSON ak jis de kòmandman nan koki Python entèaktif la. Ann di ou gen yon fichye YAML mydata.yaml, Lè sa a, men sa li ta sanble:
$ 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.'}
Ou ka jwenn anpil lòt egzanp sou sijè sa a. Anplis de sa, gen anpil konvètisè sou entènèt ak analizeur lokal ki disponib. Se konsa, pa ezite reformate done yo lè ou wè sèlman yon melanj enkonpreyansib nan li.
4. Li espesifikasyon yo
Retounen nan YAML apre yon ti repo, li itil pou vizite
5. Pseudo-configs
Lè w ap ekri yon liv oswa yon atik, li toujou itil pou premye trase yon deskripsyon preliminè, omwen nan fòm yon tablo de matyè. Se menm jan ak YAML. Gen plis chans, ou gen yon lide sou ki done yo dwe ekri nan yon dosye YAML, men ou pa reyèlman konprann ki jan yo konekte li youn ak lòt. Se poutèt sa, anvan skultur YAML, trase yon pseudo-config.
Pseudo-config se menm jan ak pseudo-kod, kote ou pa bezwen enkyete sou estrikti oswa endentasyon, relasyon paran-pitit, eritaj ak nidifikasyon. Se menm bagay la tou isit la: ou trase iterasyon nan done yo jan yo leve nan tèt ou.
Pseudo-config pwogramasyon lis (Martin ak Tabitha) ak konpetans yo (langaj pwogramasyon: Python, Perl, Pascal ak Lisp, Fortran, Erlang, respektivman).
Apre trase yon pseudo-config sou yon moso papye, ak anpil atansyon analize li epi, si tout bagay an lòd, fòma li nan fòm lan nan yon dosye YAML ki valab.
6. Dilèm Onglets yo vs Espas yo
Ou pral oblije rezoud dilèm la
Nan nenpòt editè tèks nòmal, ou ka configured onglet oto-kòrèk nan yon kantite espas espesifik, kidonk rebelyon aderan kle yo. Tab ou pa bezwen pè.
Kòm chak rayi YAML konnen byen, ou pa ka wè diferans ki genyen ant onglè ak espas sou ekran an. Men, lè yon bagay pa vizib, se nòmalman dènye bagay moun sonje, apre yo fin regle, tcheke ak elimine tout lòt pwoblèm posib. Yon èdtan tan pase pou chèche yon koub tabilasyon oswa yon blòk espas tou senpleman rele ke ou bezwen ijan pou kreye yon politik pou itilize youn oswa lòt, epi answit aplike yon chèk konkrè ranfòse pou konfòmite avèk li (pa egzanp, atravè yon zen Git pou fòse li nan yon linter).
7. Mwens se plis (oswa plis se mwens)
Gen kèk moun ki renmen ekri nan YAML paske li mete aksan sou estrikti. An menm tan an, yo aktivman itilize indentation pou mete aksan sou blòk done yo. Sa a se yon kalite tronpe pou imite langaj maketing ki itilize delimiter eksplisit.
Isit la se yon egzanp estrikti sa yo soti nan
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
Pou kèk moun, opsyon sa a ede yo regle estrikti YAML nan tèt yo; pou lòt moun, okontrè, li irite yo ak anpil ti kras ki pa nesesè, nan opinyon yo.
Men, si ou se pwopriyetè dokiman YAML la epi ou responsab pou kenbe li, lè sa a ou menm ak ou sèlman dwe defini kijan pou itilize endentasyon. Si ou anbete pa gwo padding, kenbe li nan minimòm posib dapre spesifikasyon YAML la. Pou egzanp, dosye ki anwo a ki soti nan dokiman Ansible a ka reekri tankou sa a san okenn pèt:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Sèvi ak espas vid yo
Si ou toujou ap repete menm erè yo lè w ranpli yon dosye YAML, li fè sans pou mete yon modèl nan li kòm yon kòmantè. Lè sa a, pwochen fwa ou ka senpleman kopye modèl sa a epi antre done reyèl la, pou egzanp:
---
# - <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. Sèvi ak yon bagay diferan
Si aplikasyon an pa gen yon trangle sou ou, Lè sa a, li ta ka vo chanje YAML a nan yon fòma diferan. Apre yon tan, fichye konfigirasyon yo ka depase tèt yo ak Lè sa a, li pi bon konvèti yo nan scripts senp nan Lua oswa Python.
YAML se yon gwo bagay ke anpil moun renmen pou minimalist li yo ak senplisite, men li se lwen sèlman zouti nan asenal ou. Se konsa, pafwa ou ka refize li. Bibliyotèk analiz yo fasil pou jwenn pou YAML, kidonk si ou ofri opsyon migrasyon fasil, itilizatè ou yo pral siviv echèk sa a relativman san doulè.
Si ou pa ka fè san YAML, Lè sa a, pran 10 konsèy sa yo epi simonte pa renmen YAML yon fwa pou tout!
Sous: www.habr.com