使用 Puppet 启动和停止服务

Starting and Stopping Services with 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。

人偶不是程序化的

首先,你是在程序上考虑这个问题。 Puppet 不是一种程序语言。它定义了你的最终状态。您想改为定义 exec 应该 运行 幂等的时间并让服务订阅它。

如何

这类似于 package/file/service,您可以在文件更改时刷新(重新启动)服务。 https://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html and 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, or through either a check with onlyif or unless

Windows 细节

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

Puppet 定义所需状态

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

人偶未来

现在介绍您应该关注 Puppet 的内容!

您可以订阅、投票和发表评论。当我们知道用户和客户遇到的问题时,它可以帮助我们确定工作的优先级。