我得到了以下简化的配置:
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']
}