Chef:安装Windows服务

时间:2014-12-23 12:27:02

标签: windows service chef

我是这个论坛的新手(如果我发布了错误的地方,那么道歉)对厨师来说也很新。我一直在各地试图找到如何安装Windows服务的明确示例。

基本上我希望厨师相当于“SC create”

我正在尝试使用的食谱是:

windows_package "RMS_EU" do
  installer_type :msi
  action :install
  source "c:\Servies\V5.5\EUNTRouteManager\Routing.WindowsService.exe"
end

当我运行这个时,我收到错误,说msi有问题。

我尝试了这个脚本的多种变体,并且发现了如何安装一个非常稀疏的简单服务的明确信息。

所以有人知道我哪里出错了吗?正如我所说的那样,它应该在服务列表中显示为Windows服务。

文件已经在指定路径中的服务上,我运行Windows 2008 R2,使用PowerShell v4.0和最新的Chef客户端安装。

任何和所有帮助都会受到赞赏。

感谢您的反馈

此致

斯科特

3 个答案:

答案 0 :(得分:3)

要注意的一些事项,首先切换所有斜线,使其为"c:/Servies/V5.5/EUNTRouteManager/Routing.WindowsService.exe"。 Ruby和大多数编程语言都使用反斜杠作为转义序列来编码您通常看不到的字符,例如换行符为\n或制表符为\t

接下来是软件包安装,你告诉它文件是MSI,但它以.exe结束,所以这不太可能。从你的文本中我猜你实际上并没有尝试安装包文件,但是为了将来你必须将安装类型与已知类型之一(MSI,NSIS等)相匹配。

最后,要控制服务,您需要使用service or windows_service资源,但仍需要创建它。幸运的是,有一个隐藏的帮手:

ruby_block 'create service' do
  block do
     Chef::Application::WindowsServiceManager.new(
       service_name: "EUNTRouteManager",
       service_display_name: "Something",
       service_description: "Longer something.",
       service_file_path: "c:/Servies/V5.5/EUNTRouteManager/Routing.WindowsService.exe",
     ).run(%w{-a install})
  end
end

service 'EUNTRouteManager' do
  action [:enable, :start]
end

我没有Windows机器来测试它,但我认为它应该可以工作。

答案 1 :(得分:1)

在您的资源中,您正在使用windows_package资源。此资源不用于安装服务,而是安装以安装软件包(如使用安装向导的MSI)。 windows_package资源将调用计算机上的msiexec.exe,或者如果您指定,则调用自定义安装程序。

从可执行文件安装服务不是本机命令,但是有一种方法可以执行sc.exe来执行安装:

    execute "Installing Service <SERVICE_NAME>" do
        command "sc.exe create <SERVICE_NAME> binPath=<PHYSICAL_PATH_TO_EXE>
        action :run
        notifies :run, "execute[Setting Log On User For <SERVICE_NAME>]", :immediately
    end

您可能还希望将服务设置为以特定用户身份登录:

    execute "Setting Log On User For <SERVICE_NAME>" do
        command "sc.exe config \"<SERVICE_NAME>\" obj=<USER_NAME> password=<USER_PASSWORD>"
        action :nothing
    end

然后确保服务开始。

    service "<SERVICE_NAME>" do
        supports :status => true, :restart => true
        action [ :enable, :start ]
    end

注意事项!第一个资源块的操作是:run,然后每次在计算机上运行chef-client时运行。如果已经安装了服务,这将失败,因此代码最好围绕IF检查,或者在执行第一个代码块之前使用not_ifs查看服务是否已经存在。

答案 2 :(得分:0)

Obliviams的补充回答:

下面是一个如何使用nssm启动普通.exe作为服务并检查服务是否存在的示例(服务是nginx):

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>