У меня есть таблица базы данных, в которую мне нужно вставить строку для каждого хоста, которому была назначена конкретная модель марионетки. Назовем эту марионеточную модель 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, у вас возникнут еще более серьезные проблемы.