Kita semua suka Ansible, tetapi Ansible ialah YAML. Terdapat banyak format untuk fail konfigurasi: senarai nilai, pasangan nilai parameter, fail INI, YAML, JSON, XML dan banyak lagi. Walau bagaimanapun, atas beberapa sebab daripada kesemuanya, YAML sering dianggap amat sukar. Khususnya, walaupun minimalisme yang menyegarkan dan keupayaan mengagumkan untuk bekerja dengan nilai hierarki, sintaks YAML boleh menjengkelkan dengan pendekatan seperti Python untuk lekukan.
Jika YAML marahkan anda, anda bolehβdan sepatutnya! β ambil 10 langkah berikut untuk mengurangkan kekecewaan anda ke tahap yang boleh diterima dan jatuh cinta dengan YAML. Sesuai dengan senarai ini, sepuluh petua kami akan dinomborkan dari awal, kami akan menambah meditasi dan amalan rohani sesuka hati π
0. Jadikan editor anda berfungsi
Tidak kira apa editor teks yang anda miliki, mungkin terdapat sekurang-kurangnya satu pemalam untuk bekerja dengan YAML. Jika anda tidak mempunyainya, cari dan pasang dengan segera. Masa yang diluangkan untuk mencari dan menyediakan akan berbaloi berkali-kali setiap kali anda perlu mengedit YAML.
Contohnya, editor
Emacs dalam mod YAML dan memaparkan ruang.
Jika editor kegemaran anda tidak mempunyai mod YAML, maka beberapa masalah boleh diselesaikan dengan bekerja dengan tetapan. Sebagai contoh, editor teks GNOME standard Gedit tidak mempunyai mod YAML, tetapi secara lalai ia menyerlahkan sintaks YAML dan membolehkan anda mengkonfigurasi kerja dengan lekukan:
Menetapkan inden dalam Gedit.
Satu pemalam
Dengan kata lain, luangkan masa belajar tentang editor kegemaran anda. Ketahui perkara yang dia atau komuniti pembangunannya tawarkan untuk bekerja dengan YAML dan gunakan ciri tersebut. Anda pasti tidak akan menyesal.
1. Gunakan linter
Sebaik-baiknya, bahasa pengaturcaraan dan bahasa markup menggunakan sintaks yang boleh diramal. Komputer pandai meramal, itulah sebabnya konsep
Pasang
$ sudo dnf install yamllint
Kemudian anda hanya menjalankan yamllint, menghantar fail YAML untuk diperiksa. Beginilah rupanya jika anda menghantar fail dengan ralat ke linter:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 error syntax error: mapping values are not allowed here
23:11 error trailing spaces (trailing-spaces)
Nombor di sebelah kiri bukanlah masa, tetapi koordinat ralat: nombor baris dan lajur. Perihalan ralat mungkin tidak memberitahu anda apa-apa, tetapi anda tahu di mana ia berada. Lihat sahaja tempat ini dalam kod, dan kemungkinan besar semuanya akan menjadi jelas.
Apabila yamllint tidak menemui ralat dalam fail, tiada apa yang dicetak ke skrin. Jika kesunyian sedemikian menakutkan anda dan anda mahukan sedikit lagi maklum balas, maka anda boleh menjalankan linter dengan arahan gema bersyarat melalui ampersand berganda (&&), seperti ini:
$ yamllint perfect.yaml && echo "OK"
OK
Dalam POSIX, ampersand berganda menyala jika dan hanya jika arahan sebelumnya mengembalikan 0. Dan yamllint hanya mengembalikan bilangan ralat yang ditemui, itulah sebabnya keseluruhan binaan bersyarat ini berfungsi.
2. Tulis dalam Python, bukan YAML
Jika YAML benar-benar marahkan anda, cuma jangan tulis di dalamnya, secara literal. Ia berlaku bahawa YAML adalah satu-satunya format yang difahami oleh aplikasi. Tetapi dalam kes ini, tidak perlu mencipta fail YAML. Tulis pada apa yang anda suka dan kemudian tukar. Sebagai contoh, terdapat perpustakaan yang hebat untuk Python
Penukaran diri
Dalam kes ini, fail data juga merupakan skrip Python yang menjana YAML. Kaedah ini paling sesuai untuk set data kecil. Anda hanya menulis data JSON ke dalam pembolehubah Python, prakatakannya dengan arahan import, dan pada akhir fail tambahkan tiga baris untuk melaksanakan output.
#!/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
Sekarang kita jalankan fail ini dalam Python dan dapatkan fail 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
Ini adalah YAML yang sah, tetapi yamllint akan memberi amaran kepada anda bahawa ia tidak bermula dengan -. Nah, ini boleh dengan mudah diperbetulkan secara manual atau sedikit diubah suai dalam skrip Python.
Penukaran melalui skrip
Dalam kes ini, kita mula-mula menulis dalam JSON, dan kemudian menjalankan penukar sebagai skrip Python yang berasingan, yang menghasilkan YAML sebagai output. Berbanding dengan kaedah sebelumnya, kaedah ini berskala lebih baik, kerana penukaran adalah berasingan daripada data.
Mula-mula, mari buat fail JSON example.json, sebagai contoh, anda boleh mengambilnya
{
"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"
}
}
}
}
}
Kemudian kami akan mencipta skrip penukar mudah dan menyimpannya di bawah nama json2yaml.py. Skrip ini mengimport kedua-dua modul Python YAML dan JSON, dan memuatkan fail JSON yang ditentukan pengguna, melakukan penukaran dan menulis data ke 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()
Simpan skrip ini dalam laluan sistem dan jalankannya seperti yang diperlukan:
$ ~/bin/json2yaml.py example.json
3. Menghuraikan dengan banyak dan kerap
Kadang-kadang ia berguna untuk melihat masalah dari sudut yang berbeza. Jika anda menghadapi masalah untuk mewakili perhubungan antara data anda dalam YAML, anda boleh mengubahnya buat sementara waktu menjadi sesuatu yang lebih biasa.
Contohnya, jika anda selesa menggunakan senarai kamus atau JSON, anda boleh menukar YAML kepada JSON dengan hanya dua arahan dalam shell Python interaktif. Katakan anda mempunyai fail YAML mydata.yaml, maka beginilah rupanya:
$ 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.'}
Anda boleh menemui banyak contoh lain mengenai topik ini. Di samping itu, terdapat banyak penukar dalam talian dan penghurai tempatan tersedia. Oleh itu, jangan teragak-agak untuk memformat semula data apabila anda melihat hanya kekusutan yang tidak dapat difahami di dalamnya.
4. Baca spesifikasi
Kembali ke YAML selepas berehat panjang, adalah berguna untuk melawat
5. Pseudo-configs
Apabila menulis buku atau artikel, ia sentiasa berguna untuk mula-mula melakar rangka awal, sekurang-kurangnya dalam bentuk jadual kandungan. Ia sama dengan YAML. Kemungkinan besar, anda mempunyai idea tentang data yang perlu ditulis ke dalam fail YAML, tetapi anda tidak benar-benar memahami cara menyambungkannya antara satu sama lain. Oleh itu, sebelum memahat YAML, lukis pseudo-config.
Pseudo-config adalah serupa dengan pseudo-code, di mana anda tidak perlu risau tentang struktur atau lekukan, hubungan ibu bapa-anak, pewarisan dan sarang. Perkara yang sama di sini: anda melukis lelaran data apabila ia timbul dalam kepala anda.
Pengaturcara penyenaraian pseudo-config (Martin dan Tabitha) dan kemahiran mereka (bahasa pengaturcaraan: Python, Perl, Pascal dan Lisp, Fortran, Erlang, masing-masing).
Selepas melukis konfigurasi pseudo pada sekeping kertas, analisanya dengan teliti dan, jika semuanya teratur, formatkannya dalam bentuk fail YAML yang sah.
6. Dilema Tab vs. Spaces
Anda perlu menyelesaikan dilema
Dalam mana-mana editor teks biasa, anda boleh mengkonfigurasi tab auto-pembetulan kepada bilangan ruang tertentu, jadi pemberontakan penganut utama Tab anda tidak perlu takut.
Seperti yang diketahui oleh setiap pembenci YAML, anda tidak dapat melihat perbezaan antara tab dan ruang pada skrin. Dan apabila sesuatu tidak kelihatan, ia biasanya perkara terakhir yang orang ingat, selepas mereka menyelesaikan, menyemak dan menghapuskan semua masalah lain yang mungkin. Satu jam masa yang dihabiskan untuk mencari lengkung penjadualan atau blok ruang hanya menjerit bahawa anda perlu segera membuat dasar untuk penggunaan satu atau yang lain, dan kemudian melaksanakan pemeriksaan konkrit bertetulang untuk pematuhannya (contohnya, melalui cangkuk Git untuk memaksanya melalui linter).
7. Kurang adalah lebih (atau lebih adalah kurang)
Sesetengah orang suka menulis dalam YAML kerana ia menekankan struktur. Pada masa yang sama, mereka secara aktif menggunakan lekukan untuk menyerlahkan blok data. Ini adalah sejenis penipuan untuk meniru bahasa penanda yang menggunakan pembatas eksplisit.
Berikut adalah contoh struktur sedemikian dari
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
Bagi sesetengah orang, pilihan ini membantu mereka menyusun struktur YAML dalam kepala mereka; bagi yang lain, sebaliknya, ia menjengkelkan mereka dengan banyak inden yang tidak perlu, pada pendapat mereka.
Tetapi jika anda adalah pemilik dokumen YAML dan bertanggungjawab untuk mengekalkannya, maka awak dan hanya awak mesti menentukan cara menggunakan lekukan. Jika anda terganggu dengan pelapik besar, pastikan ia pada tahap minimum yang mungkin mengikut spesifikasi YAML. Sebagai contoh, fail di atas daripada dokumentasi Ansible boleh ditulis semula seperti ini tanpa sebarang kerugian:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Gunakan tempat kosong
Jika anda sentiasa mengulangi kesilapan yang sama semasa mengisi fail YAML, masuk akal untuk memasukkan templat ke dalamnya sebagai ulasan. Kemudian lain kali anda boleh menyalin templat ini dan masukkan data sebenar di sana, sebagai contoh:
---
# - <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. Gunakan sesuatu yang berbeza
Jika aplikasi tidak mempunyai cengkaman pada anda, maka ia mungkin berbaloi untuk menukar YAML kepada format yang berbeza. Dari masa ke masa, fail konfigurasi boleh membesar sendiri dan kemudian adalah lebih baik untuk menukarnya kepada skrip mudah dalam Lua atau Python.
YAML ialah perkara hebat yang disukai ramai orang kerana minimalisme dan kesederhanaannya, tetapi ia jauh daripada satu-satunya alat dalam senjata anda. Jadi kadang-kadang anda boleh menolaknya. Menghuraikan perpustakaan mudah dicari untuk YAML, jadi jika anda menawarkan pilihan penghijrahan yang mudah, pengguna anda akan bertahan dengan kegagalan ini secara relatif tanpa rasa sakit.
Jika anda tidak boleh melakukannya tanpa YAML, kemudian ambil 10 petua ini dan atasi ketidaksukaan anda terhadap YAML sekali dan untuk semua!
Sumber: www.habr.com