Назад | Перейти на главную страницу

Укажите поставщика Chef для windows_feature

Первоначально я задавал этот вопрос в 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.