【YAML】YAML (YAML Ain't Markup Language)

■ はじめに

今更ながらだが、AWSやAnsibleなどなど色々と必要になりそうなので
YAMLについて、調べてみた。

目次

【1】YAML
【2】種類
 1)スカラ
 2)シーケンス (配列)
 3)マッピング (連想配列)
【3】文法
 1)コメント
 2)始まり ( --- ) と終わり  ( ... )
【4】改行の扱い
 1)パイプ ( | )
 2)大なり記号 (>) 
 3)ハイフン (-)
【5】アンカー(&) / エイリアス(*)
 1)マージ(<<)
【6】その他 Tips
 1)JSONからYAMLに変換

【1】YAML

* YAML :  YAML Ain't a Markup Language(=YAMLはマークアップ言語じゃない)
* 読み方は、「ヤムル」
* 拡張子は「***.yml」「***.yaml」

【2】種類

1)スカラ

* データ型は以下のようなものがある

 a) 文字列 .... hello, "5", 'true'
 b) 数値 ... 5, 5.45
 c) 真偽 ... true/false, yes/no, on/off
 d) null ... null, ~(チルダ)
 e) 日付 ... 2019-12-21

2)シーケンス (配列)

* 「- 【スカラー】」を使う(「ブロックスタイル」っていうらしい)

サンプル

- List-A
- List-B
- List-C

補足

* [List-A, List-B, List-C] って書き方でも同じ(こっちは「フロースタイル」)
* 空白を入れることで、入れ子構造もかける(「タブ」じゃだめ)

サンプル:入れ子

- List-A
- 
  - List-B1
  - List-B2
- Liar-C

3)マッピング (連想配列)

* Key-Value
* 「【キー】: 【値】」を使う

サンプル

key_A: value_A
key_B: value_B
key_C: value_C

補足

* { key_A: value_A, key_B: value_B, key_C: value_C } って書き方でも同じ
* 入れ子できま*
* 配列と組み合わせることも可能

【3】文法

1)コメント

* 「#」を使う

サンプル

# ここがコメントになる

2)始まり ( --- ) と終わり ( ... )

* YAMLファイルの中に複数のコンポーネントをいれたい場合
 - - - ダッシュ3つでつなげたのをいれる

https://engineers.ntt.com/entry/2021/09/10/100708
https://note.com/yuya_mstr/n/n2ab8fd3a30b3

--- # ★
key1: value11
key2: value12
object:
 key3: value13
...
--- # ★
key1: value21
key2: value22
object:
 key3: value23
 key4: value24

【4】改行の扱い

* YAMLでの改行の扱いについてまとめる

https://qiita.com/jerrywdlee/items/d5d31c10617ec7342d56

1)パイプ ( | )

* 改行も含めて認識

サンプル

- |
  This is a sample.
  This is a just sample.

# 「This is a pen.\nThis is a just sample.」ってなる
#  => 改行も含めて認識される

実際の使われ方

jobs:
  testJob:
    name: Demo for UUID
    runs-on: ubuntu-latest
    steps:
      # ★注目★
      - run: |
          UUID=$(uuidgen)
          echo "Result = ${UUID}"

2)大なり記号 (>)

* 改行はスペースに置き換わる

サンプル

- >
  aws s3 cp
  src/hello_world.py
  s3://hello-world-xxx/src/hello_world.py

# 「aws s3 cp src/hello_world.py s3://hello-world-xxx/src/hello_world.py」ってなる
#  => 一行として認識される

3)ハイフン (-)

* 最後の改行がなくなる

実際の使われ方
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/deploying.applications.html

AWSTemplateFormatVersion: 2010-09-09
Description: >-
  AWS CloudFormation sample template LAMP_Single_Instance: Create a LAMP stack
  using a single EC2 instance and a local MySQL database for storage. This
  template demonstrates using the AWS CloudFormation bootstrap scripts to
  install the packages and files necessary to deploy the Apache web server, PHP,
  and MySQL at instance launch time. **WARNING** This template creates an Amazon
  EC2 instance. You will be billed for the AWS resources used if you create a
  stack from this template.

【5】アンカー(&) / エイリアス(*)

* 同じ値が複数回登場する場合に、「アンカー(&)」と「エイリアス(*)」が有用

https://shiroyuki2020.hatenablog.com/entry/introduction_to_yaml_07
https://www.wakuwakubank.com/posts/488-it-yaml/

[a] アンカー(&)

* 変数定義 ...「&」を使う

[b] エイリアス(*)

* 変数参照 ...「*」を使う

例1:Hello world

- &leader Mike
- *leader
- &subleader Tom
- *lsubleader
- *subleader

例2:docker compose

version: '3.7'

x-environment: &environment
  ENV: development
  USER: user
  HOST: example.com

services:
  nginx:
    image: nginx:alpine
    ports:
      - 80:80
    environment: *environment

  rails:
    image: ruby:alpine
    environment: *environment

1)マージ(<<)

* マッピングをマージしたい場合は、<< を利用

https://qiita.com/dokeita/items/85302434091d06e2007c
例1:Hello World

array1 : &array1
- a: 1
  b: 2
  c: 3
array2 : &array2
- d: 4
  e: 5
  f: 6

array :
 <<: *array1
 <<: *array2

# 結果
# {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}

例2:docker compose
https://docs.docker.com/reference/compose-file/extension/#example-2

x-env: &env
  environment:
    - CONFIG_KEY
    - EXAMPLE_KEY
 
services:
  first:
    <<: *env
    image: my-image:latest
  second:
    <<: *env
    image: another-image:latest

【6】その他 Tips

1)JSONからYAMLに変換

以下のサイトで変換できる

https://j2y.link

参考文献

https://qiita.com/fkana/items/21f7cc3b327445483d5c
https://magazine.rubyist.net/articles/0009/0009-YAML.html
https://www.wakuwakubank.com/posts/488-it-yaml/
動画
https://dotinstall.com/lessons/basic_yaml_v2

関連記事

TOML
https://dk521123.hatenablog.com/entry/2023/04/25/103533
Ansible ~ 基本編 ~
https://dk521123.hatenablog.com/entry/37482488
Python ~ 基本編 / YAML
https://dk521123.hatenablog.com/entry/2019/10/16/225401