为 windows_feature 指定 Chef 提供程序

为 windows_feature 指定 Chef 提供程序

我最初在 StackOverflow 上提出这个问题,但没有收到任何可行的答案:https://stackoverflow.com/questions/18648713/specify-chef-provider-for-windows-feature

我正在尝试使用 Chef (chef-solo) 来管理我的 Windows Server 2008 R2 安装。Chef 提供windows_feature向 Windows 服务器添加角色/功能的功能。默认情况下,windows_feature使用 DISM 安装角色(如果可用)。但是,据我所知,并非所有角色(例如 RDS-RD-Server)都可以通过 DISM 添加。

我大概可以使用Chef::Provider::WindowsFeature::ServerManagerCmd(在 Windows cookbook readme 中标识:https://github.com/opscode-cookbooks/windows),但它看起来不像是一个真正的类(浏览那里的源代码)。此外,servermanagercmd 已被弃用(尽管它可以工作)。

我甚至不介意使用 powershell 块来添加角色,但我很难确保幂等性。not_if命令 shell 似乎是一些奇怪的 mingwin shell,而不是 CMD。

这是我使用 powershell 尝试过的示例(不起作用):

powershell "install_rds_server" do
  code %Q{
    Import-Module Servermanager
    Add-WindowsFeature RDS-RD-Server
  }.strip
  not_if %Q{
    powershell "Import-Module Servermanager; $check = get-windowsfeature -name RDS-RD-Server; if ($check.Installed -ne \"True\") { exit 1 }"
  }.strip
end

我还尝试了以下操作:

windows_feature 'RDS-RD-Server' do
  provider Chef::Provider::WindowsFeature::ServerManagerCmd
end

返回以下错误:

FATAL: NameError: uninitialized constant Chef::Provider::WindowsFeature::ServerManagerCmd

厨师推荐的添加此角色的方法是什么?

答案1

根据 Chef 的 LWRP 文档,我认为 Windows Cookbook 中 LWRP 的实际类名是

Chef::Provider::WindowsFeatureServermanagercmd

因此你应该使用类似

windows_feature 'RDS-RD-Server' do
  provider Chef::Provider::WindowsFeatureServermanagercmd
end

答案2

Holger Just 的解决方案或多或少是有效的,尽管servermanagercmd.exe弃用消息会导致一些问题。以下是我最终解决问题的方法:

ps_64 = 'C:\Windows\sysnative\WindowsPowershell\v1.0\powershell.exe'

powershell "install_rds_server" do
  code %Q{
    Import-Module Servermanager
    Add-WindowsFeature RDS-RD-Server
  }.strip
  not_if %Q{
    #{ps_64} "Import-Module Servermanager; $check = get-windowsfeature -name RDS-RD-Server; if ($check.Installed -ne 'True') { exit 1 }"
  }.strip
end

我最初的基于 Powershell 的解决方案不起作用,因为通用powershell命令正在启动 32 位 Powershell。此解决方案仍然非常不可靠,但我更喜欢它而不是使用已弃用的servermanagercmd.exe

相关内容