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 バイナリをインストールする必要があります。ただし、カタログを適用する前にすべてのファクトが 1 回実行されることに気付きました。このファクトは、php をインストールする前は無効です。

モジュールのインストールに情報を収集する方法はありますか? この情報を公開する別の方法は、facter 以外にあるのでしょうか?

アップデート

複数の .so ファイルのどれがインストールに適しているかを判断するために、次の 2 つの事実を使用しています。

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

基本的に、ノードでコードを実行する機会は 2 つだけです。

  1. Facter ファクトの一部として。ご存知のように、これはパペットがカタログを適用する前に発生するため、パペットの実行結果に依存するファクトは次の実行まで役に立ちません。
  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 に答える