Memo/yaml

https://dexlab.net:443/pukiwiki/index.php?Memo/yaml
 

yaml

  • データ構造であるが、それ自体にアンカーやエイリアス等の機能がある。
  • ansible, puppet hieraでも採用
  • 記事

データ型


マージ

  • dict型は以下のようにマージできる。yamlの機能
common: &_common
  user: readonly
  db: dummy
development:  <<: *_common
  db: dev_db
production:  <<: *_common
  db: prod_db
  • array型はマージできない
common: &_common
- aaa
- bbb
development: *_common # 成功
development: *_common &_development # エラー。&_developmentアンカーが使えなくて困る
&_development: *_common # null
development: &_allow_login_full_admin
- <<: *_common # エラー
<<: *_common # エラー
  <<: *_common # エラー
development: &_allow_login_full_admin
- *_common # 成功だが [ [ aaa, bbb ] ] になる
development: &_allow_login_full_admin [ *_common ] # 上と同じ
  • ? はdict型のvalueなし扱いなのでマージできる
common: &_common  ? aaa # aaa: null と同じ
  ? bbb # bbb: null と同じ
development: &_development
  <<: *_common  ? ccc

アンカー、エイリアス

YAMLの機能。データに「&name」と名前を付け、「*name」で参照できる。 同じ値を書かずに済む。

  • アンカーを先に、エイリアスを後に書かないとエラーが出る実装もある(puppet hiera)
  • ansible 2.5.3では複数のyamlに分割した場合、アンカー/エイリアスは使えなかった
  • 記事
  • ansible playbook
- hosts: all
  gather_facts: true
  sudo: true
  vars:
    - var1: &_a1 hoge
    - var2: *_a1
    - array1: &_a2
    - foo
    - bar
    - array2: *_a2
    - dict1: &_a3
      key1: foo
      key2: bar
    - dict2: *_a3
  tasks:
    - debug: var=var2
    - debug: var=array2
    - debug: var=dict2
  • 実行結果
TASK: [debug var=var2] ********************************************************
ok: [127.0.0.1] => {
    "var": {
        "var2": "hoge"
    }
}
TASK: [debug var=array2] ******************************************************
ok: [127.0.0.1] => {
    "var": {
        "array2": [
            "foo",
            "bar"
        ]
    }
}
TASK: [debug var=dict2] *******************************************************
ok: [127.0.0.1] => {
    "var": {
        "dict2": {
            "key1": "foo",
            "key2": "bar"
        }
    }
}

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-15 (土) 07:31:38 (9d)