Подписаться на новый файл (ы) в каталоге в Puppet
Я знаю, что могу синхронизировать каталог в Puppet:
file { 'sqls-store':
path => '/some/dir/',
ensure => directory,
source => "puppet:///modules/m1/db-updates",
recurse => true,
purge => true
}
Поэтому, когда новые файлы добавляются, они копируются в "/ some / dir /". Однако мне нужно выполнить некоторые действия для каждого нового файла. Если я "подписываюсь" на такой ресурс, я не получаю массив новых файлов. В настоящее время я создал скрипт внешней оболочки, который находит новые файлы в этом каталоге и выполняет действие для каждого из них. Естественно, я бы предпочел не зависеть от внешнего скрипта. Есть ли способ сделать это с Puppet?
Спасибо!
Вариант использования для этого заключается в применении изменений в схеме БД, которые время от времени вносятся и должны применяться ко всем клиентам, управляемым puppet. В конце концов это mysql [args] < update.sql
для каждого такого файла.
2 ответа
Не уверен, что я бы порекомендовал, чтобы марионетка применила для меня изменения в БД.
Для маленьких БД это может работать, но для реального мира БД... вы хотите знать, когда и как были применены изменения такого рода (порядок изменений, иногда требуется временная настройка дискового пространства, время простоя БД, резервное копирование перед / после, reorg,...), в большинстве случаев ваше приложение должно быть адаптировано одновременно. Вы хотите больше оркестровки (а кукольный не очень хорош в оркестровке)
Почему бы не использовать инструмент, предназначенный для этой задачи, как
- жидкость-база
- рельсы дБ миграции и капистрано
- ...
Плохое решение было бы использовать модуль vcs-repo и exec для вывода списка измененных файлов с момента последнего "применения".
Я согласен с mestachs, кукольный, имеющий дело с обновлениями БД, это не очень хорошая идея
Вы можете попробовать какое-то определение:
define mydangerousdbupdate($name, $filename){
file { "/some/dir/$filename":
ensure => present,
source => "puppet:///modules/m1/db-updates/$filename",
}
exec{"apply $name":
command => "/usr/bin/mysql [args] < /some/dir/$filename > /some/dir/$filename.log",
creates => "/some/dir/$filename.log"
}
}
И затем, вы можете создавать экземпляры с различными исправлениями, в предпочтительном порядке
mydangerousdbupdate{"first_change":
name => "first",
filename => "first.sql",
}->mydangerousdbupdate{"second_change":
name => "second",
filename => "second.sql",
}