Puppet:有条件地重新启动服务

Puppet:有条件地重新启动服务,puppet,Puppet,是否可以有条件地跳过服务资源上的刷新事件?或者:当通知类时,是否可以防止类内的服务资源被刷新 上下文:我有一个Puppet模块,包含以下清单(简化): class-foo( 布尔预处理服务=true, 布尔值自动重新启动服务=true ) { if$pre_过程_服务{ exec{“进程配置”: …#包括相当复杂的命令在内的详细信息应该隐藏在我的模块中 notify=>Service['foo'], } } 服务{'foo': 确保=>“正在运行”, enable=>true, } } 可以

是否可以有条件地跳过
服务
资源上的刷新事件?或者:当通知类时,是否可以防止类内的
服务
资源被刷新


上下文:我有一个Puppet模块,包含以下清单(简化):

class-foo(
布尔预处理服务=true,
布尔值自动重新启动服务=true
) {
if$pre_过程_服务{
exec{“进程配置”:
…#包括相当复杂的命令在内的详细信息应该隐藏在我的模块中
notify=>Service['foo'],
}
}
服务{'foo':
确保=>“正在运行”,
enable=>true,
}
}
可以这样使用:

文件{'config':
…#从某处复制配置
}
类{'foo':
自动重新启动\u服务=>false,
订阅=>File['config'],
}
当用户指定
auto\u restart\u service=>false
时,如何避免重新启动服务

请注意,模块的用户决定如何提供配置(复制文件、签出Git存储库等等),因此我不能在模块内这样做。相反,类订阅提供配置的资源。只要用户使用默认的
auto\u restart\u service=true
一切正常,甚至禁用配置的预处理也能正常工作。但是,当用户指定
auto\u restart\u service=false
时,服务仍将重新启动,因为在通知类时,
service
资源将被刷新。将服务资源包装到
if
块中,就像我对
exec
资源所做的那样,也不起作用,因为
服务
资源执行多个操作:

  • 如果服务未运行,它将启动该服务
  • 如果未启用该服务,它将启用该服务
  • 如果收到通知,它将重新启动服务

  • 我只想有条件地阻止(3)的发生,同时总是做(1)和(2)。有什么方法可以做到这一点吗?

    我不认为有什么方法可以在通知班级时不刷新服务。但是,您可以尝试使用
    服务
    资源的
    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,
    }
    

    我不认为在你通知全班的时候没有办法不刷新服务。但是,您可以尝试使用
    服务
    资源的
    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条件。我已决定使用自定义事实脚本

    模块/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 = {}                                                                                                                                                                                  
    }                                                                                                                                                                                                
    

    来自tectux的想法真的很好。我增强了if条件。我已决定使用自定义事实脚本

    模块/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 = {}                                                                                                                                                                                  
    }