1

私はChefを初めて使用するので、私の質問はやや情報が不足しているように見えるかもしれません.

Chef サーバー (v11.4) を実行しています。私の Chef ワークステーションは、MRI Ruby 1.9.3 と gems knife-ec2 (v0.6.4) および knife-windows (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 がハングし、インストールがどこにも進みません。WindowsサーバーにRDPしたとき、rubyinstaller-1.9.3-p429.exeファイルがc:にあったので、これを知っています。そして、Ruby インストーラーが開始されたというメッセージがナイフ ワークステーションに表示されたため、インストーラーがハングしたことはわかっていましたが、最終的にはタイムアウトしました。また、Windows サーバーには何もインストールされていません。

次に、windows_batch フラグメントを windows_package に置き換えてみました。

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. Ruby をサイレント インストール、無人インストール、Chef を使用した自動インストールを妨げている、windows_batch または windows_package 構文の何かが欠けていますか?
  2. Rubyをインストールするためにコマンドラインで実行されているコマンドを正確に確認する方法はありますか? 例: ログ ファイル、詳細モードなど?
  3. Chef と ruby​​installer を使用して Ruby を Windows にインストールした人はいますか? レシピを教えてもらえますか?
4

2 に答える 2

1

この問題は、2 つの非常に微妙な調整で解決されました。

  1. 最初の微調整はタイトルでした。インストーラーを使用して手動で Ruby をインストールする場合は、Windows コントロール パネルに移動し、Ruby プログラムを見つけてアンインストールする必要があります。それが見つかると、インストールされているプログラムのリストに Ruby の非常に具体的な名前が表示されます。(これは「表示名」であり、インストールされているソフトウェアの Windows レジストリにもあります)。「Ruby 1.9.3-p448」を見ました。これは、windows_package の後に行う必要があります。そして、その「表示名」を使用すると、Chef が再度実行された場合に、同じ Ruby が既に存在する場合は再インストールされません。
  2. 2 番目の微調整は、Ruby 文字列の引用です。二重引用符は、特にどの文字をエスケープする必要があるかを完全に理解していない場合に問題を引き起こします。一重引用符を使用すると、一重引用符は非常に文字通りであるため、問題はなくなります。

したがって、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 に感謝します。

于 2013-07-16T14:30:40.043 に答える