Chef:Windows 2008r2节点:无法使用rubyinstaller安装Ruby

时间:2013-07-05 14:53:43

标签: chef chef-windows

我是Chef的新手,所以我的问题似乎有点不明白。

我正在运行一个Chef服务器(v11.4)。我的Chef工作站运行MRI Ruby 1.9.3和gems knife-ec2(v0.6.4)和刀窗(v0.5.12)。

我正在尝试在安装了Ruby的Amazon AWS上设置Windows 2008r2服务器。我可以通过运行(在命令行窗口的Windows框中)以静默,无人值守和手动方式执行此操作:

C:\> C:/rubyinstaller-1.9.3-p429.exe /silent /dir='c:\Ruby193' /tasks=’modpath’

我想使用Chef来实现自动化。

我尝试在以下配方片段中使用windows_batch:

remote_file File.join("C:","rubyinstaller-1.9.3-p429.exe") do
    source "http://mybucketxxx.s3-website-us-east-1.amazonaws.com/rubyinstaller-1.9.3-p429.exe"
    not_if {::File.exists?(File.join("c:","rubyinstaller-1.9.3-p429.exe"))}
end  

windows_batch "install_ruby" do
    cwd "C:/"
    code "C:/rubyinstaller-1.9.3-p429.exe /silent /dir=\'c:/Ruby193' /tasks=’modpath’"
    only_if {::File.exists?(File.join("c:","rubyinstaller-1.9.3-p429.exe"))}
    not_if {::File.exists?(File.join("c:", "Ruby193", "bin", "ruby.exe"))}
end

我将配方上传到Chef服务器,然后运行以下命令以触发Chef运行:

> knife winrm 'ec2-50-xx-xx-124.amazonaws.com' 'chef-client -c c:/chef/client.rb' -m -x Administrator -P 'password'

在这种情况下,remote_file正常工作,并且下载了ruby安装程序。但是,windows_batch挂起,安装无处可去。我知道这一点,因为当我RDP进入Windows服务器时,rubyinstaller-1.9.3-p429.exe文件就坐在c:中。而且我知道安装程序挂了,因为我在刀工作站上收到一条消息,说Ruby安装程序已启动,但它最终超时了。并且Windows服务器上没有安装任何内容。

然后我尝试用windows_package替换windows_batch片段。

windows_package "rubyinstaller-1.9.3-p429" do
    #source "C:/rubyinstaller-1.9.3-p429.exe"
    source "http://mybucketxxx.s3-website-us-east-1.amazonaws.com/rubyinstaller-1.9.3-p429.exe"
    options "/silent /dir='C:/Ruby193' /tasks='modpath'"
    installer_type :inno
    action :install
end

我尝试使用本地源选项注释掉上面的部分,然后再次使用远程源选项注释掉它。两个人都没有工作。 Ruby安装程序挂了。这是最后几行的样子:

ec2-50-xx-xx-124.amazonaws.com [2013-07-05T13:00:21+00:00] INFO: Processing windows_package[rubyinstaller-1.9.3-p429] action install (myrecipe::default line 53)
DEBUG: :relay_output_from_backend => ["ec2-50-xx-xx-124.amazonaws.com", "[2013-07-05T13:00:21+00:00] INFO: Installing windows_package[rubyinstaller-1.9.3-p429] version latest\r\n"]
ec2-50-xx-xx-124.amazonaws.com [2013-07-05T13:00:21+00:00] INFO: Installing windows_package[rubyinstaller-1.9.3-p429] version latest
DEBUG: :relay_output_from_backend => ["ec2-50-xx-xx-124.amazonaws.com", "[2013-07-05T13:00:21+00:00] INFO: Starting installation...this could take awhile.\r\n"]
ec2-50-xx-xx-124.amazonaws.com [2013-07-05T13:00:21+00:00] INFO: Starting installation...this could take awhile.

在请求超时之前,它会一直保持这种状态。没有安装Ruby。

这导致了一些问题:

  1. 我是否遗漏了windows_batch或windows_package语法中的内容,导致我无法以无人值守的方式安装Ruby,无法自动使用Chef?
  2. 有没有办法确定在命令行上运行哪个命令来安装Ruby?例如日志文件,详细模式等?
  3. 有没有人使用Chef和rubyinstaller在Windows上安装Ruby,你能提供配方吗?

2 个答案:

答案 0 :(得分:1)

这个问题通过两个非常微妙的调整解决了:

  1. 第一个调整是标题。使用安装程序手动安装Ruby时,必须转到Windows控制面板,找到要卸载它的Ruby程序。当您找到它时,您将在已安装程序列表中看到Ruby的一个非常具体的名称。 (这是“显示名称”,它也位于Windows注册表中,用于安装该软件)。我看到了“Ruby 1.9.3-p448”。这就是windows_package之后必须要做的事情。使用“显示名称”可确保如果Chef再次运行,如果已存在,则不会重新安装相同的Ruby。
  2. 第二个调整是引用Ruby字符串。双引号会产生问题,特别是如果您不完全了解哪些字符必须转义。当您使用单引号时,问题就会消失,因为单引号非常直观。
  3. 因此,这就是使用Ruby安装程序静默安装Ruby的工作Chef资源/提供程序代码,如下所示:

    windows_package "Ruby 1.9.3-p448" do
        source File.join("C:", "rubyinstaller-1.9.3-p448.exe")
        options '/dir="C:/Ruby193" /tasks="modpath"'
        installer_type  :inno
        action :install
    end
    

    非常感谢Opscode的Isa Farnik提供的帮助。

答案 1 :(得分:0)

你需要在windows_package的选项

中转义'

电流:

options "/silent /dir='C:/Ruby193' /tasks='modpath'"

转义

options "/silent /dir=\'C:/Ruby193\' /tasks=\'modpath\'"

否则会挂起尝试解析选项。