Você precisará de uma maneira de acessar seu banco de dados a partir da linha de comando. Você não especifica qual mecanismo de banco de dados está usando, então presumo o PostgreSQL, pois é com isso que estou mais familiarizado. Eu sei que o SQLite e o MySQL têm um cliente de linha de comando que permite a execução de consultas.
Primeiro, gostaria de começar com isso em um módulo:
exec{'insert-missing-hosts':
command => "/usr/local/bin/update-database ${hostname}",
require => File['/usr/local/bin/update-database'],
}
file{'/usr/local/bin/update-database':
source => 'puppet:///modules/your-module/update-database',
mode => 0755,
}
E o script update-database
pode ser:
#!/bin/bash
$HOSTNAME=${1?Missing HOSTNAME}
# add credentials to access the database server to psql's command line options
/bin/echo <<-EOF | /usr/bin/psql --file=- --no-psqlrc --quiet
INSERT INTO foo_hosts(hostname)
SELECT '${HOSTNAME}'
EXCEPT
SELECT hostname FROM foo_hosts;
EOF
Observe que esta consulta SQL é vulnerável: se um invasor obtiver o controle do Puppet, ele poderá executar qualquer comando arbitrário em seu servidor de banco de dados. É claro que, se o invasor ganhar o controle de Puppet, você terá problemas ainda mais sérios.