1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| function Invoke-HybridIaC { [CmdletBinding(SupportsShouldProcess=$true)] param( [Parameter(Mandatory=$true)] [ValidateSet('Azure','AWS','OnPrem')] [string[]]$Environments, [string]$DscConfigPath = '$PSScriptRoot/dsc' )
$deploymentReport = [PSCustomObject]@{ Timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss' AppliedConfigs = @() ComplianceStatus = @{} CrossPlatformIssues = @() }
try { $Environments | ForEach-Object { if ($PSCmdlet.ShouldProcess("Deploy $_ resources")) { terraform -chdir="$DscConfigPath/terraform/$_" apply -auto-approve } }
$Environments | ForEach-Object { $dscConfig = Get-ChildItem "$DscConfigPath/$_" -Filter *.ps1 $dscConfig | ForEach-Object { $job = Start-Job -ScriptBlock { param($config) & $config.FullName } -ArgumentList $_ $deploymentReport.AppliedConfigs += $job | Wait-Job | Receive-Job } }
$deploymentReport.ComplianceStatus = $Environments | ForEach-Object { $status = Test-DscConfiguration -CimSession (New-CimSession -ComputerName $_) @{$_ = $status.InDesiredState ? 'Compliant' : 'Non-Compliant'} } } catch { Write-Error "混合云部署失败: $_" terraform -chdir="$DscConfigPath/terraform" destroy -auto-approve }
$deploymentReport | Export-Clixml -Path "$env:TEMP/HybridIaC_Report_$(Get-Date -Format yyyyMMdd).xml" return $deploymentReport }
|