3

私の質問はこれです:プログラムがインターネットに出ることを許可しないWinRMを介してchefを実行するときに、ある種の権限の問題はありますか?

Server 2012 Std で Chef 11.4.4 を使用して、SQL 2012 Std をデプロイしようとしています。私は2つの問題に遭遇しましたが、それらは関連していると思います:

windows_feature "NetFx3" do
  action :install
end

DISM は Microsoft Update に移動して .Net 3.5.1 ファイルをダウンロードすることになっているため、これは失敗します。RDP を介して手動で実行すると、正常にDISM /online /enable-feature /featurename:NetFx3 /norestart動作します。これは、基本的に windows_feature が実行するものです。

(DVD を入れて) レシピを実行DISM /online /enable-feature /featurename:NetFx3 /norestart /LimitAccess /Source:d:\sources\sxsすると、うまくいきます。これにより、オンラインでファイルをダウンロードする必要がなくなります。

2 つ目の問題は、SQL Server 2012 のセットアップが、インストール中に更新プログラムを探すためにオンラインになろうとすることです。/UpdateEnabled=false スイッチをインストール コマンドに追加すると、続行されます。私は使用しています

windows_package "Microsoft SQL Server 2012 (64-bit)" do
  source "\\\\10.200.1.240\\admin\\Installs\\SQL\\SQL2012Std\\setup.exe"
  timeout 3600 # 60min to just install sql will be fine. Default of 10min can be a bit short
  action :install
  installer_type :custom
  options "/ConfigurationFile=\"#{node['mssql']['installIni']}\" /SAPWD=\"#{node['mssql']['sapw']}\""
end

installIni ファイルには、UpdateSource=MU.

それが違いを生む場合、私はシェフを介して実行してknife winrm 192.168.170.145 'chef-client -c c:/chef/client.rb' -m -x nfoxいます。chef-clientadministrator:cmd ウィンドウから実行すると、この問題は発生しません。

4

1 に答える 1

0

はい、winrm (シェフの通信プロトコル) は、ローカルでコマンドを実行している場合と比較して、完全なユーザー "コンテキスト" を持っていません (ローカル管理者特権ユーザーまたはローカル管理者として実行している場合でも)。

前述の解決策は、マシン上で非同期に起動するスケジュールされたタスクを使用することです。これには完全なコンテキストがあるという利点がありますが、スケジュールされたタスクがいつ完了して削除し、続行するかを知る必要があるという欠点があります。スケジュールされたタスクを使用する限り、lwrp を含む Windows クックブックを使用する必要があります。

したがって、NetFx3 機能のインストールの解決策 (Microsoft SQL Server 2012 (64 ビット) のインストールの解決策は、同じスケジュールされたタスク アプローチを使用して実行できます):

  • エラーをキャッチし (これはレシピの最初の実行時にのみ発生します。機能がインストールされた後に実行するとエラーはスローされません)、スケジュールされたタスクで処理します。シェフのエラー処理は長いトピックですが、一言で言えば、シェフの実行の「コンパイル」段階でのみシェフのエラーをキャッチできます。それが end.run_action( :install ) が行っていることです)
  • スケジュールされたタスクを作成して実行する
  • 機能がインストールされるか、タイムアウトを超えるまでポーリングします
  • 機能のインストールの成功または失敗に関係なく、常にタスクを削除する
  • 機能のインストールの成功/失敗に基づいて続行します

を含む COOKBOOK/files/default/install_dotnetfx3.bat.erb を作成します。

dism.exe /online /enable-feature /featurename:NetFx3 /norestart

そして、これをあなたのレシピの一部として持ってください

begin
  windows_feature "NetFx3ServerFeatures" do
    action :nothing
  end.run_action( :install )

  windows_feature "NetFx3" do
    action :nothing
  end.run_action( :install )

rescue Mixlib::ShellOut::ShellCommandFailed => ex

  Chef::Log.error( "ShellCommandFailed was thrown during windows_feature NetFx3 install. Kicking off install via windows_task." )

  install_dotnet3_task   = 'install_dotnetfx3'
  install_dotnet3_script = 'C:\Chef\install_dotnetfx3.bat'

  # :create cookbook_file in "compile" phase
  cookbook_file install_dotnet3_script do
    source 'install_dotnetfx3.bat.erb'
    action :nothing
  end.run_action( :create )

  # :create windows_task in "compile" phase
  windows_task install_dotnet3_task do
    user Administrator
    password XXXXXXX
    command install_dotnet3_script 
    run_level :highest
    action :nothing  
    frequency :minute
    frequency_modifier 10
  end.run_action( :create )

  # :run windows_task in "compile" phase
  windows_task install_dotnet3_task do
    action :nothing
  end.run_action( :run )

  featureInstalled = false
  iteration = 0
  # number of sleeps each sleep_period seconds (total_sleep_period =     max_dotnet3_install_via_task_loop_counter * sleep_period)
  max_dotnet3_install_via_task_loop_counter = 10
  sleep_period = 20 # in sec
  loop do

    # Check if feature is installed
    featureInstalled = shell_out( "dism /online /get-featureinfo /FeatureName:NetFx3 | find \"State : Enabled\"" ).exitstatus == 0 
    break if featureInstalled || ( iteration += 1 ) > max_dotnet3_install_via_task_loop_counter

    # sleep for sleep_period seconds
    sleep sleep_period

    log "Inside of polling loop for installation (taking #{(iteration * sleep_period)} seconds) of feature via windows_task." do
      level :info
      action :nothing
    end.run_action( :write )
  end

  # Always :delete windows_task (so that it won't fire again with frequency above) in "compile" phase regardless of whether 
  # installation via task succeeded or failed.
  windows_task install_dotnet3_task do
    action :nothing
  end.run_action( :delete )

  if featureInstalled
    log "Installation of the feature via windows_task succeeded." do
      level :info
      action :nothing
    end.run_action( :write )
  else
    # Raise exception if installation via windows_task failed
    raise "Installation of the feature via windows_task timed out within #{(max_dotnet3_install_via_task_loop_counter * sleep_period)} seconds. Try increasing install_via_task_max_poll_counter attribute and re-try."
  end
end
于 2015-10-31T06:22:40.733 に答える