使用Puppet启动和停止服务

时间:2016-03-15 15:06:10

标签: windows powershell windows-services puppet

我想停止服务,执行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。

1 个答案:

答案 0 :(得分:3)

Puppet不是程序性的

首先,你是以程序的方式思考这个问题。 Puppet不是一种程序性语言。它定义了您的最终状态。您想要定义exec应该在何时运行并让服务订阅它。

如何

这类似于package / file / service,您可以在文件更改时刷新(重新启动)服务。好的阅读时间为https://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.htmlhttp://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运行,或通过onlyifunless进行检查。

Windows细节

所以现在Windows的细节。在Windows上,与Linux不同,您无法简单地替换和/或更新锁定的文件。因此,exec需要检测服务是否存在,关闭它,然后进行更新。在您的情况下,如果服务尚未存在,您可能还需要它来创建服务。您也可以在不关闭服务的情况下更新凭据。

Puppet定义所需状态

exec不需要做的一件事就是将服务置于启动状态。这始终由服务资源处理。该服务将检测到它没有运行并在需要时自行启动。如果由于定义关系的方式exec['Do Stuf']运行,它也会重新启动。

Puppet Future

现在你应该用Puppet注意的东西!

您可以订阅,投票和评论这些内容。当我们知道用户和客户遇到问题时,它可以帮助我们确定工作的优先顺序。