Мы пытаемся написать марионетку для подготовки виртуальной машины. Одна из задач - установить и заполнить базу данных Postgres данными.
Мы можем разделить эту задачу на несколько более мелких задач:
Кажется, Puppet будет отвечать за шаг 1: установка.
Должны ли мы использовать Puppet для выполнения шагов 2, 3, 4?
Первые три шага определенно относятся к сфере Puppet. Установка - это package
ресурс, initdb может быть выполнен с exec
если пакет не делает этого сам, и запуск службы service
ресурс.
Но заполнение базы данных, вероятно, не лучший вариант использования Puppet. Вероятно, вы могли бы сделать это с большим количеством пользовательского кода (например, с отдельным типом ресурса для таблицы, функции и т. Д.), Но это потребовало бы много работы и несколько неизведанной территории. Я предлагаю вам поискать другой способ сделать это.
Распространенным шаблоном при использовании марионетки является управление установкой, настройкой и статусом обслуживания пакета. Ваш последний шаг также может быть достигнут, если вы обеспечите идемпотентность. (Очень) простой скелет для такого рода задач:
class foo (
$some_param_in_hiera,
){
package {
'foo_pkg':
ensure => installed,
}
service {
'foo_svc':
ensure => running,
enable => true,
hasstatus => true,
require => Package['foo_pkg'];
}
file {
'/etc/foo/some.conf':
mode => '0644',
owner => root,
group => root,
source => 'puppet:///modules/foo/some.conf',
#content => template('foo/some.conf.erb'),
require => Package['foo_pkg'],
notify => Service['foo_svc'];
}
exec {
'some_task':
command => 'echo 'foo bar baz'',
refreshonly => true,
creates => '/some/file/to/ensure/idempotency'
}
}
Также проверьте Марионеточная кузница для уже существующего кода, который делает то, что вы хотите.