Кукольный иногда не может найти стандартные факты, такие как osfamily
Краткий обзор - для тестирования я установил агент puppet на 5 узлах (Debian Squeeze + puppet 2.7.20-1puppetlabs1) и мастер puppet на 1 сервере (та же версия).
Со стороны 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
Конечно, после следующей итерации кукольного агента все в порядке. Я понятия не имею, как найти причину этой проблемы. Проблема общая для всех 5 узлов.
Я на 100% уверен, что это не связано с cron.
2 ответа
Я видел эту проблему на RedHat/CentOS. Агент марионеток на клиентском компьютере исчерпал бы файловые дескрипторы из-за некоторой ошибки ruby /puppet, не закрывающей их. После достижения предела 1024 fd, он не сможет больше работать, так что факты будут отсутствовать.
Если последующий запуск кукол из одного и того же процесса не завершится неудачей, это, вероятно, другая проблема, но, возможно, стоит проверить. В моем случае агент марионеток должен был войти в систему, не имея возможности начать анализатор, и в /proc/PIDOFPUPPETD/fd
было бы 1024 файловых дескриптора.
Я нашел источник моей проблемы. Это был мой плагин nagios, который проверяет, работает ли агент puppet, и прослушивает соединения (я запускаю агент puppet с listen = true)
Похоже, если за один раз к агенту-марионетке подключено более 1-го соединения, марионетка не может собирать факты. Например, если у меня 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), но чтобы решить эту проблему, мне нужно прекратить подключение к серверу агентов марионеток.