![为 windows_feature 指定 Chef 提供程序](https://linux22.com/image/804138/%E4%B8%BA%20windows_feature%20%E6%8C%87%E5%AE%9A%20Chef%20%E6%8F%90%E4%BE%9B%E7%A8%8B%E5%BA%8F.png)
我最初在 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
。