LoginSignup
1
0

More than 5 years have passed since last update.

Chefでwrapper cookbookからキーを指定してターゲットクックブックのattributeを削除

Last updated at Posted at 2018-06-20

公式サイトに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クラスのインスタンス)となり、アクセスされたのより低優先順位の属性は隠されてしまった。
上の実行結果は、たまたまほぼ上手くいく順序。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0