Я хочу, чтобы файл "run" был создан ПОСЛЕ службы nginx, но также я хочу уведомить службу nginx об изменении запуска файла. Notify подразумевает, что он запускается ДО nginx.
Вариант использования следующий. Мы используем dj bernsteins daemontools для управления nginx. Поскольку нам нужно выполнить некоторые шаги (создание / etc / service, добавление файлов запуска ...), мы создаем определенный тип, который выполняет эти действия. Теперь мы не хотим, чтобы наш модуль nginx имел какое-либо соединение с модулем daemontools, поэтому мы не хотим подписываться на файл daemontools. Также подписка изменит цикл зависимостей. Я ищу что-то вроде: запускать модуль только тогда, когда модуль nginx полностью завершен.
class { daemontools:
file {'run':
require => Service[nginx],
notify => Service[nginx]; # <<< this wont do :(
}
}
class { nginx:
service { 'nginx': }
}
Любые идеи?
Томас
это была непростая задача, так как проблема меняется после первого запуска. Проблема, описанная в моем вопросе, возникает только тогда, когда сервер, который необходимо настроить, совершенно новый.
Первый запуск: дождитесь, пока все файлы будут скопированы (класс nginx завершен), а затем поместите файл запуска
Второй запуск: воспользуйтесь обычным подходом к уведомлению в файле запуска. на этот раз он может работать до службы. это не работает при первом запуске.
Поэтому мы решили это, добавив дополнительный файл состояния с именем nginx-ready.
поэтому в нашем определенном типе add_daemontools.pp
define daemontools::add_service {
file { "/etc/service/${service}/run":
ensure => file,
mode => 0755,
owner => root,
group => root,
content => template("daemontools/service.erb"),
path => "/etc/service/$service/run",
# create run file when service is ready
require => File["/var/run/${service}-ready"],
# notify implies before
notify => Service["${service}"],
}
}
и в нашем модуле создаем готовый файл, который зависит от всего необходимого.
class nginx ( ... params) {
...
file { '/var/run/nginx-ready':
require => [ Package[$nginx_dependencies], File[$nginx_files] ],
before => Service['nginx'],
content => 'ready file for daemontools',
}
}
Спасибо большое за помощь!
Вы можете попробовать использовать этапы если ваш вариант использования может справиться со своим ограничения.
stage { 'first':
before => Stage['main'],
}
stage { 'last': }
Stage['main'] -> Stage['last']
class { daemontools:
stage => last;
file {'run':
require => Service[nginx],
notify => Service[nginx];
}
}
class { nginx:
stage => last;
service { 'nginx': }
}