使用chef php cookbook修改php.ini设置

时间:2013-12-16 14:25:00

标签: php ruby chef vagrant cookbook

我已经安装了opscode的PHP Cookbook和chef-dotdeb上的chef-dotdeb cookbook,以便我可以在流浪盒中运行 PHP 5.4

我想修改一些默认的php.ini设置。

根据厨师php cookbook的文档,我可以使用

修改设置
node['php']['directives'] = {}

例如:

node['php']['directives'] = { :short_open_tag => 'Off' }

我在我的应用程序cookbook中创建的webserver.rb脚本中进行了修改。 当我配置或重新加载流浪盒时,php.ini设置保持不变。

任何想法有什么不对?

webserver.rb文件的内容是:

include_recipe“nginx”

include_recipe“php”

node.default [“php”] [“指令”] = {:short_open_tag => '关'}

即使我删除了dotdeb食谱,以便唯一的PHP东西来自官方的opscode php食谱它仍然不会更新任何ini值。

附加信息

我已经看过opscode php cookbook中的代码,它实际上将指令注入到erb php.ini模板中: https://github.com/opscode-cookbooks/php/blob/master/templates/ubuntu/php.ini.erb

将注释附加到文件末尾的代码是:

<% @directives.sort_by { |key, val| key }.each do |directive, value| -%>
<%= "#{directive}=\"#{value}\"" %>
<% end -%>

这总是空的{}

然而....如果我将其修改为......

<% node.default[:php][:directives].sort_by { |key, val| key }.each do |directive, value| -%>
<%= "#{directive}=\"#{value}\"" %>
<% end -%>

然后将指令注入模板。我不是红宝石专家。这两个逻辑之间的根本区别是什么?

5 个答案:

答案 0 :(得分:3)

可能是一个真正的长镜头,但我试图使用这个功能,并发现它不起作用,然后我实际上发现它是因为我在查看apache2 php.ini时默认只有菜谱添加设置到cli php.ini文件。对于Fedora / Redhat来说这可能不是问题,但它适用于Ubuntu,因为它将/ etc / php5 /下的配置分成不同的文件夹。

答案 1 :(得分:2)

使用Apache安装priestjims php时遇到同样的问题。 首先安装Apache并运行apache2 :: mod_php5并不意味着你可以省略php :: apache2这对我来说是个错误。

解决方案是包含php :: apache2 recipe,然后将它的php.ini写入&#39; apache_conf_dir&#39;。这样开发ini设置就像

default['php']['directives'] = {
     'display_errors' => 'On',
     'allow_url_fopen' => 'On',
     'allow_url_include' => 'On',
     'short_open_tag' => 'Off'
}

将正确应用于apache的php.ini。

答案 2 :(得分:1)

尝试使用:

node.set['php']['directives'] = { :short_open_tag => 'Off' }

如果这不起作用,您可以尝试使用覆盖选项:

node.override['php']['directives'] = { :short_open_tag => 'Off' }

从大厨11开始,您需要设置明确设置优先级:

https://wiki.opscode.com/display/chef/Breaking+Changes+in+Chef+11

答案 3 :(得分:0)

我知道这是一个很老的问题,但它可以帮助别人。

@符号表示它是一个变量。模板资源具有变量属性,您可以在那里添加指令属性。

更多关于文档:

This attribute can also be used to reference a partial template file by using a Hash. For example:

template "/file/name.txt" do
  variables :partials => {
    "partial_name_1.txt.erb" => "message",
    "partial_name_2.txt.erb" => "message",
    "partial_name_3.txt.erb" => "message"
  },
end
where each of the partial template files can then be combined using normal Ruby template patterns within a template file, such as:

<% @partials.each do |partial, message| %>
  Here is <%= partial %>
<%= render partial, :variables => {:message => message} %>
<% end %>

https://docs.getchef.com/resource_template.html

如果你看到食谱php的ini食谱:

template "#{node['php']['conf_dir']}/php.ini" do
    source node['php']['ini']['template']
    cookbook node['php']['ini']['cookbook']
    unless platform?('windows')
        owner 'root'
        group 'root'
        mode '0644'
    end
    variables(:directives => node['php']['directives'])
end

https://github.com/opscode-cookbooks/php/blob/master/recipes/ini.rb

它将node['php']['directives']分配给模板中的变量。

答案 4 :(得分:0)

我遇到这个问题,我的PHP指令没有应用于运行Ubuntu 16.04的PHP。 我的解决方案是覆盖PHP的conf_dir以使配方跳过cli并仅更新Apache2使用的配置。

"override_attributes": {   
      "php": {
            "conf_dir": "/etc/php/7.0/apache2"