PowerShell on Linux doesn't find modules when run through Puppet
Posted by Admin • Thursday, March 11. 2021 • Category: DevOps, LinuxI'm running PowerShell on Linux for the sake of using PowerCLI. An interesting thing happens: when pwsh is run interactively, in a terminal, the following works fine when PowerCLI is already installed:
pwsh -c 'Get-InstalledModule VMware.PowerCLI'
When puppet runs it - it doesn't find the module:
Get-Package: /opt/microsoft/powershell/7/Modules/PowerShellGet/PSModule.psm1:9445 Line | 9445 | PackageManagement\Get-Package @PSBoundParameters | Microsoft. … | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | No match was found for the specified search criteria and | module names 'VMware.PowerCLI'. Error: 'pwsh -c "if (-not(Get-InstalledModule VMware.PowerCLI)) { Exit 1 }"' returned 1 instead of one of [0]
After some experimentation, I narrowed it down to a single environment variable missing when puppet executes the command: HOME. Set HOME, and powershell will find modules. That gets us the following recipe:
$my_user = 'some_user' exec { 'Install PowerCLI': path => ['/bin', '/usr/bin'], command => 'pwsh -c \'Install-Module -Force:$true -Name VMware.PowerCLI\'', unless => 'pwsh -c \'if (-not(Get-InstalledModule VMware.PowerCLI -ErrorAction silentlycontinue)) { Exit 1 }\'', user => $my_user, environment => [ "HOME=/home/${my_user}"] }