我正在尝试使用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”这样的可选参数的方法。
答案 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
仅安装,除非安装。