YAML 構文¶
このページでは、Ansible Playbook (Ansible での設定管理言語) の表現方法である、 正しい YAML 構文を概説します。
XML や JSON などの一般的な他のデータ形式に比べて人間による解読および記述が容易であるため、 YAML を使用します。 さらに、プログラミング言語の多くには、 YAML に対応するライブラリーが提供されています。
Playbook の使用 も合わせて参照し、 実際にどのように使用されているかを確認してください。
YAML の基礎¶
Ansible で使用する場合には、YAML ファイルのほぼすべてがリストで開始されます。 リストの各アイテムは、 「ハッシュ」または「ディクショナリー」と一般的に呼ばれる、キー/値のペアのリストとなっています。 そのため、 YAML でリストとディクショナリーを記述する方法を理解する必要があります。
YAML には、他にも固有の特徴があります。 YAML ファイルはすべて (Ansible との関係の有無に関わらず)、
任意で ---
から開始して、...
で終わらせることができます。 これは、YAML 形式の一部で、ドキュメントの最初と最後を示します。
リストのメンバーが記載されている行はすべて、同じ幅分インデントして、"- "
(ダッシュとスペース) で開始します:
---
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
...
ディクショナリーは、シンプルな key: value
の形式で表現します (コロンの後にはスペースを挿入します):
# An employee record
martin:
name: Martin D'vloper
job: Developer
skill: Elite
ディクショナリーのリストや、値がリスト場合や、ディクショナリーと値が混合している場合など、より複雑なデータ構造も可能です:
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
ディクショナリーとリストは、必要であれば、略語形式で表現することも可能です:
---
martin: {name:Martin D'vloper, job:Developer, skill:Elite}
['Apple', 'Orange', 'Strawberry', 'Mango']
以下は「フローコレクション」と呼ばれます。
Ansible では以下の形式はあまり使用されませんが、ブール型値 (True/False) を複数形式で指定することも可能です:
create_key: yes
needs_agent: no
knows_oop:True
likes_emacs:TRUE
uses_cvs: false
値は、 |
または >
を使用して複数行に分けることができます。 「リテラル形式のブロックスカラー」 |
を使用して複数行に分けた場合には、改行と、末尾にあるスペースが含まれます。
「折り返し形式のブロックスカラー」 >
を使用すると、改行を折り返してスペースに置き換えます。この文字を使用して、非常に長い行を簡単に解読し、編集できるようにします。
いずれの場合も、インデントは無視されます。
以下に例を示します:
include_newlines: |
exactly as you see
will appear these three
lines of poetry
fold_newlines: >
this is really a
single line of text
despite appearances
上記の >
の例では、改行はすべて折り返されてスペースに変換されますが、改行を強制的に確保させる方法が 2 種類あります:
fold_some_newlines: >
a
b
c
d
e
f
same_as: "a b\nc d\n e\nf\n"
これまでに学習した内容を、任意の YAML 例にまとめてみます。 以下は、Ansible とは関係ありませんが、どのような形式になるかを示しています:
---
# An employee record
name: Martin D'vloper
job: Developer
skill: Elite
employed: True
foods:
- Apple
- Orange
- Strawberry
- Mango
languages:
perl: Elite
python: Elite
pascal: Lame
education: |
4 GCSEs
3 A-Levels
BSc in the Internet of Things
Ansible Playbook の記述を開始するにあたり、以上が YAML について理解しておく必要のある内容です。
Gotchas¶
引用符なしのスカラーに何でも挿入できますが、例外がいくつかあります。
コロンの後のスペース (または改行) ": "
は、マッピングを示すインジケーターです。
スペースの後にシャープ記号 " #"
を指定すると、その後はコメントになります。
このため、以下のような場合には、YAML 構文のエラーが発生します:
foo: somebody said I should put a colon here: so I did
windows_drive: c:
…ただし、これは機能します:
windows_path: c:\windows
コロンを使用してハッシュ記号を引用し、その後ろにスペースを指定するか、行末にしてください:
foo: 'somebody said I should put a colon here: so I did'
windows_drive: 'c:'
…そしてコロンが保存されます。
または、二重引用符を使用してください:
foo: "somebody said I should put a colon here: so I did"
windows_drive: "c:"
二重引用符ではエスケープを使用できる点が、 一重引用符と二重引用符との相違点です:
foo: "a \t TAB and a \n NEWLINE"
使用可能なエスケープの一覧は、YAML 仕様の「Escape Sequences」 (YAML 1.1) または「Escape Characters」(YAML 1.2) に記載されています。
以下は無効な YAML です。
foo: "an escaped \' single quote"
さらに、Ansible は変数に “{{ var }}” を使用します。 コロンの後に “{” が指定されている場合には、 YAML はその値がディクショナリーであると認識するため、以下のように引用する必要があります:
foo: "{{ variable }}"
引用符で開始される値は、値の一部だけでなく、値全体を引用符で囲む必要があります。ただしく値を引用する方法について、以下に追加で例を挙げています:
foo: "{{ variable }}/additional/string/literal"
foo2: "{{ variable }}\backslashes\are\also\special\characters"
foo3: "even if it's just a string literal it must all be quoted"
以下は有効ではありません:
foo:"E:\path\"rest\of\path
'
および "
以外に、
[] {} > | * & ! % # ` @ ,
などの特殊文字 (予約文字) が複数あり、引用なしのスカラーの最初の文字として使用できません。
また、? : -
にも注意が必要です。YAML では、上記の記号の後にスペース以外の文字が続く場合には、文字列の最初に指定できますが、
YAML プロセッサーの実装は異なるため、引用を使用することが推奨されます。
フローコレクションでは、ルールはもう少し厳密です:
a scalar in block mapping: this } is [ all , valid
flow mapping: { key: "you { should [ use , quotes here" }
ブール値の変換は便利ですが、リテラルの yes や、文字列として他のブール値を指定する場合など問題になる場合があります。 上記場合には、引用符だけを使用します:
non_boolean: "yes"
other_string:"False"
YAML は、 特定の文字列は 1.0 の文字列など、浮動小数点の値に変換します。バージョン番号を指定する必要がある場合には (requirements.yml ファイル内など)、 浮動小数点の値のようであれば、 その値を引用符で囲む必要があります:
version: "1.0"
See also
- Playbook の使用
- Playbook でできることと、Playbook を記述および実行する方法を学びます。
- YAMLLint
- YAML ヒント (オンライン) は、問題が発生した場合に YAML 構文のデバッグに役立ちます。
- GitHub サンプルディレクトリー
- Github プロジェクトソースにあるすべての Playbook ファイル
- Wikipedia YAML 構文の参照
- YAML 構文の適切なガイド
- メーリングリスト
- ご質問はございますか。サポートが必要ですか。ご提案はございますか。 Google グループの一覧をご覧ください。
- irc.freenode.net
- #ansible IRC chat channel and #yaml for YAML specific questions
- YAML 1.1 仕様
- PyYAML および libyaml が、現在実装している YAML 1.1 の仕様
- YAML 1.2 仕様
- 完全を期すため、YAML 1.2 は 1.1 の後継となります。