【问题标题】:How to set config=value in php.ini with Puppet?如何使用 Puppet 在 php.ini 中设置 config=value?
【发布时间】:2012-06-03 17:43:43
【问题描述】:

我在 Puppet 中迈出了第一步,但遇到了问题。我已经在 Linux 服务器上安装了 PHP,我想对 php.ini 文件做一些小改动。我不想用存储库中的一个覆盖整个 ini 文件,只需更改/创建一个简单的配置值。

我想确保php.ini 中的属性upload_max_filesize 具有10M 的值。

我怎样才能做到这一点?

【问题讨论】:

  • 作为一个更新,看起来 puppet 现在包含或有一个叫做 augeas 的东西,它是专门为做这类事情而设计的。不过我自己并没有真正使用过它,所以不确定使用起来有多容易。

标签: configuration puppet ini augeas


【解决方案1】:

我的首选方案是不理会 php.ini,并让 puppet 在 php 的 conf.d 目录中创建一个文件以覆盖您要更改的值。

您对 php.ini 所做的更改越少,当您需要在将来升级 php.ini 时将更改与包提供程序更改合并时,就越容易看到发生了什么。

file {'/etc/php5/conf.d/upload_limits.conf':
  ensure => present,
  owner => root, group => root, mode => 444,
  content => "post_max_size = 10M \nupload_max_filesize = 10M \n",
}

【讨论】:

  • 这是一个非常好的和干净的方法,我喜欢!
  • 虽然这种方法不是独立于操作系统的。
  • @JimmyKane,你在考虑哪个操作系统?
  • @Xeoncross 之前有错误的评论。在操作系统中可能是正确的。专注于另一个问题。感谢提及
  • 在 Debian/Ubuntu 上,您应该调用文件 upload_limits.ini,然后通过 php5enmod upload_limits 启用它。
【解决方案2】:

基本上有3个选项:

  1. 在 puppet 中使用 augeas 支持(您需要安装 ruby​​ augeas 库),例如:

    augeas { "php.ini":
      notify  => Service[httpd],
      require => Package[php],
      context => "/files/etc/php.ini/PHP",
      changes => [
        "set post_max_size 10M",
        "set upload_max_filesize 10M",
      ];
    }
    

    您可以使用“augtool ls /files/etc/php.ini”查看这些部分以了解 augeas 如何解析文件并使用它来计算出您需要的路径。

  2. 您可以使用执行程序。比如:

    define set_php_var($value) {
      exec { "sed -i 's/^;*[[:space:]]*$name[[:space:]]*=.*$/$name = $value/g' /etc/php.ini":
        unless  => "grep -xqe '$name[[:space:]]*=[[:space:]]*$value' -- /etc/php.ini",
        path    => "/bin:/usr/bin",
        require => Package[php],
        notify  => Service[httpd];
      }
    }
    set_php_var {
      "post_max_size":       value => '10M';
      "upload_max_filesize": value => '10M';
    }
    

    不幸的是,这个解决方案不理解 php.ini 中的部分,因此添加一个尚不存在的变量需要额外的努力。如果变量出现在多个部分中,这将做错事(但我正在查看的示例似乎具有所有唯一的变量名称)。这应该适用于存在但用分号注释掉的变量。

  3. 将原始 php.ini 文件复制到您的 puppet 存储库中,并使用带有 source => 'puppet:///...'content => template(...) 的文件完全替换该文件,正如您所指示的那样,您不希望这样做。

【讨论】:

  • Puppetforge 中有太多可用于 augeas 的参考,现在问题是使用哪一个,我也使用了这个forge.puppetlabs.com/camptocamp/augeas@freiheit
  • @ankurverma:那个特定的 puppet 模块可以解决问题。然而,我真正的意思不是 puppet 模块,而是 ruby​​ 库。根据您的系统,名称为“ruby-augeas”、“rubygem-ruby-augeas”或“libaugeas-ruby”的包。您在 ruby​​forge 上找到的 puppet 模块似乎可以正确安装这些模块,因此只要将其包含在主配置和客户端配置中,它就可以工作。
  • 我安装了我提到的模块并尝试使用此文件中的 augeas:db.tt/CZMgwmuF 请查看此内容并遮蔽一些光线,因为我不明白为什么这不起作用,也在我的测试节点文件资源正在执行,但 Augeas 没有,另外一件事是,由于 Augeas 不工作,我没有得到更新的配置文件。
  • @ankurverma:你真的应该问一个新问题。您在该示例中所做的工作不会很好,因为您告诉 puppet 使用同一个文件做两件相互冲突的事情。
【解决方案3】:

您也可以使用 stdlib 模块中的 file_line 资源。

file_line{ 'php_upload_max_filesize':
  path => '/path/to/php.ini',
  line => "upload_max_filesize = 10M",
}

如果不存在完全匹配的行,这会将行附加到文件中,并且由于配置值的最后一个实例优先于文件中较早的那些实例,因此它将起作用。当我只有几件事要改变时,我就是这样做的。

【讨论】:

  • 也可以使用file_linematch参数来保证upload_max_filesize=...只存在一行。见the documentation
【解决方案4】:

如果您使用 Apache 作为您的 Web 服务器,另一种方法是在您的 Apache 虚拟主机文件中设置 php 变量(可能在您的 Puppet 清单目录中的某个位置)。

例如:

<VirtualHost *:80>
  ServerName app.dev
  DocumentRoot /srv/app/public
  ## etc...

  php_value upload_max_filesize 10M

</VirtualHost>

这实际上并没有改变 php.ini,但是 - 根据您的设置 - 可能是实现相同效果的简单方法。

【讨论】:

  • 完美适用于 puppet 和 puppetlabs-apache(不支持直接 PHP 配置)
猜你喜欢
  • 2015-03-15
  • 2015-04-05
  • 2016-10-08
  • 1970-01-01
  • 2013-04-18
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多