我需要在停止tomcat服务后执行一些操作(配置一些东西)。配置完成后,我需要确保tomcat服务再次启动并运行。我写了以下木偶代码:
Service {'tomcat': ensure => stopped }
->
class {'config':}
->
Service {'tomcat': ensure => running }
关于傀儡申请,它抱怨
'错误:重复声明:已声明Service [tomcat] 文件
如何解决此问题。木偶停止服务,执行某些操作然后再次恢复服务的方法是什么?
答案 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
资源应该有最终决定权。