chefでattributeファイルを上書きしたい時

attributeファイルのオーバーライド

公式レシピを使う場合に、attributesファイルの一部のパラメータだけ更新したい時があると思います。
jsonでいちいち指定しても良いんですが、共通で設定したいパラメータは
site-cookbooks以下にattributesファイルで書いておきたいこともあります。


その場合、今までは馬鹿正直にオリジナルのレシピを丸々コピペして一部だけ更新する、
といったように使っていたんですが*1
include_attribute使えば簡単に書けるのでは?と思った。

nginxの場合

いままではベタ書きしてたのを…

site-cookbooks/nginx/attributes/default.rb
# オリジナルのattributes/default.rbをコピペ
default['nginx']['version']      = '1.2.9'
default['nginx']['package_name'] = 'nginx'
default['nginx']['dir']          = '/etc/nginx'
default['nginx']['script_dir']   = '/usr/sbin'
default['nginx']['log_dir']      = '/var/log/nginx'
default['nginx']['binary']       = '/usr/sbin/nginx'

case node['platform_family']
when 'debian'
  default['nginx']['user']       = 'www-data'
  default['nginx']['init_style'] = 'runit'
when 'rhel', 'fedora'
  default['nginx']['user']        = 'nginx'
  default['nginx']['init_style']  = 'init'
  default['nginx']['repo_source'] = 'epel'
when 'gentoo'
  default['nginx']['user']       = 'nginx'
  default['nginx']['init_style'] = 'init'
else
  default['nginx']['user']       = 'www-data'
  default['nginx']['init_style'] = 'init'
end

default['nginx']['upstart']['runlevels']     = '2345'
default['nginx']['upstart']['respawn_limit'] = nil
default['nginx']['upstart']['foreground']    = true

default['nginx']['group'] = node['nginx']['user']

default['nginx']['pid'] = '/var/run/nginx.pid'

default['nginx']['gzip']              = 'on'
default['nginx']['gzip_http_version'] = '1.0'
default['nginx']['gzip_comp_level']   = '2'
default['nginx']['gzip_proxied']      = 'any'
default['nginx']['gzip_vary']         = 'off'
default['nginx']['gzip_buffers']      = nil
default['nginx']['gzip_types']        = %w[
                                          text/plain
                                          text/css
                                          application/x-javascript
                                          text/xml
                                          application/xml
                                          application/rss+xml
                                          application/atom+xml
                                          text/javascript
                                          application/javascript
                                          application/json
                                          text/mathml
                                        ]
default['nginx']['gzip_min_length']   = 1_000
default['nginx']['gzip_disable']      = 'MSIE [1-6]\.'

default['nginx']['keepalive']            = 'on'
default['nginx']['keepalive_timeout']    = 65
default['nginx']['worker_processes']     = node['cpu'] && node['cpu']['total'] ? node['cpu']['total'] : 1
default['nginx']['worker_connections']   = 1_024
default['nginx']['worker_rlimit_nofile'] = nil
default['nginx']['multi_accept']         = false
default['nginx']['event']                = nil
default['nginx']['server_tokens']        = nil
default['nginx']['server_names_hash_bucket_size'] = 64
default['nginx']['sendfile'] = 'on'

default['nginx']['access_log_options']     = nil
default['nginx']['error_log_options']      = nil
default['nginx']['disable_access_log']     = false
default['nginx']['install_method']         = 'package'
default['nginx']['default_site_enabled']   = true
default['nginx']['types_hash_max_size']    = 2_048
default['nginx']['types_hash_bucket_size'] = 64

default['nginx']['proxy_read_timeout']      = nil
default['nginx']['client_body_buffer_size'] = nil
default['nginx']['client_max_body_size']    = nil

# 一部オーバーライド
default['nginx']['version']        = '1.4.3'
default['nginx']['install_method'] = 'source'


こう直す。
別ファイルに書く(ファイル名はなんでもいいはず)。

site-cookbooks/nginx/attributes/default_ext.rb
include_attribute 'nginx::default'

# customize
default['nginx']['version'] = '1.4.3'
default['nginx']['install_method'] = 'source'


さっき思いついたのでもしかしたら副作用があるかもしれないですが、
特に問題なければ今まで書いたレシピだいぶ綺麗になりそう。

*1:http://d.hatena.ne.jp/toritori0318/20130509/1368107821 これのopensshのattributeなんかそうですね