Укажите провайдера 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 (определено в readme для 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

Какой шеф-повар рекомендовал бы добавить эту роль?

2 ответа

Решение

Основываясь на документации 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,

Другие вопросы по тегам