公式サイトにnode.rm_defaultなどの記載が追加されていたので試して見る
About Attributes
Remove Precedence Level
テストレシピ
recipes/default.rb
node.default['foo'] = ' 2' # 優先順位
node.force_default['foo'] = ' 6' # 優先順位
node.normal['foo'] = ' 8' # 優先順位
node.override['foo'] = '10' # 優先順位
node.force_override['foo'] = '14' # 優先順位
def logput
log "
node['foo'] : #{node['foo']}
node.default['foo'] : #{node.default['foo']}
node.force_default['foo'] : #{node.force_default['foo']}
node.normal['foo'] : #{node.normal['foo']}
node.override['foo'] : #{node.override['foo']}
node.force_override['foo'] : #{node.force_override['foo']}
"
end
logput
node.rm_override('foo')
logput
node.rm_normal('foo')
logput
node.rm_default('foo')
logput
実行結果
Converging 4 resources
Recipe: test::self_reference
* log[
node['foo'] : 14
node.default['foo'] : 2
node.force_default['foo'] : 6
node.normal['foo'] : 8
node.override['foo'] : 10
node.force_override['foo'] : 14
] action write
# ここでnode.rm_override('foo')
* log[
node['foo'] : 8
node.default['foo'] : 2
node.force_default['foo'] : 6
node.normal['foo'] : 8
node.override['foo'] : {}
node.force_override['foo'] : {}
] action write
# ここでnode.rm_normal('foo')
* log[
node['foo'] : {} #<= normalのリセットが必要。なお、もしここまでnomal系に触っていなければ6
node.default['foo'] : 2
node.force_default['foo'] : 6
node.normal['foo'] : {}
node.override['foo'] : {}
node.force_override['foo'] : {}
] action write
# ここでnode.rm_default('foo')
* log[
node['foo'] : {}
node.default['foo'] : {}
node.force_default['foo'] : {}
node.override['foo'] : {}
node.force_override['foo'] : {}
] action write
結果サマリー
- rm_defaultはdefaultとforce_defaultを消す
- rm_normalはnomalを消す
- rm_overrideはoverrideとforce_overrideを消す
なお、normal系は、値が保持される特徴を持っていて、一度でも使われるとrm_normalしても{}として残り、defaultやforce_defaultを覆い隠してしまう。
rm_normalでその辺も削除できることを期待していたが残念。
このnormalの削除は、例えば以下などで可能
- Chef Workstatonでは、knife node edit NODEなどでトップレベルの "normal": { }内の該当箇所をクリア
- test-kitchen + chef-zero 環境では、/tmp/kitchen/nodes/<インスタンス名>.json を同様に編集するか削除
$ kitchen exec all --command='sudo rm /tmp/kitchen/nodes/default-centos-7.json'
-----> Execute command on test-centos-7.
$
追記
#{node.role_default['foo']}などといった普通でないアクセスはテスト目的以外では行わないほうが良さそう。
いろいろ試して見た結果、値が設定されていない高優先順位のnode.force_override['foo']などにアクセスすると、以降node['foo']は空のHash?(Chef::Node::ImmutableMashクラスのインスタンス)となり、アクセスされたのより低優先順位の属性は隠されてしまった。
上の実行結果は、たまたまほぼ上手くいく順序。