Hepimiz Ansible'ı seviyoruz ama Ansible YAML'dir. Yapılandırma dosyaları için birçok format vardır: değer listeleri, parametre-değer çiftleri, INI dosyaları, YAML, JSON, XML ve diğerleri. Ancak tüm bunların arasında çeşitli nedenlerden dolayı YAML'nin genellikle özellikle zor olduğu düşünülmektedir. Özellikle, canlandırıcı minimalizmine ve hiyerarşik değerlerle çalışma konusundaki etkileyici yeteneklerine rağmen, YAML sözdizimi, girintiye yönelik Python benzeri yaklaşımı nedeniyle can sıkıcı olabilir.
YAML seni sinirlendiriyorsa yapabilirsin ve yapmalısın! – Hayal kırıklığınızı kabul edilebilir bir seviyeye indirmek ve YAML'a aşık olmak için aşağıdaki 10 adımı izleyin. Bu listeye yakışır şekilde on ipucumuz sıfırdan numaralandırılacak, isteğe göre meditasyon ve manevi uygulamaları da ekleyeceğiz 😉
0. Düzenleyicinizin çalışmasını sağlayın
Hangi metin düzenleyiciye sahip olduğunuz önemli değil, muhtemelen YAML ile çalışmak için en az bir eklenti vardır. Eğer sizde yoksa hemen bulun ve kurun. Arama ve kurulum için harcadığınız zaman, YAML'yi her düzenlemeniz gerektiğinde birçok kez karşılığını verecektir.
Örneğin editör
YAML modunda Emacs ve boşluklar görüntüleniyor.
Favori düzenleyicinizde YAML modu yoksa, bazı sorunlar ayarlarla çalışılarak çözülebilir. Örneğin, standart GNOME metin düzenleyicisi Gedit'in YAML modu yoktur, ancak varsayılan olarak YAML sözdizimini vurgular ve çalışmayı girintilerle yapılandırmanıza olanak tanır:
Gedit'te girintileri ayarlama.
Bir eklenti
Başka bir deyişle, favori editörünüz hakkında bilgi edinmeye zaman ayırın. Kendisinin veya geliştirme topluluğunun YAML ile çalışmak için neler sunabileceğini öğrenin ve bu özellikleri kullanın. Kesinlikle pişman olmayacaksınız.
1. Bir linter kullanın
İdeal olarak, programlama dilleri ve işaretleme dilleri öngörülebilir sözdizimi kullanır. Bilgisayarlar öngörülebilirlik konusunda iyidir, bu nedenle
kurmak
$ sudo dnf install yamllint
Daha sonra yamllint'i çalıştırıp YAML dosyasını kontrol etmek için iletmeniz yeterlidir. Hatalı bir dosyayı linter'a iletirseniz şöyle görünür:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 error syntax error: mapping values are not allowed here
23:11 error trailing spaces (trailing-spaces)
Soldaki sayılar zaman değil, hatanın koordinatlarıdır: satır ve sütun sayısı. Hatanın açıklaması size hiçbir şey söylemeyebilir, ancak tam olarak nerede olduğunu biliyorsunuz. Sadece koddaki bu yere bakın ve büyük olasılıkla her şey netleşecektir.
Yamllint bir dosyada hata bulamadığında ekrana hiçbir şey yazdırılmaz. Böyle bir sessizlik sizi korkutuyorsa ve biraz daha geri bildirim istiyorsanız, linter'ı koşullu echo komutuyla çift ve işareti (&&) aracılığıyla şu şekilde çalıştırabilirsiniz:
$ yamllint perfect.yaml && echo "OK"
OK
POSIX'te, çift ve işareti ancak ve ancak önceki komut 0 döndürdüğünde tetiklenir. Ve yamllint yalnızca bulunan hataların sayısını döndürür, bu nedenle tüm bu koşullu yapı işe yarar.
2. YAML'da değil Python'da yazın
YAML sizi gerçekten sinirlendiriyorsa, kelimenin tam anlamıyla yazmayın. Uygulamanın anladığı tek formatın YAML olduğu görülüyor. Ancak bu durumda bile YAML dosyası oluşturmanıza gerek yoktur. Neyi beğendiğinizi yazın ve ardından dönüştürün. Örneğin Python için harika bir kütüphane var
Kendi kendine dönüşüm
Bu durumda veri dosyası aynı zamanda YAML üreten bir Python betiğidir. Bu yöntem küçük veri kümeleri için en uygunudur. JSON verilerini bir Python değişkenine yazmanız, önüne bir içe aktarma yönergesi koymanız ve çıktıyı uygulamak için dosyanın sonuna üç satır eklemeniz yeterlidir.
#!/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
Şimdi bu dosyayı Python'da çalıştırıyoruz ve çıktı.yaml dosyasını alıyoruz:
$ 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
Bu tamamen geçerli bir YAML'dir, ancak yamllint sizi - ile başlamadığı konusunda uyaracaktır. Bu, elle kolayca düzeltilebilir veya Python betiğinde biraz değiştirilebilir.
Komut dosyaları aracılığıyla dönüştürme
Bu durumda önce JSON'da yazıyoruz ve ardından dönüştürücüyü ayrı bir Python betiği olarak çalıştırıyoruz, bu da çıktı olarak YAML üretiyor. Önceki yöntemle karşılaştırıldığında bu yöntem, dönüşümün verilerden ayrı olması nedeniyle daha iyi ölçeklenir.
Öncelikle example.json JSON dosyası oluşturalım, örneğin onu şuradan alabilirsiniz.
{
"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"
}
}
}
}
}
Daha sonra basit bir dönüştürücü betiği oluşturup onu json2yaml.py adı altında kaydedeceğiz. Bu komut dosyası hem YAML hem de JSON Python modüllerini içe aktarır ve kullanıcı tarafından belirlenen bir JSON dosyasını yükler, dönüştürmeyi gerçekleştirir ve verileri çıktı.yaml dosyasına yazar.
#!/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()
Bu betiği sistem yoluna kaydedin ve gerektiği gibi çalıştırın:
$ ~/bin/json2yaml.py example.json
3. Çok ve sık ayrıştırın
Bazen bir soruna farklı bir açıdan bakmak faydalı olabilir. YAML'de verileriniz arasındaki ilişkileri temsil etmekte sorun yaşıyorsanız, verileri geçici olarak daha tanıdık bir şeye dönüştürebilirsiniz.
Örneğin, sözlük listeleri veya JSON ile çalışma konusunda rahatsanız, etkileşimli Python kabuğundaki yalnızca iki komutla YAML'yi JSON'a dönüştürebilirsiniz. Diyelim ki mydata.yaml adlı bir YAML dosyanız var, o zaman şöyle görünecektir:
$ 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.'}
Bu konuyla ilgili daha birçok örnek bulabilirsiniz. Ek olarak, birçok çevrimiçi dönüştürücü ve yerel ayrıştırıcı mevcuttur. Bu nedenle, içinde yalnızca anlaşılmaz bir karmakarışıklık gördüğünüzde verileri yeniden biçimlendirmekten çekinmeyin.
4. Teknik özellikleri okuyun
Uzun bir aradan sonra YAML'a döndüğümüzde ziyaret etmekte fayda var
5. Sözde yapılandırmalar
Bir kitap veya makale yazarken, en azından içindekiler tablosu biçiminde, ilk önce bir ön taslağın taslağını çıkarmak her zaman faydalıdır. YAML'de de durum aynı. Büyük olasılıkla, bir YAML dosyasına hangi verilerin yazılması gerektiğine dair bir fikriniz var, ancak bunları birbirine nasıl bağlayacağınızı gerçekten anlamıyorsunuz. Bu nedenle, YAML'yi şekillendirmeden önce sözde bir yapılandırma çizin.
Sözde yapılandırma, yapı veya girinti, ebeveyn-çocuk ilişkileri, miras ve yuvalama konusunda endişelenmenize gerek olmayan sözde koda benzer. Burada da durum aynı: kafanızda ortaya çıktıkça verilerin yinelemelerini çiziyorsunuz.
Programcıları (Martin ve Tabitha) ve becerilerini (programlama dilleri: sırasıyla Python, Perl, Pascal ve Lisp, Fortran, Erlang) listeleyen sözde yapılandırma.
Bir kağıda sözde yapılandırma çizdikten sonra, onu dikkatlice analiz edin ve her şey yolundaysa geçerli bir YAML dosyası biçiminde biçimlendirin.
6. Sekmeler ve Boşluklar İkilemi
İkilemi çözmeniz gerekecek
Herhangi bir normal metin düzenleyicide, sekmeleri belirli sayıda boşlukla otomatik olarak düzeltebilirsiniz, böylece önemli taraftarların isyanı çıkıntı korkmanıza gerek yok.
Her YAML düşmanının çok iyi bildiği gibi ekrandaki sekmeler ve boşluklar arasındaki farkı göremezsiniz. Ve bir şey görünür olmadığında, bu genellikle insanların diğer olası sorunları ayıkladıktan, kontrol ettikten ve ortadan kaldırdıktan sonra hatırladığı son şeydir. Bir tablolama eğrisi veya bir alan bloğu aramak için harcanan bir saatlik zaman, birinin veya diğerinin kullanımı için acilen bir politika oluşturmanız ve ardından buna uyum için betonarme bir kontrol uygulamanız gerektiğini haykırır (örneğin, bir linter boyunca zorlamak için bir Git kancası).
7. Daha azı daha fazladır (veya daha fazlası daha azdır)
Bazı insanlar yapıyı vurguladığı için YAML'da yazmayı sever. Aynı zamanda veri bloklarını vurgulamak için girintiyi aktif olarak kullanırlar. Bu, açık sınırlayıcılar kullanan işaretleme dillerini taklit etmeye yönelik bir tür dolandırıcılıktır.
İşte böyle bir yapıya bir örnek
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
Bazıları için bu seçenek, YAML yapısını kafalarında çözmelerine yardımcı olurken, diğerleri için ise tam tersine, kendilerine göre pek çok gereksiz girinti ile onları rahatsız ediyor.
Ancak YAML belgesinin sahibiyseniz ve onun bakımından sorumluysanız, o zaman sen ve sadece sen Girintinin nasıl kullanılacağını tanımlamanız gerekir. Büyük dolgudan rahatsız oluyorsanız, bunu YAML spesifikasyonuna göre mümkün olan en düşük seviyede tutun. Örneğin, Ansible belgelerindeki yukarıdaki dosya herhangi bir kayıp olmadan şu şekilde yeniden yazılabilir:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Boşlukları kullanın
Bir YAML dosyasını doldururken sürekli aynı hataları tekrarlıyorsanız, içine yorum olarak bir şablon eklemek mantıklı olacaktır. Daha sonra bir dahaki sefere bu şablonu kopyalayıp oraya gerçek verileri girebilirsiniz, örneğin:
---
# - <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. Farklı bir şey kullanın
Uygulama sizi boğmuyorsa YAML'yi farklı bir formata değiştirmek faydalı olabilir. Zamanla yapılandırma dosyaları büyüyebilir ve bunları Lua veya Python'da basit komut dosyalarına dönüştürmek daha iyidir.
YAML, minimalizmi ve sadeliği nedeniyle birçok insanın sevdiği harika bir şeydir, ancak cephaneliğinizdeki tek araç olmaktan çok uzaktır. Yani bazen reddedebilirsin. YAML için ayrıştırma kitaplıklarını bulmak kolaydır; bu nedenle, kolay geçiş seçenekleri sunarsanız, kullanıcılarınız bu başarısızlıktan nispeten sorunsuz bir şekilde kurtulacaktır.
YAML olmadan yapamıyorsanız, o zaman bu 10 ipucunu alın ve YAML'a olan nefretinizi kesin olarak ortadan kaldırın!
Kaynak: habr.com