10 langkah ke YAML Zen

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.

10 langkah ke YAML Zen

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 Atom menyokong YAML secara lalai, tetapi untuk GNU Emacs anda perlu memasang pakej tambahan, contohnya, mod yaml.

10 langkah ke YAML Zen

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:

10 langkah ke YAML Zen

Menetapkan inden dalam Gedit.

Satu pemalam ruang lukis untuk Gedit, memaparkan ruang sebagai titik, menghapuskan kekaburan dengan tahap lekukan.

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 lintera. Jika dalam 40 tahun kewujudannya ia telah berlalu dan anda masih tidak menggunakan linter YAML, maka sudah tiba masanya untuk mencuba yamllint.

Pasang yamllint Anda boleh menggunakan pengurus pakej Linux standard. Contohnya, dalam Red Hat Enterprise Linux 8 atau Fedora ia dilakukan seperti ini:

$ 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 pyyaml dan dua kaedah penukaran: penukaran diri dan penukaran melalui skrip.

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 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"
			}
		  }
		}
	  }
	}

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 yaml.org dan baca semula spesifikasi (spesifikasi). Jika anda menghadapi masalah dengan YAML, tetapi belum mencapai spesifikasi, maka sudah tiba masanya untuk membetulkan keadaan ini. Spesifikasinya sangat mudah untuk ditulis, dan keperluan sintaks digambarkan dengan sejumlah besar contoh dalam Bahagian 6.

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.

10 langkah ke YAML Zen

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 β€œtab atau ruang?”. Bukan dalam erti kata global, tetapi hanya pada peringkat organisasi anda, atau sekurang-kurangnya projek. Tidak kira sama ada ini melibatkan penggunaan pasca pemprosesan dengan skrip sed, menyediakan editor teks pada mesin pengaturcara atau secara universal mengambil resit pematuhan ketat terhadap arahan linter di bawah ancaman pemecatan, tetapi semua ahli pasukan anda yang dalam satu cara atau yang lain berkaitan dengan YAML mesti menggunakan hanya ruang (seperti yang dikehendaki oleh spesifikasi YAML).

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 Dokumentasi yang boleh dipercayai:

# 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

Tambah komen