Especifique o provedor Chef para windows_feature

1

Eu fiz essa pergunta originalmente no StackOverflow, mas não recebi nenhuma resposta em funcionamento: link .

Estou tentando usar o Chef (chef-solo) para gerenciar minha instalação do Windows Server 2008 R2. Chef fornece windows_feature para adicionar funções / recursos a um servidor Windows. Por padrão, windows_feature usa o DISM para instalar funções (se disponível). No entanto, que eu saiba, nem todas as funções (por exemplo, RDS-RD-Server) podem ser adicionadas via DISM.

Eu poderia usar Chef::Provider::WindowsFeature::ServerManagerCmd (identificado no livro de receitas do Windows: link ), mas não parece que é uma classe real (navegando o código fonte lá). Além disso, servermanagercmd é obsoleto (embora funcione).

Eu não me importaria em usar um bloco powershell para adicionar o papel, mas estou tendo dificuldade em garantir a idempotência. Parece que o shell de comando not_if é um shell mingwin estranho em vez de CMD.

Aqui está uma amostra do que eu tentei usar o powershell (não funciona):

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

Eu também tentei o seguinte:

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

que retorna o seguinte erro:

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

Qual seria a maneira recomendada pelo Chef de adicionar esse papel?

    
por kardeiz 09.09.2013 / 23:18

2 respostas

3

Com base na documentação do Chef para LWRPs, acho que o nome real da classe para o LWRP no livro de receitas do Windows é

Chef::Provider::WindowsFeatureServermanagercmd

Como tal, você deve usar algo como

windows_feature 'RDS-RD-Server' do
  provider Chef::Provider::WindowsFeatureServermanagercmd
end
    
por 10.09.2013 / 12:50
0

A solução de Holger Just funciona, mais ou menos, embora a mensagem servermanagercmd.exe deprecation cause alguns problemas. Aqui está como acabei resolvendo o problema:

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

Minha solução inicial baseada em Powershell não estava funcionando porque o comando genérico powershell estava lançando o Powershell de 32 bits. Esta solução ainda é muito hacky, mas eu prefiro usar o servermanagercmd.exe .

    
por 15.09.2013 / 19:48