YAMLはマークアップ言語(YAML)ではなく、構成形式が進むにつれて、見た目は簡単です。直感的な視覚的構造を備えており、ロジックは非常にシンプルです。インデントされた箇条書きは、親の箇条書きのプロパティを継承します。
しかし、この明らかな単純さは欺くことができます。
YAMLを単なる関連する値のリストと考えるのは簡単です(そして誤解を招く可能性があります)。ショッピングリストほど複雑ではありません。見出しとその下にいくつかのアイテムがあります。見出しの下の項目はそれに直接関連していますよね?さて、有効なYAMLを少し書くことで、この理論をテストできます。
テキストエディタを開き、このテキストを入力します。ファイルの上部にあるダッシュと、最後の2つの項目の先頭のスペースを保持します。
---
Store: Bakery
Sourdough loaf
Bagels
ファイルをexample.yaml(または同様のもの)として保存します。
yamllint
をまだお持ちでない場合 インストール、インストール:
$ sudo dnf install -y yamllint
リンター ファイルの構文を検証するアプリケーションです。 yamllint
コマンドは、YAMLを作成しているアプリケーション(Ansibleなど)にYAMLを渡す前に、YAMLが有効であることを確認するための優れた方法です。
yamllint
を使用する YAMLファイルを検証するには:
$ yamllint --strict shop.yaml || echo “Fail”
$
しかし、単純なコンバータースクリプトを使用してJSONに変換すると、この単純なYAMLのデータ構造がより明確になります。
$ ~/bin/json2yaml.py shop.yaml
{“Store”: “Bakery Sourdough loaf Bagels”}
改行やインデントの視覚的なコンテキストなしで解析すると、データの実際のスコープは大きく異なります。データはほとんどフラットで、階層がほとんどありません。サワードウのパンとベーグルが店の名前の子供であるという兆候はありません。
[読者も気に入っています:Ansible:すべての人のためのIT自動化]
YAMLでのデータの保存方法
YAMLにはさまざまな種類のデータブロックを含めることができます:
- シーケンス:特定の順序でリストされた値。シーケンスはダッシュとスペースで始まります(
-
)。シーケンスは、PythonリストまたはBashまたはPerlの配列と考えることができます。 - マッピング:キーと値のペア。各キーは一意である必要があり、順序は関係ありません。 Python辞書またはBashスクリプトでの変数の割り当てについて考えてみてください。
scalar
と呼ばれる3番目のタイプがあります 、これは、文字列、整数、日付などの任意のデータ(Unicodeでエンコードされたもの)です。実際には、これらはマッピングとシーケンスブロックを構築するときに入力する単語と数字であるため、母国語の単語を熟考する以上にこれらについて考えることはありません。
YAMLを構築する場合、YAMLをシーケンスのシーケンスまたはマップのマップのいずれかとして考えると役立つ場合がありますが、両方ではありません。
YAMLマッピングブロック
マッピングステートメントを使用してYAMLファイルを開始すると、YAMLは一連のマッピングを予期します。 YAMLのマッピングブロックは解決されるまで閉じず、新しいマッピングブロックが明示的に作成されます。新しいブロックは、どちらかのみ作成できます。 インデントレベルを上げる(この場合、新しいブロックは前のブロック内に存在します)か、前のマッピングを解決して隣接するマッピングブロックを開始します。
この記事の元のYAMLの例で階層を含むデータを生成できない理由は、実際には1つのデータブロック(キーStore
)のみであるためです。 Bakery Sourdough loaf Bagels
の単一の値があります 。新しいマッピングブロックが開始されていないため、YAMLは空白を無視します。
各シーケンス項目の前にダッシュとスペースを付けることで、YAMLの例を修正することはできますか?
---
Store: Bakery
- Sourdough loaf
- Bagels
繰り返しますが、これは有効なYAMLですが、それでもかなりフラットです:
$ ~/bin/json2yaml.py shop.yaml
{“Store”: “Bakery - Sourdough loaf - Bagels”}
問題は、このYAMLファイルがマッピングブロックを開き、決して閉じないことです。 Store
を閉じるには 新しいマッピングをブロックして開くには、新しいマッピングを開始する必要があります。 値 マッピングの一部はシーケンスにすることができますが、キーが必要です 最初。
正しい(そして拡張された)解像度は次のとおりです:
---
Store:
Bakery:
- ‘Sourdough loaf’
- ‘Bagels’
Cheesemonger:
- ‘Blue cheese’
- ‘Feta’
JSONでは、これは次のように解決されます:
{“Store”: {“Bakery”: [“Sourdough loaf”, “Bagels”],
“Cheesemonger”: [“Blue cheese”, “Feta”]}}
ご覧のとおり、このYAMLディレクティブには1つのマッピング(Store
)が含まれています )から2つの子の値(Bakery
およびCheesemonger
)、それぞれが子シーケンスにマップされます。
YAMLシーケンスブロック
YAMLディレクティブをシーケンスとして開始する場合も、同じ原則が当てはまります。たとえば、このYAMLディレクティブは有効です:
Flour
Water
Salt
JSONとして表示すると、各アイテムは異なります:
[“Flour”, “Water”, “Salt”]
ただし、このYAMLファイルはではありません マッピングブロックを開始しようとするため有効です シーケンスブロックに隣接するレベル :
---
- Flour
- Water
- Salt
Sugar: caster
マッピングブロックをに移動することで修復できます シーケンス:
---
- Flour
- Water
- Salt
- Sugar: caster
いつものように、マッピングアイテムにシーケンスを埋め込むことができます:
---
- Flour
- Water
- Salt
- Sugar:
- caster
- granulated
- icing
明示的なJSONスコーピングのレンズを通して見ると、そのYAMLスニペットは次のようになります。
[“Flour”, “Salt”, “Water”, {“Sugar”: [“caster”, “granulated”, “icing”]}]
[Red Hatの無料ガイド:ビジネスを自動化するための5つのステップ。 ]
YAML構文
YAMLを快適に記述したい場合は、そのデータ構造を認識することが重要です。お分かりのように、覚えておかなければならないことはあまりありません。あなたはマッピングについて知っています およびシーケンス ブロックするので、必要なものはすべて処理する必要があります。残っているのは、それらがどのように相互作用し、相互作用しないかを覚えておくことだけです。ハッピーコーディング!