Memo/yaml

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

yaml

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

yamldiff: yamlを比較、ソート、色づけ

  • Install: CentOS 64bitへ
    sudo wget "https://github.com/sahilm/yamldiff/releases/download/0.0.1/yamldiff-v0.0.1-linux-amd64" -O /usr/local/bin/yamldiff
    sudo chmod +x /usr/local/bin/yamldiff
  • example1.yaml
    key1: val1
    key2: val2
    key3: |
      example
  • example2.yaml
    key1: val1
    key3: |
      example
      key3-diff
    key2: val2-diff
  • 比較
    yamldiff --file1 example1.yaml --file2 example2.yaml
    
    - key2: "val2",
    - key3: "example\n",
    + key2: "val2-diff",
    + key3: "example\nkey3-diff\n",

データ型


マージ

  • 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-10-17 (水) 17:20:16 (2d)