Eu tenho um recurso personalizado DSC do Powershell, incorporado em um módulo. O código completo é disponível aqui se você quiser vê-lo, mas isso pode não ser necessário; meu problema não é (eu acho) no código que escrevi, mas em como acessá-lo.
No meu caso, estou usando o DSC Push Mode. Há um script Powershell normal que eu uso para instalar os módulos necessários, compilar a configuração e iniciá-lo. Nesse script, adiciono a localização do meu módulo a $env:PSModulePath
. Depois de fazer isso, posso ver o módulo e importá-lo no meu shell interativo assim:
PS> Get-Module -ListAvailable | Where-Object -Property Name -eq cWinTrialLab | Import-Module
PS> Get-DscResource -Module cWinTrialLab
ImplementedAs Name ModuleName Version Properties
------------- ---- ---------- ------- ----------
PowerShell cWtlShortcut cWinTrialLab 0.0.1 {Ensure, ShortcutPath, TargetPath, DependsOn...}
Então eu crio um arquivo de configuração de teste:
Configuration TestConfig {
Import-DscResource -ModuleName PSDesiredStateConfiguration
Import-DscResource -ModuleName cWinTrialLab
Node localhost {
cWtlShortcut "TestShortcut" {
Ensure = "Present"
ShortcutPath = "$env:USERPROFILE\Desktop\TestShortcut.lnk"
TargetPath = "C:\Windows\system32\cmd.exe"
}
}
}
E eu tento usá-lo:
PS> . .\testDscConfig.ps1
PS> TestConfig
PS> Start-DscConfiguration -Wait -Force TestConfig
A compilação do MOF parece funcionar, mas, na verdade, a inicialização da configuração falha com:
The PowerShell DSC resource cWtlShortcut from module <cWinTrialLab,0.0.1> does not exist at the PowerShell module path nor is it registered as a WMI DSC resource.
At $Home\Documents\psyops\submod\wintriallab\azure\test.ps1:13 char:1
+ Start-DscConfiguration -Wait -Force TestConfig
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (root/Microsoft/...gurationManager:String) [], CimException
+ FullyQualifiedErrorId : DscResourceNotFound
+ PSComputerName : localhost
O que poderia causar isso?
- Certifiquei-me de que existe apenas uma cópia do módulo em todas as pastas no meu
$env:PSModulePath
.
- Algo parece estar funcionando; ele pode determinar a versão correta do meu módulo na mensagem de erro (e quando eu alterar a versão no arquivo
.psd1
do meu módulo, a versão relatada na mensagem de erro também muda)
- Não acredito que esteja relacionado a Por que o DSC não pode encontrar um recurso que está instalado? porque estou usando o modo push e não há problemas de versão de módulo.
-
Poderia estar relacionado a uma entrada não padrão em $env:PSModulePath
? Eu tentei copiar o módulo para $env:ProgramFiles\WindowsPowershell\Modules
, mas então eu recebo um erro que eu realmente não entendo:
%código%. Para o registro:
PS> Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Unrestricted
LocalMachine Unrestricted
- Talvez seja algo errado com o layout do meu diretório? Na verdade, eu não vi um exemplo de um módulo contendo vários recursos de DSC baseados em classes, então estou adivinhando o layout.
- (Se houver um exemplo desse tipo de módulo - um único módulo, contendo vários recursos DSC baseados em classe - um link para ele seria realmente útil.)
Finalmente, estou usando o Powershell 5.1 no Windows 10 com todas as atualizações aplicadas do Windows Update. (Por fim, implantarei minha configuração em uma máquina do Server 2016).
O que mais eu poderia estar sentindo falta?