YAMLエンジニアになれる(かもしれない)Tips集

みなさん、`YAML`つかってますか？

私は業務でよく使っています。
Webアプリケーションフレームワークの設定ファイル、CI／CDの設定ファイル、インフラ管理、コンテナオーケストレーション周りなどいろいろなところで出てきます。
私の所属するチームでは[自動テストをYAMLで実装できるツール](https://github.com/lifull-dev/bucky-core)を開発し、OSSで公開しました。
どちらかというとYAML好きです。

この記事ではYAMLの基本・小技・ツールの3つのくくりで知見をまとめていきます。

# 基本

## 配列

```yaml
- Ryu
- Ken
- Honda
```

YAMLは行数が長くなる傾向があるので、少ない配列であれば1行で書くのも結構使えます

```yaml:1行でもかける
[Ryu, Ken, Honda]
```

## 連想配列

```yaml
Ryu: Punch
Ken: Kick
Honda: Dutsuki
```


```yaml:1行でもかける
{ Ryu: Punch, Ken: Kick, Honda: Dutsuki }
```

## 配列と連想配列のいろいろ
```yaml
Japan:
    - Ryu
    - Honda
USA:
    - Ken
↓
{
  "Japan": [
    "Ryu", 
    "Honda"
  ], 
  "USA": [
    "Ken"
  ]
}
```

```yaml
-
  name: Ryu
  gender:   male
-
  name: Ken
  gender:   male
↓
[
  {
    "gender": "male", 
    "name": "Ryu"
  }, 
  {
    "gender": "male", 
    "name": "Ken"
  }
]
```
```yaml
- [Ryu, male, Punch]
- [Ryu, male, Kick]
↓
[
  [
    "Ryu", 
    "male", 
    "Punch"
  ], 
  [
    "Ryu", 
    "male", 
    "Kick"
  ]
]
```
```yaml
Ryu: {gender: male, skill: Punch}
Ken: {
    gender: male,
    skill: Kick
  }
↓
{
  "Ken": {
    "gender": "male", 
    "skill": "Kick"
  }, 
  "Ryu": {
    "gender": "male", 
    "skill": "Punch"
  }
}
```

## スカラーコンテンツ
`|`や`>`を使って長文を扱う記法です。インデントや改行が扱いやすくなります。
サンプル見てみましょう。

### --- |
改行ごとに改行文字が挿入されます。

```yaml
--- |
  I can fly.
  yes, you can fly

  Do you like snow?
↓
"I can fly.\nyes, you can fly\n\nDo you like snow?"
```

### --- >
空行が改行文字になります

```yaml
--- >
  I can fly.
  yes, you can fly

  Do you like snow?
↓
"I can fly. yes, you can fly\nDo you like snow?"
```

### 連想配列と組み合わせる
```yaml
Ryu: |
  He is so cool.
  His punch is very strong.

  Hello.
Ken: >
  He is a nice guy.
  His kick is very dangerous.

  Goodbye
↓
{
  "Ryu": "He is so cool.\nHis punch is very strong.\n\nHello.\n",
  "Ken": "He is a nice guy. His kick is very dangerous.\nGoodbye"
}
```

# 小技

## アンカーとエイリアス
あるYAMLの記述をそのまま再利用したいときに使います。
`&`で印をつけて`*`で使います

```yaml
command: &command_hissatsu
  - Down
  - Right
  - Punch
command 2nd: *command_hissatsu
↓
{

  "command": [
    "Down", 
    "Right", 
    "Punch"
  ],
  "command 2nd": [
    "Down", 
    "Right", 
    "Punch"
  ]
}
```


## 継承（っぽいこと）
再利用して一部だけ異なる内容にしたい
そんなときに使えます

```yaml
command: &command_hissatsu
  Down: 4
  Right: 2
  Punch: 1
command 2nd:
  <<: *command_hissatsu
  Punch: 100
↓
{
  "command": {
    "Down": 4, 
    "Right": 2, 
    "Punch": 1
  },
  "command 2nd": {
    "Down": 4, 
    "Right": 2, 
    "Punch": 100
  }
}
```

## 型 (Tags)
YAMLはロードするときにいい感じに型を決めてくれます。

```ruby:Rubyで型をみてみる
require 'yaml'

# trueを渡すとBoolのTrueになる
data = YAML.safe_load('flg: true')
=> {"flg"=>true}
data["flg"].class
=> TrueClass

# nullを渡すとnilになる
data = YAML.safe_load('flg: null')
=> {"flg"=>nil}
data["flg"].class
=> NilClass

# "でくくるとStringになる
data = YAML.safe_load('flg: "true"')
=> {"flg"=>"true"}
data["flg"].class
=> String
```
```yaml
flg: true
↓
# 指定しないとTrue
{
  "flg": true
}

# "でくくる
flg: "true"
↓
{
  "flg": "true"
}

# !!型 値 のように指定する
flg: !!str true
↓
{
  "flg": "true"
}
```


# ツール

## YAMLの記法を確かめるウェブアプリ
すごい使えます。
https://yaml-online-parser.appspot.com/

## Visual Studio Code
私はよくVSCodeを使います。デフォルト機能の折りたたみが結構使えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10800/24ce8f06-e361-9c1d-b8e9-ca29c155a46f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10800/e549df02-92cc-b876-cdca-ea3aaa708d7f.png)

また、以下のプラグインも使っています。
文法チェックが走るのでとてもはかどります。
ただし長いファイルのときは重くなるときがあるので注意が必要です。
https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10800/2c007595-f616-8ea6-10b3-65155f542b49.png)


# 参考
最後に参考ページです。みなさんもこんな使い方あるよーみたいなものがあれば教えてください。

* https://magazine.rubyist.net/articles/0009/0009-YAML.html
* https://yaml.org/
* https://www.redhat.com/sysadmin/yaml-tips
* https://qiita.com/yukihane/items/fcdf2ce7370c96868af1
* https://deeeet.com/writing/2018/01/10/kubernetes-yaml/