簡単な説明-テスト目的で、5つのノード(Debian Squeeze + puppet 2.7.20-1puppetlabs1)にpuppetエージェントをインストールし、1つのサーバー(同じバージョン)にpuppetmasterをインストールしました。
すべてのマニフェストのpuppetmaster側で、$ :: osfamily == 'Debian'かどうかを確認します。 $ :: fqdnを使用して、空でないかどうかを確認することもあります。
問題は、毎日ランダムな時間に、puppetmasterからノードの1つのカタログをコンパイルできないというメールを受け取ることです。例えば:
Fri Jan 18 19:18:24 +0100 2013 Puppet (err): Could not retrieve catalog from remote server: Error 400 on SERVER: Not supported osfamily at /etc/puppet/modules/system/manifests/skel.pp:20 on node mynodeX
Fri Jan 18 19:18:24 +0100 2013 Puppet (notice): Using cached catalog
Fri Jan 18 19:18:24 +0100 2013 Puppet (err): Could not retrieve catalog; skipping run
Puppetmasterログからの別の例:
Jan 15 18:58:49 monitor puppet-master[14218]: No fqdn at /etc/puppet/modules/system/manifests/motd.pp:29 on node nodeY
もちろん、次のパペットエージェントの反復の後、すべてが正常です。この問題の原因を見つける方法がわかりません。問題は5つのノードすべてに共通です。
私はそれがcronに関連していないと100%確信しています。
この問題はRedHat/CentOSで見ました。クライアントマシンのpuppetエージェントは、Ruby/puppetのバグによってファイル記述子が閉じられないため、ファイル記述子が不足していました。 1024 fdの制限に達した後、facterを実行できなくなるため、事実が失われます。
同じプロセスからの後続のパペットの実行が失敗しない場合、それはおそらく別の問題ですが、チェックする価値があるかもしれません。私の場合、パペットエージェントはファクトを開始できないことについてログに記録し、/proc/PIDOFPUPPETD/fd
1024個のファイル記述子があります。
問題の原因を見つけました。 puppetエージェントが機能するかどうかをチェックして接続をリッスンするのは私のnagiosプラグインでした(私はlisten = trueでpuppetエージェントを実行します)
一度にパペットエージェントへの接続が複数ある場合、パペットは事実を収集できないようです。たとえば、私のosfamilyが「Debian」の場合、一般的な「Linux」だけが返されます。
どのようにテストしましたか?以下に接続するコマンドを使用して、2つのループを実行します。
https://127.0.0.1:8139/production/facts/no_key
結果の例:
OK: connection with puppet agent works (facter: 1.6.17, kernel: 2.6.32-5-AMD64, os: Debian)
OK: connection with puppet agent works (facter: 1.6.17, kernel: 2.6.32-5-AMD64, os: Debian)
OK: connection with puppet agent works (facter: 1.6.17, kernel: 2.6.32-5-AMD64, os: Linux)
OK: connection with puppet agent works (facter: 1.6.17, kernel: 2.6.32-5-AMD64, os: Debian)
OK: connection with puppet agent works (facter: 1.6.17, kernel: 2.6.32-5-AMD64, os: Debian)
1つのコマンドだけでループを実行すると、毎回機能します。
それが本当にパペットの問題なのか、それとももっと深いもの(Rubyモジュール)なのかはわかりませんが、この問題を修正するには、パペットエージェントサーバーへの接続を停止する必要があります。