在 Windows Server 2016 的 Import-DscResource 上纠缠配置 PowerShell 步骤失败
Pester Provisioning PowerShell step fails on Import-DscResource in Windows Server 2016
我遇到了一个问题,即在通过 Azure Pipelines 运行 执行 Packer 作业期间,PowerShell DSC 资源无法导入。
Packer 指示错误说:
==> amazon-ebs: Provisioning with Powershell...
==> amazon-ebs: Provisioning with powershell script: ./scripts/dsc-windows-powershell-policy.ps1
==> amazon-ebs: At C:\Windows\Temp\script-5e6ad1c0-dea6-f683-86ea-f173e577e85d.ps1:24 char:5
==> amazon-ebs: + Import-DscResource -ModuleName ComputerManagementDsc # -ModuleVer ...
==> amazon-ebs: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
==> amazon-ebs: Could not find the module 'ComputerManagementDsc'.
==> amazon-ebs: At C:\Windows\Temp\script-5e6ad1c0-dea6-f683-86ea-f173e577e85d.ps1:28 char:9
==> amazon-ebs: + PowerShellExecutionPolicy ExecutionPolicy
==> amazon-ebs: + ~~~~~~~~~~~~~~~~~~~~~~~~~
==> amazon-ebs: Undefined DSC resource 'PowerShellExecutionPolicy'. Use Import-DSCResource to import the resource.
==> amazon-ebs: + CategoryInfo : ParserError: (:) [], ParseException
==> amazon-ebs: + FullyQualifiedErrorId : ModuleNotFoundDuringParse
==> amazon-ebs:
这一配置的设置脚本从确保模块已安装开始。
我从他们那里删除了 import 声明,因为其他帖子表明它可能会导致某种类型的冲突。
$ErrorActionPreference = 'Stop'
@(
'PSDscResources'
'ComputerManagementDsc'
) | ForEach-Object {
$m = $_
if(-not (Get-InstalledModule $m))
{
Write-Host "Installing Module: $m"
Find-Module -Name $m -Repository PSGallery | Install-Module -Scope AllUsers -Force -AllowClobber
}
else
{
Write-Host "Bypassed install of $m per already installed"
}
}
此安装完成后,我 运行 同样 ps1 调用 DSC 配置。然而,尽管进行了许多不同的测试,但我无法让它识别已安装的 DSC 资源。
我怀疑 Windows 2016 中的内置资源引起了冲突,但我不是 DSC 方面的专家,还不知道该怎么做。
失败的配置是:
Configuration DSC_PowerShellExecutionPolicy_config
{
Import-DscResource -ModuleName ComputerManagementDsc -ModuleVersion 8.0.0
node 'localhost'
{
PowerShellExecutionPolicy ExecutionPolicy
{
ExecutionPolicy = 'RemoteSigned'
ExecutionPolicyScope = 'LocalMachine'
}
}
}
try
{
Write-Host "⚙ Initiating DSC_PowerShellExecutionPolicy_config"
DSC_PowerShellExecutionPolicy_config
Start-DscConfiguration DSC_PowerShellExecutionPolicy_config -Verbose -force -Wait
}
catch
{
throw
exit 1
}
请注意,对于我尝试转换为(而不是我自己开发的脚本)的其他 DSC 安装,这对我来说是一个问题,并且所有这些安装都一直存在这个问题。
此外,考虑到我正在测试的 Windows Server 2016 映像没有最新的 nuget 和 PowerShellGet,我确保现在是最新版本:
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
Install-Module PowerShellGet -MinimumVersion 2.2.3 -Force -Scope AllUsers -AllowClobber
Import-Module PowershellGet -MinimumVersion 2.2.3 -Force -verbose
任何指导将不胜感激!
您看到的问题是 DSC 配置在文件中的任何代码 运行 之前被解析,甚至在它们被加载到内存之前。如果模块在配置脚本 运行 之前不存在,那么它将失败。您最好在 运行 配置之前安装这些模块,可能在单独的 Packer 步骤中。
我遇到了一个问题,即在通过 Azure Pipelines 运行 执行 Packer 作业期间,PowerShell DSC 资源无法导入。
Packer 指示错误说:
==> amazon-ebs: Provisioning with Powershell...
==> amazon-ebs: Provisioning with powershell script: ./scripts/dsc-windows-powershell-policy.ps1
==> amazon-ebs: At C:\Windows\Temp\script-5e6ad1c0-dea6-f683-86ea-f173e577e85d.ps1:24 char:5
==> amazon-ebs: + Import-DscResource -ModuleName ComputerManagementDsc # -ModuleVer ...
==> amazon-ebs: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
==> amazon-ebs: Could not find the module 'ComputerManagementDsc'.
==> amazon-ebs: At C:\Windows\Temp\script-5e6ad1c0-dea6-f683-86ea-f173e577e85d.ps1:28 char:9
==> amazon-ebs: + PowerShellExecutionPolicy ExecutionPolicy
==> amazon-ebs: + ~~~~~~~~~~~~~~~~~~~~~~~~~
==> amazon-ebs: Undefined DSC resource 'PowerShellExecutionPolicy'. Use Import-DSCResource to import the resource.
==> amazon-ebs: + CategoryInfo : ParserError: (:) [], ParseException
==> amazon-ebs: + FullyQualifiedErrorId : ModuleNotFoundDuringParse
==> amazon-ebs:
这一配置的设置脚本从确保模块已安装开始。 我从他们那里删除了 import 声明,因为其他帖子表明它可能会导致某种类型的冲突。
$ErrorActionPreference = 'Stop'
@(
'PSDscResources'
'ComputerManagementDsc'
) | ForEach-Object {
$m = $_
if(-not (Get-InstalledModule $m))
{
Write-Host "Installing Module: $m"
Find-Module -Name $m -Repository PSGallery | Install-Module -Scope AllUsers -Force -AllowClobber
}
else
{
Write-Host "Bypassed install of $m per already installed"
}
}
此安装完成后,我 运行 同样 ps1 调用 DSC 配置。然而,尽管进行了许多不同的测试,但我无法让它识别已安装的 DSC 资源。
我怀疑 Windows 2016 中的内置资源引起了冲突,但我不是 DSC 方面的专家,还不知道该怎么做。
失败的配置是:
Configuration DSC_PowerShellExecutionPolicy_config
{
Import-DscResource -ModuleName ComputerManagementDsc -ModuleVersion 8.0.0
node 'localhost'
{
PowerShellExecutionPolicy ExecutionPolicy
{
ExecutionPolicy = 'RemoteSigned'
ExecutionPolicyScope = 'LocalMachine'
}
}
}
try
{
Write-Host "⚙ Initiating DSC_PowerShellExecutionPolicy_config"
DSC_PowerShellExecutionPolicy_config
Start-DscConfiguration DSC_PowerShellExecutionPolicy_config -Verbose -force -Wait
}
catch
{
throw
exit 1
}
请注意,对于我尝试转换为(而不是我自己开发的脚本)的其他 DSC 安装,这对我来说是一个问题,并且所有这些安装都一直存在这个问题。
此外,考虑到我正在测试的 Windows Server 2016 映像没有最新的 nuget 和 PowerShellGet,我确保现在是最新版本:
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
Install-Module PowerShellGet -MinimumVersion 2.2.3 -Force -Scope AllUsers -AllowClobber
Import-Module PowershellGet -MinimumVersion 2.2.3 -Force -verbose
任何指导将不胜感激!
您看到的问题是 DSC 配置在文件中的任何代码 运行 之前被解析,甚至在它们被加载到内存之前。如果模块在配置脚本 运行 之前不存在,那么它将失败。您最好在 运行 配置之前安装这些模块,可能在单独的 Packer 步骤中。