puppet:覆盖文件之前停止服务

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

当我更新模板时,puppet 会覆盖/etc/foo.conf然后重新启动服务。

我的问题是我需要停止服务覆盖文件,因为当服务停止时,它会将内存中的配置写回到文件中。

有没有办法用 puppet 来做这件事?

答案1

看看过渡模块有了它,你可以做这样的事情:

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必須的。

答案2

你可以做这样的事情:

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命令组合成一个命令,如下所示

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

相关内容