Terraform导入PS Gallery的Azure自动化Runbook内容异常,如何获取原始代码?
问题根源
你使用的PS Gallery API URL返回的是nupkg压缩包(本质为ZIP格式),而Azure自动化的publish_content_link期望读取纯文本格式的PowerShell代码资源。当服务尝试解析二进制压缩包时,就会显示乱码问号。
解决方案
方法一:提取包内脚本并内嵌到Terraform配置
通过Terraform的external数据源调用PowerShell脚本,自动下载、解压nupkg包并提取其中的PS1文件内容,再将内容直接内嵌到Runbook资源中。
步骤1:创建提取脚本
在Terraform模块目录下创建extract_runbook.ps1文件:
param( [string]$PackageUri ) # 临时路径配置 $tempPackage = Join-Path $env:TEMP "temp_runbook.nupkg" $extractDir = Join-Path $env:TEMP "runbook_extract" # 清理旧文件 if (Test-Path $tempPackage) { Remove-Item $tempPackage -Force } if (Test-Path $extractDir) { Remove-Item $extractDir -Recurse -Force } # 下载包 Invoke-WebRequest -Uri $PackageUri -OutFile $tempPackage # 解压包 Expand-Archive -Path $tempPackage -DestinationPath $extractDir # 查找目标PS1文件(如需指定文件名,可修改Filter参数) $ps1File = Get-ChildItem -Path $extractDir -Filter "*.ps1" -Recurse | Select-Object -First 1 if (-not $ps1File) { Write-Error "未在包中找到PS1文件" exit 1 } # 读取并返回脚本内容 @{ content = Get-Content $ps1File.FullName -Raw } | ConvertTo-Json
步骤2:修改Terraform配置
引入external数据源获取脚本内容,替换publish_content_link为inline_content:
data "external" "runbook_content" { program = ["powershell.exe", "-File", "${path.module}/extract_runbook.ps1", "-PackageUri", var.import_runbook.uri] } resource "azurerm_automation_runbook" "imported_runbook" { name = var.import_runbook.name resource_group_name = var.resource_group_name automation_account_name = var.automation_account_name location = var.location log_verbose = var.debug log_progress = var.debug tags = var.tags runbook_type = "PowerShell" inline_content = data.external.runbook_content.result.content }
方法二:直接使用原始脚本的纯文本URL
如果该PS Gallery包的源码托管在公开仓库(如GitHub),可以直接找到对应版本PS1文件的原始文本URL,替换到publish_content_link的uri字段中。示例配置如下:
resource "azurerm_automation_runbook" "imported_runbook" { # 其他配置保持不变 publish_content_link { uri = "https://raw.githubusercontent.com/[用户名]/[仓库名]/[分支]/Stop-SAPHANA.ps1" } }
注意事项
- 方法一要求运行Terraform的环境具备PowerShell 5.1+或PowerShell Core,且有网络权限下载和解压文件。
- 若包内包含多个PS1文件,需修改提取脚本的
Filter参数,指定你需要的具体文件名。
内容的提问来源于stack exchange,提问作者Zugzug
相关产品推荐
相关产品推荐

