Como inserir linha na tabela RDBMS do módulo puppet?

2

Eu tenho uma tabela de banco de dados onde eu preciso inserir uma linha para cada host foi atribuído um modelo de marionete particular. Vamos chamar este modelo de boneco foo . A tabela do banco de dados é chamada foo_hosts tem três colunas: id , hostname e date_added . Gostaria de saber como meu módulo foo executa o SQL ...

insert into foo_hosts (hostname) values ( $hostname );

... se ainda não houver uma linha na tabela para o host.

    
por Red Cricket 10.12.2013 / 22:51

1 resposta

4

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.

    
por 11.12.2013 / 03:20

Tags