扩展Chef Windows Cookbook ... DISM限制

时间:2014-04-17 21:10:56

标签: windows chef

我正在尝试使用Chef。

在WinServer 2012上安装.NET 3.5框架

然而,ms_dotnet35 cookbook不支持WinServer 2012.

所以我复制了它在cookbook中使用的代码来安装(from here)(原谅格式化):

if platform?('windows')
  unless File.exists?('C:/Windows/Microsoft.NET/Framework/v3.5')
      windows_feature 'NetFx3' do
        action :install
      end
    end 

else   Chef::Log.warn('Microsoft Framework .NET 3.5 can only be installed on the Windows platform.') 
end

然而,有一个障碍。当Chef运行时,“windows_feature”传递以下命令行:

C:\Windows\sysnative\dism.exe /online /enable-feature /featurename:NetFx3 /norestart

事实证明,在WinServer 2012上,您需要传递“/ all”参数,否则您将获得“可能未启用所需的父功能”。例外(from here

所以现在我正在查看windows cookbook(from here)中“windows_feature”的代码:

def install_feature(name)
  # return code 3010 is valid, it indicates a reboot is required
  shell_out!("#{dism} /online /enable-feature /featurename:#{@new_resource.feature_name} /norestart", {:returns => [0,42,127,3010]})
end

..我们在哪里找到对DISM的实际调用。

我推荐的扩展方式是什么?我应该只复制shell_out调用并破解DISM行以使其工作吗?

我是Chef的新手,希望遵循最佳实践/正确的范例。我不明白为什么当前的windows_feature实现没有提供输入像“/ all”这样的可选参数的方法。

2 个答案:

答案 0 :(得分:1)

我最终在新的食谱中创建了一个新配方来处理在Windows Server 2012上安装.Net Framework 3.5。

通过下载eval ISO from here,我能够找到所需的文件(因为我没有安装盘,我在Azure上)。

安装ISO后,我将整个.. \ Sources \ sxs文件夹压缩。

我的一个执行命令如下所示:

execute "install_net35" do
 command "C:/Windows/sysnative/dism.exe /online /enable-feature /all /featurename:NetFx3 /norestart /limitaccess /source:C:/tempdirectory/sxs"

...其中“C:/ tempdirectory / sxs”是解压缩文件。

我还将执行包装在Windows Server 2012的检查中:

if win_version.windows_server_2012? || win_version.windows_server_2012_r2?

..并检查框架是否已安装(以确保幂等性):

unless File.exists?('C:/Windows/Microsoft.NET/Framework/v3.5')

答案 1 :(得分:1)

根据文件,我相信你应该能够做到以下几点(没有经过测试 - 所以请随时纠正我!)

if platform?('windows')
  windows_feature 'NetFx3' do
    action :install
    all true
  end
else
  Chef::Log.warn('Microsoft Framework .NET 3.5 can only be installed on the Windows platform.') 
end

https://github.com/opscode-cookbooks/windows

  

all:布尔值。可选的。默认值:false。仅限DISM提供商。强制安装所有依赖项。

除非文件存在是必要的,否则windows_feature仅安装,除非安装。