Первоначально я задавал этот вопрос в StackOverflow, но не получил никаких рабочих ответов: https://stackoverflow.com/questions/18648713/specify-chef-provider-for-windows-feature.
Я пытаюсь использовать Chef (chef-solo) для управления установкой Windows Server 2008 R2. Шеф-повар обеспечивает windows_feature
для добавления ролей / функций на сервер Windows. По умолчанию, windows_feature
использует DISM для установки ролей (если есть). Однако, насколько мне известно, не все роли (например, RDS-RD-Server) можно добавить через DISM.
Я мог бы предположительно использовать Chef::Provider::WindowsFeature::ServerManagerCmd
(указано в файле сведений о кулинарной книге Windows: https://github.com/opscode-cookbooks/windows), но не похоже, что это настоящий класс (просматривая там исходный код). Кроме того, servermanagercmd устарел (хотя он будет работать).
Я не возражал бы даже использовать блок PowerShell для добавления роли, но мне трудно обеспечить идемпотентность. Похоже, что not_if
Командная оболочка - это какая-то странная оболочка mingwin, а не 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
Каким образом шеф-повар рекомендовал бы добавить эту роль?
Основываясь на документации Chef для LWRP, я думаю, что фактическое имя класса для LWRP в кулинарной книге Windows
Chef::Provider::WindowsFeatureServermanagercmd
Таким образом, вы должны использовать что-то вроде
windows_feature 'RDS-RD-Server' do
provider Chef::Provider::WindowsFeatureServermanagercmd
end
Решение Хольгера Джаста работает более или менее, хотя 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
.