PowerShell on Linux doesn't find modules when run through Puppet
Posted by Admin • Thursday, March 11. 2021 • Category: DevOps, Linux
I'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}"]
}
