如何将GitHub Action密钥传入Terraform Azure VM自定义数据?
如何将GitHub Actions Secrets传入Terraform自定义数据脚本
我有一个通过GitHub Actions执行terraform apply创建Azure VM的工作流,Terraform代码中使用test.sh作为自定义数据初始化VM,需要把GitHub Secrets里的client_id、client_secret、tenant_id传入脚本的对应变量,但直接在工作流里写client_secret:${{ secrets.SP_SECRET }}没效果,该怎么实现?
对应的Terraform VM资源代码:
resource "azurerm_linux_virtual_machine" "linux_vm" { name = var.vm_linux_name resource_group_name = data.azurerm_resource_group.resource_group.name location = data.azurerm_resource_group.resource_group.location size = var.vm_size admin_username = var.vm_admin_user custom_data = filebase64("test.sh") network_interface_ids = [ azurerm_network_interface.vm_linux_ni.id, ] admin_ssh_key { username = var.vm_admin_user public_key = file(var.vm_linux_admin_ssh_key) } os_disk { caching = var.vm_os_disk_caching storage_account_type = var.vm_os_disk_sa_type } source_image_reference { publisher = var.vm_linux_image_publisher offer = var.vm_linux_image_offer sku = var.vm_linux_image_sku version = var.vm_linux_image_version } identity { type = "SystemAssigned" } }
test.sh脚本内容:
az cloud set --name AzureCloud az login --service-principal --username $client_id --password $client_secret --tenant $tenant_id
方法1:Terraform模板渲染+变量注入
这是最规范的Terraform原生实现方式:
- 定义Terraform敏感变量
在你的Terraform变量文件中添加:
variable "client_id" { type = string description = "Azure Service Principal Client ID" } variable "client_secret" { type = string description = "Azure Service Principal Client Secret" sensitive = true # 标记为敏感,避免日志泄露 } variable "tenant_id" { type = string description = "Azure Tenant ID" }
- 将脚本改为模板文件
把原test.sh重命名为test.sh.tpl,替换变量占位符:
az cloud set --name AzureCloud az login --service-principal --username ${client_id} --password ${client_secret} --tenant ${tenant_id}
- 修改Terraform的custom_data字段
用templatefile渲染模板并编码:
custom_data = base64encode(templatefile("test.sh.tpl", { client_id = var.client_id client_secret = var.client_secret tenant_id = var.tenant_id }))
- GitHub Actions中传递变量
在执行terraform apply的步骤中传入Secrets值:
- name: Terraform Apply run: terraform apply -auto-approve \ -var client_id=${{ secrets.SP_CLIENT_ID }} \ -var client_secret=${{ secrets.SP_SECRET }} \ -var tenant_id=${{ secrets.SP_TENANT_ID }} env: ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
方法2:GitHub Actions中预渲染脚本
适合不想修改Terraform逻辑的场景:
- 工作流中添加脚本渲染步骤
利用envsubst替换脚本变量(Ubuntu Runner默认自带该工具):
- name: Render custom data script run: | envsubst < test.sh > rendered_test.sh env: client_id: ${{ secrets.SP_CLIENT_ID }} client_secret: ${{ secrets.SP_SECRET }} tenant_id: ${{ secrets.SP_TENANT_ID }}
- 修改Terraform指向渲染后的脚本
custom_data = filebase64("rendered_test.sh")
关键注意事项
- 敏感数据必须标记为Terraform敏感变量,或确保在工作流中不会被打印到日志。
- Azure自定义数据要求必须是base64编码,两种方法都满足该要求。
- GitHub Secrets的值通过
${{ secrets.XXX }}引用时,不会在工作流日志中暴露。
内容的提问来源于stack exchange,提问作者Klaus
相关产品推荐
相关产品推荐

