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

时间:2015-09-14 21:36:53

标签: puppet facter

我的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之前这个事实是无效的。

安装模块后,有没有办法收集信息?除了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

2 个答案:

答案 0 :(得分:3)

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

  1. 作为Facter事实的一部分。如你所知,这是在puppet应用目录之前发生的,所以依赖于木偶运行结果的任何事实在下一次运行之前都没有用。
  2. 作为自定义提供商的一部分。您可以创建自定义类型和提供程序,以便在决定执行操作之前安装检查节点状态的扩展。提供程序在节点上执行,只要您知道整个提供程序生命周期,就可以在PHP安装后实现这一点。然而,与普通的木偶模块相比,这是非常复杂的。
  3. 除了这些选项之外,执行此操作的常规方法是在您自己的清单中强制执行php的版本和配置,然后将该信息传递到此处。您应该已经根据已安装的软件包知道PHP及其扩展的版本。

答案 1 :(得分: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"]
    }
}