QA@IT

Berkshelfで入れたcookbookのtemplate 内にあるインスタンス変数を宣言する方法について

4047 PV

Berkshelfを使い php-fpm の cookbook を作成しているのですが
php-fpm のバージョンアップで listen.owner を指定していないとエラーが出るようになってしまいました。

具体的には下記のような変更が必要になります。

変更前

;listen.owner = www-data
;listen.group = www-data

変更後

listen.owner = nginx
listen.group = nginx

そこで cookbook の該当箇所を探したところ templates/default/pool.conf.erb に以下の様な記述がありました。

;listen.owner = nobody
<% unless @listen_owner.nil? %>
listen.owner = <%= @listen_owner %>
<% end %>

;listen.group = nobody
<% unless @listen_group.nil? %>
listen.group = <%= @listen_group %>
<% end %>

ここから @listen_owner@listen_group を何処かで宣言すれば良いとはわかるのですが、どうすればよいかわかりませんでした。

以前に stackoverflowにもおなじ質問をして、その時は rewind リソースを使えば良いと教えてもらったのですが、そちらもわからない部分が多すぎて具体的なコードがかけずにいる状態です。
http://stackoverflow.com/questions/25401477/how-can-i-edit-www-conf-for-php-fpm-in-chef-recipe/25405854

回答

※ cookbookを編集する方法ではなく、jsonファイルでパラメータを指定するにはコメント欄のiron-sandさんのコメントを参照してください


chefはあまり明るくないので、スクリプトとしてみた印象からです。
(外してたらごめんなさい)

https://github.com/yevgenko/cookbook-php-fpm/blob/master/definitions/php_fpm_pool.rb

にて

:listen_owner => params[:listen_owner] || node['php-fpm']['listen_owner'] || node['php-fpm']['user'],
:listen_group => params[:listen_group] || node['php-fpm']['listen_group'] || node['php-fpm']['group'],

と定義されています。

なので、 definitions/php_fpm_pool.rb で、php_fpm_poolにパラメータを渡すか

define :php_fpm_pool, :template => "pool.conf.erb", :enable => true, :listen_owner => "hoge", :listen_group => "hoge"  do

( Chef的にこうすれば params[:listen_owner] ととれるみたいですので。ただ今回の目的ではこれは行儀わるそうですね。)

または

attributes/default.rb

default['php-fpm']['pools'] = [
  {
    :name => "www"
  }
]

listen_owner とか user を与えれば

recipes/configure.rb で展開され

if node['php-fpm']['pools']
  node['php-fpm']['pools'].each do |pool|
    php_fpm_pool pool[:name] do
      pool.each do |k, v|
        self.params[k.to_sym] = v
      end
    end
  end
end

設定されるんじゃないでしょうか。
( ここでの設定も param['listen_owner'] などに設定されると思います。 )

ちなみに今設定されている :name によって www.confwww が決まってるんじゃないかと思います。
これを受けて

  pool_name = params[:name]

  conf_file = "#{node['php-fpm']['pool_conf_dir']}/#{pool_name}.conf"

の部分で #{pool_name}.confwww.confになると思います。


ここまで書いて気づきましたが、以下のusergroupを OSに応じて直せばよいと思います。
今RHEL以外なので、www-dataになってるんだと思いますので。

attributes/default.rb

if node.platform_family == "rhel"
  user = "apache"
  group = "apache"
  conf_dir = "/etc/php.d"
  pool_conf_dir = "/etc/php-fpm.d"
  conf_file = "/etc/php-fpm.conf"
  error_log = "/var/log/php-fpm/error.log"
  pid = "/var/run/php-fpm/php-fpm.pid"
else
  user = "www-data"
  group = "www-data"
  conf_dir = "/etc/php5/fpm/conf.d"
  pool_conf_dir = "/etc/php5/fpm/pool.d"
  if node.platform == "ubuntu" and node.platform_version.to_f <= 10.04
    conf_file = "/etc/php5/fpm/php5-fpm.conf"
  else
    conf_file = "/etc/php5/fpm/php-fpm.conf"
  end
  error_log = "/var/log/php5-fpm.log"
  pid ="/var/run/php5-fpm.pid"
end

これによって

:listen_owner => params[:listen_owner] || node['php-fpm']['listen_owner'] || node['php-fpm']['user'],

params[:listen_owner]node['php-fpm']['listen_owner'] で上書きsれていなければ node['php-fpm']['user'] が採用されると思います。

まとまってなくてすいません。

編集 履歴 (3)
  • ありがとうございます。 変数の定義位置を教えて頂いて指定方法がわかりました。 node['php-fpm']['listen_owner'] のような node のハッシュですと、 -
  • chef のサーバー設定ファイル `nodes/server.json` に "php-fpm": {
    "listen_owner": "nginx",
    "listen_group": "nginx"
    }, を追記することで cookbook 自体に変更を加えずに値の変更ができました。
    -
  • 示して頂いた方法を見ると他にも指定方法がありそうですが、動作としてはコレで満足ですので今回はこの方法を採用することにしました。 -
  • なるほど、そのようにして jsonで追加でパラメータを与えられるんですね、勉強になりました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。