【问题标题】:Extending Chef Windows Cookbook...DISM limitations扩展 Chef Windows Cookbook...DISM 限制
【发布时间】:2014-06-11 14:10:51
【问题描述】:

我正在尝试使用 Chef 在 WinServer 2012 上安装 .NET 3.5 框架。

但是,ms_dotnet35 说明书不支持 WinServer 2012。

所以我已经复制了它在食谱中使用的代码来安装 (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 食谱 (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”)的方法。

【问题讨论】:

    标签: windows chef-infra


    【解决方案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')
    

    【讨论】:

    • 你能把整个食谱部分放在这里吗?我喜欢逐行描述,但很高兴看到整个食谱“块”......
    • 您在哪部分遇到问题?我从 Git 复制了配方,只做了上面列出的更改。
    • win_version 是从哪里来的?我以前没见过。我设法实现了其余的。我压缩了 sxs 文件夹和所有内容。我只是要一张“完整”的照片而不是碎片……
    • 你一定错过了我上面原始帖子中的 URL...github.com/Webtrends/ms_dotnet35/blob/master/recipes/default.rb
    • 接受我自己的答案,因为我得到了它的工作,没有其他用户提出不同的方法。
    【解决方案2】:

    根据文档,我相信您应该能够执行以下操作(尚未测试 - 请随时纠正我!)

    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

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

    除非文件存在不是必需的,windows_feature 只安装除非已安装。

    【讨论】:

    • 我从您的问题和其他答案中复制了它。令人困惑的是,我确实认为它是 .NET 3.5
    • 在我最初的问题中,我提到调用 DISM 的 Chef 包装器 (windows_feature) 排除了 WinServer 2012 所需的 /all 标志。
    • 您是否在windows_feature 块中包含all true 行?
    • 现在看起来像这样在文档中显示:github.com/opscode-cookbooks/windows/blob/master/README.md“使用 DVD 上的存储库文件在 Server 2012 上启用 .Net 3.5.1 并安装所有依赖项”看来您确实需要提供DVD 中 sxs 文件的路径(请参阅我当前的答案)。我可能需要几周的时间来尝试这个,但如果它有效,我会选择你的答案并在任务部分进行编辑。谢谢!
    • 你是如何使用这种方法的?我只是从使用 Win2k12 R2 iso 文件的 Packer/Vagrant 进程开始,我假设它包含所需的源文件,这些文件可以复制到本地文件夹并在以后的 Chef 配置中使用......你的问题+答案是帮了大忙!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    相关资源
    最近更新 更多