独自の人形機能

独自の人形機能

独自の関数を作成しようとしています。このメッセージが繰り返し表示されます。

エラー: リモート サーバーからカタログを取得できませんでした: サーバーでエラー 400: 関数 'brent_k' は、ノード XYZ.com の /etc/puppet/modules/munin/manifests/init.pp:17 で値を返しません

これが私の簡単なコードです

xyz.com:/etc/puppet/modules/munin/lib/puppet/parser/functions# cat brent_k.rb
  module Puppet::Parser::Functions
    newfunction(:brent_k, :type => :rvalue) do |args|
      val = 'ok'
      val
    end
  end

そして私のマニフェストには

$a = brent_k()

return valも試してみました。どうすればこれを修正できますか?

答え1

カスタム関数などのカスタム Ruby コードを変更する場合は、Puppetmaster を再起動する必要があります。passenger で puppet を実行している場合は、Apache を再起動する必要があります。そうしないと、古いバージョンが取得されます。

さらに、Puppetmaster で複数の環境をホストしていて、他の環境に同じ名前の関数がある場合、かなり厄介なバグが発生します。この場合、関数名を呼び出したときにどの環境の関数が使用されているかを確認する方法はありません。すべての環境で同じ関数名前空間を使用します... (これは Puppet 2.7.22 で発生することが確認されていますが、3.x についてはわかりません)

答え2

ドキュメントには次のように書かれています:

Puppet マスターはカスタム関数をキャッシュします。既存の関数を編集した場合 (開発中など)、新しいバージョンを使用する前に Puppet マスターを再起動する必要があります。

https://puppet.com/docs/puppet/latest/writing_custom_functions.html

Puppet マスターの再起動に関する注意:

次のコマンドを実行して Puppet マスターを再起動します。

$ service puppetmaster restart
Restarting puppet master
puppetmaster not configured to start, please edit /etc/default/puppetmaster to enable 
.

サービスは停止しますが、開始されないことがわかります。

その場合、Steve Shipway が述べたように、おそらく Passenger で Puppet マスターを実行しているので、実際に Puppet マスターを再起動するには apache2 をリロードする必要があります。

$ service apache2 reload

関連情報