AWSのcloudformationについて学ぶ前にYAMLについて学んでみた。
参考URL: https://dotinstall.com/lessons/basic_yaml_v2
YAMLは、JSONやXMLのように構造化されたデータのテキスト記述方法。
値、配列、連想配列の形で保持。型は自動判別するので指定しない(出来ない?)
基本的なイメージは、変数や配列に値を格納処理だけを行う感じ。
rubyが一番YAMLを使っているっぽいので、rubyで実装
1 2 3 |
require 'yaml' data = YAML.load_file('mydata.yml') p data |
1, 値(スカラ)の書き方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# コメントの書き方 # 頭ハイフン+半角スペースをつけると値となる - hello - 123 - 4.56 - true # true/false, yes/no, on/off - null # ~(チルダ一文字でnullの意味) - 2020-12-31 12:34:56 # 文字列にしたい時は、ダブルクォーテーションorシングルクォーテーション - "true" - '789' - a@example.com # 頭にハイフンなし文字列はエラーになる! # こんな感じで解釈される # ["hello", 123, 4.56, true, nil, 2020-12-31 21:34:56 +0900, "true", "789", "a@example "] |
2, 配列(シーケンス)の書き方
1個以上の半角スペースで字下げする(タブ文字は不可)
1 2 3 4 5 6 7 8 9 10 11 |
- parent1 - - child1 - child2 - parent2 - - child3 - child4 # こんな感じで解釈される ["parent1", ["child1", "child2"], "parent2", ["child3", "child4"]] |
3, 連想配列(マッピング)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# 区切り文字の:の後ろには半角スペースが必須! # :の前に半角スペースはあってもなくても良い。 name : aaa email: aaa@example.com address: tokyo-1 # こんな感じ {"name"=>"aaa", "email"=>"aaa@example.com", "address"=>"tokyo-1"} ただの配列より連想配列の方が、自然な記述だな [yaml] name : bbb # 1文字以上の半角スペースで字下げ score: music : 10 art : 20 sciennce: 30 # こんな感じ {"name"=>"bbb", "score"=>{"music"=>10, "art"=>20, "sciennce"=>30}} |
この3つ(値、配列、連想配列)を組合わせて、実装する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
names: - suzuki - sato - tanaka emails: - suzuki@example.com - sato@example.com - tanaka@example.com {"names"=>["suzuki", "sato", "tanaka"], "emails"=>["suzuki@example.com", "sato@example.com", "tanaka@example.com"]} fruits: [apple, banana, orange] prices: [150, 200, 100] # {"fruits"=>["apple", "banana", "orange"], "prices"=>[150, 200, 100]} - {name: aaa, score: 10} - {name: bbb, score: 20} # [{"name"=>"aaa", "score"=>10}, {"name"=>"bbb", "score"=>20}] # 感覚的には、これが一番しっくり来る persons: [ [ name: suzuki, email: suzuki@example.com ], [ name: sato, email: sato@example.com ] ] # {"persons"=>[[{"name"=>"suzuki"}, {"email"=>"suzuki@example.com"}], [{"name"=>"sato"}, {"email"=>"sato@example.com"}]]} |
4, YAMLにおける改行の書き方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
this is a pen # 改行は半角スペースに置換される # "this is a pen" # 文字列を字下げして、先頭にハイフンとパイプをつけると、ちゃんと改行される。 - | this is a pen # ["this\nis\na\npen"] |
5, 定数(アンカー)と定数参照(エイリアス)
1 2 3 4 5 6 7 8 9 10 11 12 |
# &で定数定義、*で定数参照 - &person suzuki - &student1 sato - &student2 tanaka - class: [ teacher: *person, leader: *student1, member: *student2 ] # ["suzuki", "sato", "tanaka", {"class"=>[{"teacher"=>"suzuki"}, {"leader"=>"sato"}, {"member"=>"tanaka"}]}] |
6, ハッシュのマージ(定数を展開)
開発・製品・テスト環境のDB定数(ログインユーザは同じ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# 共通の定数(アンカー)を定義 common_user: &common_user db_user: dbuser db_password: dbpass #開発環境 development: database: db_dev <<: *common_user # 以下のように展開(マージ)される # db_user: dbuser # db_password: dbpass # 本番環境 production: database: db_prod <<: *common_user # テスト環境 test: database: db_test <<: *common_user |
7, yamlの区切り文字は、—(ハイフン3つ)
for文で取り出す区切りとなる。
1 2 3 4 5 6 7 8 9 10 11 12 |
--- - a - b - c --- - 1 - 2 - 3 --- - x - y - z |