在puppet中,如何停止服务,执行某些操作然后启动服务?

时间:2014-12-24 11:34:46

标签: puppet

我需要在停止tomcat服务后执行一些操作(配置一些东西)。配置完成后,我需要确保tomcat服务再次启动并运行。我写了以下木偶代码:

Service {'tomcat': ensure => stopped }
->
class {'config':}
->
Service {'tomcat': ensure => running }

关于傀儡申请,它抱怨

  

'错误:重复声明:已声明Service [tomcat]   文件

如何解决此问题。木偶停止服务,执行某些操作然后再次恢复服务的方法是什么?

2 个答案:

答案 0 :(得分:5)

在木偶中,你不能再宣布同样的服务。那是你的错误。

使用puppet,您无需关心tomcat停止/启动过程。它关注最终状态(称为“同一性”)。在定义包,配置文件和服务之间的关系后,它将为您完成所有工作。例如,您需要了解puppet中的以下流程以及->~>之间的差异。

Package['tomcat'] -> File['server.xml']  ~> Service['tomcat']

在您的情况下,您在tomcat配置文件中应用更改,puppet将自动重启tomcat服务。

供您参考,以下是来自Introduction to Puppet博客的复制粘贴,用于说明幂等性的含义:

  

Puppet和大多数其他工具之间的一个重要区别就是Puppet   配置是幂等的,这意味着它们可以安全地运行多个   倍。开发配置后,您的机器将适用   配置经常 - 默认情况下,每30分钟 - 和Puppet   只有系统状态不会对系统进行任何更改   匹配配置状态。

2016年更新:

这是另一篇关于幂等性的官方Puppet博客文章:https://puppet.com/blog/idempotence-not-just-a-big-and-scary-word

答案 1 :(得分:1)

对于Puppet来说这是不可能的,因为@BMW正确地得出结论。不过,还有一些要点需要注意。

有一些有希望的work in progress会为过渡国家声明增加有限的支持。但是,这不会(至少在当前的alpha状态下)允许你进入这样一个状态,以准备和在整个班级的应用过程中。

此类问题的常见解决方法是使用两个或多个资源管理相关实体。 exec类型是一个很好的捕获所有解决方案,因为它几乎可以管理任何事情。明显的缺点是exec必须根据你的代理人量身定制(你知道什么 - 毕竟还有Puppet的类型系统;-)。假设清单仅适用于一个平台,这很简单:

exec {
    'stop-tomcat':
        command => 'service tomcat stop',
        onlyif  => 'service tomcat status',
        before  => [
            Class['config'],
            Service['config'],
        ],
}

exec之前订购Service['config'] 是多余的(因为service需要class),但最好表达一下service资源应该有最终决定权。