Подписаться на новый файл (ы) в каталоге в 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",
}
Другие вопросы по тегам