YAMLとは?
YAMLは、データのシリアライゼーション(直列化)形式であり、人間にとって読みやすいだけでなく、コンピュータにとっても解析しやすいテキスト形式のデータ表現です。YAMLは元々、プログラミング言語ではなく、設定ファイルやデータの保存、転送など、さまざまな目的で使用することを想定して設計されました。
YAMLの略語は、「YAML Ain’t Markup Language」もしくは「Yet Another Markup Language」と言われていますが、いずれにせよ文章として活用するものではなく、データを扱う際に用いられることを意味しています。
YAMLは階層構造を持てるため、データをネストされたキーと値の形式で記述が可能。これにより、データの構造や関係性を直感的に作成できます。また、YAMLは複数のデータ型をサポートしており、文字列、数値、リスト、マップ(連想配列)などに対応できます。
YAMLの構文例
YAML構文は、拡張子が「.yml」「.yaml」である点が特徴であり、構文を記述するにあたってルールが存在します。
まず、書式記号として知られている、「{ }(中括弧)」「[](各括弧)」「閉じタグ」「“(引用符)」などは存在しません。
しかし、YAMLは、JSONファイルをそのまま使用することができます。これは、JSONが、YAMLの上位集合であることが理由です。
ほかにも、コメントを番号記号やハッシュ記号で表したり、タブ文字の代わりにリテラルスペース文字を取り入れたりするなど、YAML特有のルールがあります。
YAMLの項文例を以下で一部ご紹介します。
【ネストされた構造】
employees:
– name: John Doe
age: 30
position: Manager
– name: Jane Smith
age: 25
position: Engineer
【ショートハンドのリスト】
– apple
– banana
– orange
【ショートハンドのマップ】
{ name: John Doe, age: 30, city: New York }
【コメント】
# This is a comment
name: John Doe # Name of the person
上記はYAMLのシンプルな構文の一例です。内容次第では複雑な構造の記述も可能です。
YAMLの用途
YAMLは設定ファイルの形式として使用されることが多い言語です。具体的には、ソフトウェアやアプリケーションの設定情報を記述する際に選ばれています。
実際、データベース接続情報やネットワーク設定、サーバーの構成などはYAML形式で記述できるうえに、シンプルで分かりやすい言語なのでさまざまな現場で活用されています。
また、YAMLは「Ansibleでの用途」と「Kubernetesでの用途」があります。それぞれの詳細は以下の通りです。
Ansibleでの用途
Ansibleは、YAMLを使用して構成管理や自動化を行うためのオープンソースのITオーケストレーションツールです。
YAML形式のプレイブックと呼ばれるファイルを使用してタスクや設定情報を定義。それを実行することでシステムの構成管理や自動化を行います。
インフラストラクチャの自動化では、AnsibleはYAML形式のプレイブックを使用して、サーバー、ネットワークデバイス、クラウドリソースなどのインフラストラクチャの設定やデプロイを自動化します。
プレイブックには、タスクや役割(ロール)を定義し、それらを対象のホストに適用することで、繰り返しの手動作業を削減し、一貫性のある環境を構築できるのが特徴です。
Kubernetesでの用途
Kubernetesはコンテナオーケストレーションシステムであり、アプリケーションのデプロイ、スケーリング、管理を容易にするためのプラットフォームです。
主にYAMLを使用してアプリケーションやインフラストラクチャの設定情報を表現します。
マニフェストファイルの定義では、アプリケーションやリソースのデプロイメントや管理に使用されるマニフェストファイルをYAML形式で定義します。
定義されたマニフェストファイルには、デプロイメント、サービス、ポッド、セットアップ、構成など、Kubernetesリソースの詳細な設定情報が含まれます。
YAMLの書き方
YAMLの基本的な構造は、「キー」と「値」です。
基本的な構造に基づいたYAMLの書き方は以下の通りです。(この例では、値 123 を文字列としてタグ付けしています)
スカラー型
スカラー型は単一の値を表すデータ型です。数字や文字列、ブール変数など、スカラー型を値にして取り入れることが可能です。
スカラー型の書き方は以下の通りです。
文字列はダブルクォート (“) またはシングルクォート (‘) で囲むことができます。
name: “John Doe”
数値はそのまま記述します。整数や浮動小数点数を含めることができます。
age: 30
price: 9.99
true または false の値を使用します。
isStudent: true
isEnabled: false
null (値が存在しないことを表す) を表現します。
status: null
特定の型を表現するために、タグを使用することができます。
value: !!str 123
スカラー型は、YAMLの基本的なデータ型の一部です。これらの型を適切に使うことで、データを正確に記述可能です。
また、YAMLは型推論を行うため、型を明示しなくても自動的に適切な型を判断することができます。
コレクション型
コレクション型は複数の要素をまとめて表現するデータ型です。主なコレクション型とその書き方について説明します。
複数の項目を順序付けて保持するデータ型です。リストはハイフン (-) で始まる行に順番に記述します。
fruits:
– apple
– banana
– orange
コレクション型はネストすることができ、リストの要素やマップの値として、別のリストやマップを含めることも可能です。
employees:
– name: John Doe
age: 30
– name: Jane Smith
age: 25
各コレクション型を組み合わせることで、さまざまなデータ構造を記述できます。また、コレクション型は階層的な構造を作成できるので、複雑な記述内容にも向いています。
YAMLのデータ構造
一口にYAMLと言っても、データ構造によって異なります。
各データ構造について詳しく解説していきます。
スカラー
YAMLのデータ構造の一つがスカラーです。
コロンやスペース、ダブルクォートなどを使用します。スカラーの構造は次の通りです。
文字列はダブルクォート (“) やシングルクォート (‘) で囲んで表現します。
name: “John Doe”
message: ‘Hello, world!’
整数や浮動小数点数などの数値をそのまま表現します。
age: 30
price: 9.99
シーケンス
YAMLのシーケンスは、順序付けられた要素のリストを表現するデータ構造です。シーケンスは、リストや配列に似た形式でデータを作成します。
YAMLでシーケンスを表現する際には以下を参考にしてみてください。
– apple
– banana
– orange
この例では、fruits というキーの下に3つの要素(apple、banana、orange)を持つリストが定義されています。リストの各要素はハイフン (-) で始まる行で表します。
シーケンスは、要素の順序を保持するため、データの一覧や順序付きのアイテムの表現に適しています。さらに、ネストされたシーケンスを使用することで、より複雑なデータ構造を作成することもできます。
マッピング
YAMLのマッピングは、キーと値のペアの集合を表現するデータ構造です。マッピングは、連想配列や辞書に似た形式でデータを表現します。
person:
name: John Doe
age: 30
この例では、person というキーの下にインラインで name と age の2つのキーと値のペアが定義されています。キーと値のペアは中括弧 ({}) で囲まれ、コロン (:) で区切られ、カンマで区切ります。
マッピングは、キーを使用して値にアクセスするため、データのラベリングやグルーピングに適しています。また、マッピングはネストすることも可能であり、より複雑なデータ構造を表現することができます。
ブロックスタイル・フロースタイル
YAMLのブロックスタイルは、前項までで解説してきた書式のことです。一方、フロースタイルは、一行のデータ構造をコンパクトに表現する書式です。フロースタイルは、シンプルで短いデータ構造やインライン表現が必要な場合に適しています。
【ブロックスタイル】
fruits:
– apple
– banana
– orange
person:
name: John Doe
age: 30
【フロースタイル】
fruits: [apple, banana, orange]
person: {name: John Doe, age: 30}
ブロックスタイルでは、要素ごとに改行とインデントが行われ、データの階層構造が明示されます。一方、フロースタイルでは、データを角括弧 ([]) や中括弧 ({}) で囲み、カンマで区切って一行で表現します。
どちらのスタイルを選択するかは、データの可読性や要件に応じて決定します。複雑なデータ構造を表現する場合や、視覚的な整形が必要な場合にはブロックスタイルが有用です。一方、シンプルなデータ構造やコンパクトな表現が求められる場合にはフロースタイルが適しています。
インデント・ネスト
YAMLでは、インデントを使用してデータのネストや階層構造を記述します。インデントはスペースやタブの組み合わせで行われますが、一貫性を保つためにスペースの使用が推奨されています。
インデントの量は通常、2つのスペースまたは4つのスペースが適していますが、重要なのはインデントの量が一貫していることなので、どの程度のインデント量にするかは、自身の状況や現場の考え方などと照らし合わせて判断してください。
また、視覚的な整形のために、ネストの深さごとにインデントレベルを増やすことが一般的です。
以下に例を示します。
person:
name: John Doe
age: 30
address:
street: 123 Main St
city: Anytown
country: USA
上記は、person というキーの下に name、age、address の3つのキーと値が設けられています。address の下にはさらに street、city、country の3つのキーと値がネストされていますが、各階層ごとにインデントが行われているので、階層の関係が視覚的に明確になっています。
インデントによって階層構造が表現されるため、正しいインデントの使用はYAMLの構文エラーを回避するために重要です。インデントを誤って使用すると、文法エラーが発生し、データの解析が失敗する可能性があるので注意してください。
ドキュメントの開始・終了
複数のドキュメントを1つのファイルに含める場合、各ドキュメントはドキュメントデリミタ (—) を使用して区切ります。ドキュメントデリミタは、新しいドキュメントの開始を示し、前のドキュメントとの区別を明確にします。
以下に例を示します。
—
name: John Doe
age: 30
—
name: Jane Smith
age: 25
2つのドキュメントが1つのファイルに含まれています。1つ目のドキュメントは name とage の2つのキーと値を持ち、2つ目のドキュメントも同様です。各ドキュメントはドキュメントデリミタ — によって区切られています。
ドキュメントデリミタを使用することで、1つのYAMLファイル内で関連するデータを複数のドキュメントとして表現することができます。各ドキュメントは独立して解析され、個別のデータ構造として扱われます。
まとめ
YAMLは、あらゆるプログラミングに対応しているうえに、シンプルな構文なので使いやすいといったメリットがあります。これからYAMLを使い始める方にとっては、やや難しそうなイメージもあるかもしれませんが、理解しやすい構造なので慣れやすいと言えるでしょう。
YAMLに興味のある方は、一度自分の言語用フレームワークの対応内容を確認したうえでチャレンジしてみてはいかがでしょうか。