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