【问题标题】:Custom fact should run after a package is installed安装软件包后应运行自定义事实
【发布时间】:2015-12-11 00:26:12
【问题描述】:

我的 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

【问题讨论】:

    标签: puppet facter


    【解决方案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"]
        }
    }
    

    【讨论】:

    • 感谢您的回复。如果我确实需要可用的事实,我该怎么办?您的回答只允许它优雅地失败
    • 事实可用是什么意思?使用第二种方法,事实将可用:如果 php 二进制文件存在,它将包含实际值,如果不存在,则字符串“不存在”。您的意思是,如果二进制文件尚未安装,您是否希望该事实不存在?
    • 'Not present' 对我没有用,所以我希望在安装二进制文件之后运行 。我愿意接受以其他方式提供信息的建议,但事实似乎是推荐的方法
    • 老实说,我不认为这是可能的,因为 puppet 的插件同步行为:首先同步所有事实(在 puppet 代码中可用),然后处理清单。你可以做的是调整你的傀儡代码来检查事实的价值。如果它与您选择的字符串不同(即:“不存在”甚至是空字符串),则在 puppet 中执行代码 sn-p。
    • 这对我有用,但是如何在 puppet 中执行代码 sn-ps?自定义函数在服务器上执行
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回复,我最终写了一个新的提供者;尽管更复杂,但我认为从长远来看会更好
    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    相关资源
    最近更新 更多