Puppet 有时无法找到像 osfamily 这样的标准事实

Puppet 有时无法找到像 osfamily 这样的标准事实

简要介绍 - 为了测试目的,我在 5 个节点(Debian Squeeze + puppet 2.7.20-1puppetlabs1)上安装了 puppet 代理,并在 1 台服务器上安装了 puppet master(相同版本)。

在 puppetmaster 端,我会在每个清单中检查 $::osfamily 是否 == 'Debian'。有时我还会使用 $::fqdn,并检查它是否不为空。

问题是,每天在随机时间我都会收到来自 puppetmaster 的邮件,说他无法为某个节点编译目录。例如:

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

当然,在下一次 Puppet 代理迭代之后,一切都很好。我不知道如何找到这个问题的原因。这个问题是所有 5 个节点都存在的。

我 100% 确定这与 cron 无关。

答案1

我在 RedHat/CentOS 上看到过这个问题。客户端计算机上的 puppet 代理会因为某个 ruby​​/puppet 错误而无法关闭文件描述符,从而耗尽文件描述符。达到 1024 fd 限制后,它将无法再运行 facter,因此事实将会丢失。

如果同一进程中的后续 puppet 运行没有失败,则可能是其他问题,但值得检查一下。在我的例子中,puppet 代理会记录无法启动 facter 的信息,并且其中/proc/PIDOFPUPPETD/fd会有 1024 个文件描述符。

答案2

我找到了问题的根源。这是我的 nagios 插件,它检查 puppet 代理是否工作并监听连接(我使用 listen=true 运行 puppet agent

看起来如果一次与 Puppet 代理建立多个连接,Puppet 就无法收集事实。例如,如果我的操作系统是“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 个命令运行循环,它每次都能有效。

我不确定这是否真的是 Puppet 问题,或者是更深层次的问题(ruby 模块),但为了解决这个问题,我需要停止连接到 Puppet 代理服务器。

相关内容