安装包后自定义事实应该 运行

Custom fact should run after a package is installed

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

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

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

安装模块后,有没有办法收集信息?除了 facter 之外,是否还有另一种公开此信息的方式?

更新

我使用这两个事实来确定多个 .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

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

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 }'") || 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"]
    }
}

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

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

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