Назад | Перейти на главную страницу

puppet: остановить службу перед перезаписью файла

Получилась такая упрощенная конфигурация:

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 позволит вам управлять своими настройками на сервере без перезаписи службы.

Вы можете объединить эти три execs в одну команду, вот так

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']
}