木偶有时无法find像osfamily这样的标准事实

快速简介 – 为了testing目的,我在5个节点(Debian Squeeze + puppet 2.7.20-1puppetlabs1)上安装了puppet agent,在1个服务器(同一版本)上安装了puppet master。

在每个清单中的puppet方面,我检查$ :: 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 

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

我100%确定它与cron无关。

我在RedHat / CentOS上看到过这个问题。 由于某些ruby / puppet bug没有closures,客户端机器上的puppet agent会耗尽文件描述符。 在达到1024fd的限制后,将无法运行,所以事实将会丢失。

如果后来的傀儡从相同的过程中运行不失败,这可能是一个不同的问题,但它可能是值得一试。 在我的情况下,puppet agent会logging不能启动/proc/PIDOFPUPPETD/fd ,而在/proc/PIDOFPUPPETD/fd会有1024个文件描述符。

我发现我的问题的来源。 这是我的nagios插件,检查傀儡代理人是否工作,并听取连接( 我运行puppet代理与listen = true

看来如果一次傀儡经纪人有一个以上的联系,傀儡就不能收集事实。 例如,如果我的osfamily是“Debian”,它只返回通用的“Linux”。

我如何testing? 我运行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) 

如果我只用一个命令运行循环,它每次都有效。

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