Получилась такая упрощенная конфигурация:
file {
'/etc/foo.conf':
ensure => file,
content => epp('my_module/etc/foo.conf.epp'),
;
}
service {
'foo':
ensure => running,
enable => true,
subscribe => File['/etc/foo.conf'],
;
}
Когда я обновляю шаблон, марионетка перезаписывает /etc/foo.conf
затем перезапустите службу.
Моя проблема в том, что мне нужно остановить службу перед перезапись файла, потому что, когда служба останавливается, она записывает конфигурацию, которая хранится в памяти, в файл.
Есть ли способ сделать это с марионеткой?
Взгляните на модуль перехода. С этим вы можете сделать что-то вроде этого:
transition { 'stop foo service':
resource => Service['foo'],
attributes => { ensure => stopped },
prior_to => File['/etc/foo.conf'],
}
file { '/etc/foo.conf':
ensure => file,
content => epp('my_module/etc/foo.conf.epp'),
}
service { 'foo':
ensure => running,
enable => true,
subscribe => File['/etc/foo.conf'],
}
Нет exec
требуется.
Вы можете сделать что-то вроде этого:
file { '/etc/foo.conf.tmp':
ensure => file,
content => epp('my_module/etc/foo.conf.epp'),
}
exec { 'stop service':
command => 'service foo stop',
refreshonly => true,
subscribe => File['/etc/foo.conf.tmp']
}
exec { 'update file':
command => 'cp /etc/foo.conf.tmp /etc/foo.conf',
subscribe => Exec['stop service'],
refreshonly => true,
}
exec { 'start service':
command => 'service foo start',
subscribe => Exec['update file'],
refreshonly => true,
}
В refreshonly
атрибут exec
ресурс гарантирует, что команда запускается только при получении события, в данном случае через subscribe
атрибут. В этом случае он остановит сервер и скопирует в новый файл настроек только при изменении файла настроек tmp. Файл tmp позволит вам управлять своими настройками на сервере без перезаписи службы.
Вы можете объединить эти три exec
s в одну команду, вот так
file { '/etc/foo.conf.tmp':
ensure => file,
content => epp('my_module/etc/foo.conf.epp'),
}
exec { 'update settings':
command => 'service foo stop && cp /etc/foo.conf.tmp /etc/foo.conf && service foo start',
refreshonly => true,
subscribe => File['/etc/foo.conf.tmp']
}