Puppet:有条件地重启服务
Puppet: conditional restart of service
是否可以有条件地跳过 service
资源上的刷新事件?或者:是否可以在通知 class 时阻止刷新 class 中的 service
资源?
上下文:我有一个包含以下清单(简化)的 Puppet 模块:
class foo(
Boolean pre_process_service = true,
Boolean auto_restart_service = true
) {
if $pre_process_service {
exec { 'process config':
... # details including a pretty complex command - should be hidden in my module
notify => Service['foo'],
}
}
service { 'foo':
ensure => 'running',
enable => true,
}
}
可以这样使用:
file { 'config':
... # copies config from somewhere
}
class { 'foo':
auto_restart_service => false,
subscribe => File['config'],
}
用户指定auto_restart_service => false
时如何避免重启服务?
请注意,模块的用户决定如何提供配置(复制文件、签出 Git 存储库,...),所以我不能在我的模块中执行此操作。相反,class 订阅提供配置的资源。只要用户使用默认值 auto_restart_service = true
一切正常,甚至禁用配置预处理也能正常工作。但是,当用户指定 auto_restart_service = false
时,服务仍将重新启动,因为 service
资源在通知 class 时刷新。像我对 exec
资源所做的那样将服务资源包装到 if
块中也不起作用,因为 service
资源执行多项操作:
- 如果不是 运行
,它会启动服务
- 如果未启用,则启用该服务
- 如果收到通知,它会重新启动服务
我只想在始终执行 (1) 和 (2) 的同时有条件地防止 (3) 发生。有办法吗?
我认为没有办法在您通知 class 时不刷新服务。但是,您可以尝试使用 service
资源的 restart
属性有条件地覆盖 Puppet 重启服务的方式。
像这样:
if $auto_restart_service {
# Let the provider handle the restart
$_attr = {}
} else {
# Let Puppet execute `true` instead of actually restarting the service
$_attr = { 'restart' => '/usr/bin/true' }
}
service { 'foo':
ensure => 'running',
enable => true,
* => $_attr,
}
tectux 的想法非常好。我增强了 if 条件。我决定为自定义事实使用脚本。
modules/autofs/facts.d/autofs.sh
#!/bin/sh
DECISION=`test -f /usr/bin/docker && /usr/bin/docker ps -q |grep -q . && echo no`
if [ "x$DECISION" == "x" ] ; then
DECISION=yes
fi
echo '{'
echo ' "autofs": {'
echo " \"do_automatic_restart\": \"$DECISION\""
echo ' }'
echo '}'
所以,脚本的输出
# modules/autofs/facts.d/autofs.sh
{
"autofs": {
"do_automatic_restart": "yes"
}
}
现在我们可以使用自定义事实了
if $facts['autofs']['do_automatic_restart'] == "no" {
$_attr = { 'restart' => "logger puppet agent: automounter is NOT going to be RESTARTED due to active containers on a host" }
} else {
$_attr = {}
}
是否可以有条件地跳过 service
资源上的刷新事件?或者:是否可以在通知 class 时阻止刷新 class 中的 service
资源?
上下文:我有一个包含以下清单(简化)的 Puppet 模块:
class foo(
Boolean pre_process_service = true,
Boolean auto_restart_service = true
) {
if $pre_process_service {
exec { 'process config':
... # details including a pretty complex command - should be hidden in my module
notify => Service['foo'],
}
}
service { 'foo':
ensure => 'running',
enable => true,
}
}
可以这样使用:
file { 'config':
... # copies config from somewhere
}
class { 'foo':
auto_restart_service => false,
subscribe => File['config'],
}
用户指定auto_restart_service => false
时如何避免重启服务?
请注意,模块的用户决定如何提供配置(复制文件、签出 Git 存储库,...),所以我不能在我的模块中执行此操作。相反,class 订阅提供配置的资源。只要用户使用默认值 auto_restart_service = true
一切正常,甚至禁用配置预处理也能正常工作。但是,当用户指定 auto_restart_service = false
时,服务仍将重新启动,因为 service
资源在通知 class 时刷新。像我对 exec
资源所做的那样将服务资源包装到 if
块中也不起作用,因为 service
资源执行多项操作:
- 如果不是 运行 ,它会启动服务
- 如果未启用,则启用该服务
- 如果收到通知,它会重新启动服务
我只想在始终执行 (1) 和 (2) 的同时有条件地防止 (3) 发生。有办法吗?
我认为没有办法在您通知 class 时不刷新服务。但是,您可以尝试使用 service
资源的 restart
属性有条件地覆盖 Puppet 重启服务的方式。
像这样:
if $auto_restart_service {
# Let the provider handle the restart
$_attr = {}
} else {
# Let Puppet execute `true` instead of actually restarting the service
$_attr = { 'restart' => '/usr/bin/true' }
}
service { 'foo':
ensure => 'running',
enable => true,
* => $_attr,
}
tectux 的想法非常好。我增强了 if 条件。我决定为自定义事实使用脚本。
modules/autofs/facts.d/autofs.sh
#!/bin/sh
DECISION=`test -f /usr/bin/docker && /usr/bin/docker ps -q |grep -q . && echo no`
if [ "x$DECISION" == "x" ] ; then
DECISION=yes
fi
echo '{'
echo ' "autofs": {'
echo " \"do_automatic_restart\": \"$DECISION\""
echo ' }'
echo '}'
所以,脚本的输出
# modules/autofs/facts.d/autofs.sh
{
"autofs": {
"do_automatic_restart": "yes"
}
}
现在我们可以使用自定义事实了
if $facts['autofs']['do_automatic_restart'] == "no" {
$_attr = { 'restart' => "logger puppet agent: automounter is NOT going to be RESTARTED due to active containers on a host" }
} else {
$_attr = {}
}