3

我的 php 模块中有一个小的自定义事实

Facter.add('php_extension_version') do
  setcode do
    Facter::Core::Execution.exec("php -i | awk '/^PHP Extension =>/ { print $4}'") || nil
  end
end

这显然需要安装 php 二进制文件。但是,我注意到在应用目录之前所有的事实都运行一次,所以这个事实在 php 安装之前是无效的。

安装模块有什么方法可以收集信息吗?除了事实之外,是否还有另一种公开这些信息的方式?

更新

我使用这两个事实来确定多个 .so 文件中的哪一个适合安装:

if $php_zts_enabled {
    $so_name = "newrelic-$php_extension_version.so"
} else {
    $so_name = "newrelic-$php_extension_version-zts.so"
}

file {"/usr/lib64/php5/extensions/newrelic.so":
    source => "file:///opt/newrelic-php5-$version-linux/agent/x64/$so_name",
    owner  => root,
    group  => root,
    mode   => 0644,
    notify => Service['apache'],
    require => Exec["extract-php-agent-$version"]
}

位于 agent/x64 目录中的文件可以是

newrelic-20060613.so      newrelic-20090626-zts.so  newrelic-20121212.so      newrelic-20131226-zts.so
newrelic-20060613-zts.so  newrelic-20100525.so      newrelic-20121212-zts.so
newrelic-20090626.so      newrelic-20100525-zts.so  newrelic-20131226.so
4

2 回答 2

3

您基本上只有两次机会在节点上执行代码:

  1. 作为事实事实的一部分。如您所知,这发生在 puppet 应用目录之前,因此任何依赖于 puppet 运行结果的事实在下一次运行之前都不会有用。
  2. 作为自定义提供程序的一部分。您可以创建自定义类型和提供程序来安装扩展程序,在决定做什么之前检查节点状态。提供者在节点上执行,只要您知道提供者的整个生命周期,您就可以在 PHP 安装后实现这一点。然而,与普通的 puppet 模块相比,这非常复杂。

在这些选项之外,执行此操作的正常方法是在您自己的清单中强制执行 php 的版本和配置,然后将该信息传递到此处。根据您安装的软件包,您应该已经知道 PHP 的版本及其扩展。

于 2015-09-15T02:30:13.730 回答
1

我会修改事实,使其仅在二进制文件存在时才存在(因此它不会在第一次运行时出现)。

Facter.add('php_extension_version') do
  setcode do
    if system("which php > /dev/null 2>&1")
      Facter::Core::Execution.exec("php -i | awk '/^PHP Extension =>/ { print $4}'") || nil
    end

  end
end

然后在您的清单中,您将原始代码包装在 if

if $php_extension_version {
    if $php_zts_enabled {
        $so_name = "newrelic-$php_extension_version.so"
    } else {
        $so_name = "newrelic-$php_extension_version-zts.so"
    }

    file {"/usr/lib64/php5/extensions/newrelic.so":
        source => "file:///opt/newrelic-php5-$version-linux/agent/x64/$so_name",
        owner  => root,
        group  => root,
        mode   => 0644,
        notify => Service['apache'],
        require => Exec["extract-php-agent-$version"]
    }
}
于 2015-09-14T21:50:30.243 回答