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

使用chef php cookbook修改php.ini设置,php,ruby,chef-infra,vagrant,cookbook,Php,Ruby,Chef Infra,Vagrant,Cookbook,我已经安装了opscode的PHP Cookbook和在中找到的chef dotdeb Cookbook,这样我就可以在vagrant box中运行PHP5.4 我想修改一些默认的php.ini设置 根据chef php cookbook的文档,我可以使用 node['php']['directives'] = {} 例如: node['php']['directives'] = { :short_open_tag => 'Off' } 我已经在应用程序手册中创建的webserver.

我已经安装了opscode的PHP Cookbook和在中找到的chef dotdeb Cookbook,这样我就可以在vagrant box中运行PHP5.4

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

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

node['php']['directives'] = {}
例如:

node['php']['directives'] = { :short_open_tag => 'Off' }
我已经在应用程序手册中创建的
webserver.rb
脚本中进行了修改。 当我设置或重新加载vagrant框时,
php.ini
设置保持不变

你知道怎么了吗

webserver.rb文件的内容包括:

包括配方“nginx”

包括“php”

node.default[“php”][“directives”]={:short\u open\u tag=>'Off'}

即使我删除了dotdeb cookbook,以便唯一的php内容来自官方的opscode php cookbook,它仍然不会更新任何ini值

附加信息

我已经查看了opscode php cookbook中的代码,该代码实际上将指令注入到它的erb php.ini模板中:

将指令插入到文件末尾的代码是:

<% @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 -%>

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

尝试使用:

node.set['php']['directives'] = { :short_open_tag => 'Off' }
如果不起作用,您可以尝试使用覆盖选项:

node.override['php']['directives'] = { :short_open_tag => 'Off' }
从chef 11开始,您需要设置优先级并显式设置优先级:


可能很难实现,但我尝试使用此功能时发现它不起作用,然后我实际发现这是因为我正在查看apache2 php.ini,而烹饪书默认情况下只将设置添加到cli php.ini文件中。这可能不是Fedora/Redhat的问题,但却是Ubuntu的问题,因为它将/etc/php5/下的配置分离到不同的文件夹中。

我知道这是一个很老的问题,但它可能会帮助其他人

@
符号表示它是一个变量。模板资源具有variables属性,您可以在其中添加directives属性

有关该文件的更多信息:

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 %>


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

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

解决方案是包含php::apache2 recipe,然后将其php.ini写入“apache_conf_dir”。这样,开发ini设置就像

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

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

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

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

对于某些食谱,重新调配很少对我有效。你试过完整的
vagrant destroy
vagrant up
了吗?先是摧毁了盒子,然后又做了一个vagrant up,但还是不起作用:(我的心灵感应能力有限。显示更多代码(webserver.rb),你如何调用配方和输出。我使用
覆盖属性('php'=>{'conf_dir'=>'/etc/php5/apache2'})
并且它更新了apache配置而不是cli…这不是最干净的解决方案,但是如果您只需要更新Web服务器配置,这是最简单的方法。感谢您的回复。我已经尝试了这些,并且已经阅读了部分文档。恐怕没有修复它:(当我尝试这一个时,这是生成的代码short\u open\u tag=“Off”,但它应该是short\u open\u tag=Off,并且它只是附加在cli/php.ini上,而不是它apache2/php.ini。我通过创建一个自定义模板并使用chef模板编写文件来解决这个问题。
"override_attributes": {   
      "php": {
            "conf_dir": "/etc/php/7.0/apache2"