我想停止服务,执行Powershell脚本,然后使用Puppet再次启动服务。以下代码无效,因为My Service
定义了两次。
service { 'My Service':
ensure => 'stopped',
require => Package['Install Go Agent']
}
exec { 'Do Stuff':
command => '...',
provider => powershell,
require => Service['Go Agent']
}
service { 'My Service':
ensure => 'started',
require => Exec['Install Go Agent']
}
本质上,我的Powershell脚本正在设置Windows服务用户名和密码,遗憾的是,你无法使用Puppet。
答案 0 :(得分:3)
首先,你是以程序的方式思考这个问题。 Puppet不是一种程序性语言。它定义了您的最终状态。您想要定义exec应该在何时运行并让服务订阅它。
这类似于package / file / service,您可以在文件更改时刷新(重新启动)服务。好的阅读时间为https://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html和http://www.puppetcookbook.com/posts/restart-a-service-when-a-file-changes.html。
package { 'My Package':
ensure => latest,
}
exec { 'Do Stuff':
command => '...',
#onlyif/unless => '...', #make it idempotent
#refreshonly => true #make it idempotent
provider => powershell,
require => Package['My Package']
}
service { 'My Service':
ensure => 'started',
require => Exec['Do Stuff']
}
您肯定需要确保PowerShell不会每次only if it is refreshed运行,或通过onlyif或unless进行检查。
所以现在Windows的细节。在Windows上,与Linux不同,您无法简单地替换和/或更新锁定的文件。因此,exec需要检测服务是否存在,关闭它,然后进行更新。在您的情况下,如果服务尚未存在,您可能还需要它来创建服务。您也可以在不关闭服务的情况下更新凭据。
exec不需要做的一件事就是将服务置于启动状态。这始终由服务资源处理。该服务将检测到它没有运行并在需要时自行启动。如果由于定义关系的方式exec['Do Stuf']
运行,它也会重新启动。
现在你应该用Puppet注意的东西!
您可以订阅,投票和评论这些内容。当我们知道用户和客户遇到问题时,它可以帮助我们确定工作的优先顺序。