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. 如果未启用,则启用该服务
  4. 如果收到通知,它会重新启动服务

我只想在始终执行 (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 = {}                                                                                                                                                                                  
}