Eu encontrei a fonte do meu problema. Foi o meu plugin nagios, que verifica se o agente fantoche funciona e escuta as conexões ( eu corro com o agente fantoche com listen = true )
Parece que se houver mais de uma conexão com o agente fantoche de uma só vez, o fantoche não pode reunir os fatos. Por exemplo, se minha osfamily é "Debian", ela retorna apenas um "Linux" genérico.
Como eu testei? Eu corro 2 loops, com comandos que se conectam a:
https://127.0.0.1:8139/production/facts/no_key
Exemplo de resultado:
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)
Se eu executar o loop com apenas 1 comando, ele funcionará sempre.
Não tenho certeza se é realmente um problema de marionetes ou algo mais profundo (módulos Ruby), mas para corrigir esse problema, preciso parar de me conectar ao servidor do agente de marionetes.