Назад | Перейти на главную страницу

Как вставить строку в таблицу СУБД из марионеточного модуля?

У меня есть таблица базы данных, в которую мне нужно вставить строку для каждого хоста, которому была назначена конкретная модель марионетки. Назовем эту марионеточную модель foo. Таблица db называется foo_hosts имеет три столбца: id, hostname, и date_added. Я бы хотел узнать, как у меня foo модуль выполнить SQL ...

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

... если в таблице еще нет строки для хоста.

Вам понадобится способ доступа к базе данных из командной строки. Вы не указываете, какой движок базы данных вы используете, поэтому я предполагаю, что PostgreSQL, так как это то, с чем я наиболее знаком. Я знаю, что у SQLite и MySQL есть клиент командной строки, который позволяет выполнять запросы.

Во-первых, я бы начал с этого в модуле:

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,
}

И update-database сценарий может быть:

#!/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

Обратите внимание, что этот SQL-запрос уязвим: если злоумышленник получает контроль над Puppet, он может выполнить любую произвольную команду против вашего сервера базы данных. Конечно, если злоумышленник получит контроль над Puppet, у вас возникнут еще более серьезные проблемы.