You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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原生实现方式:

  1. 定义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"
}
  1. 将脚本改为模板文件
    把原test.sh重命名为test.sh.tpl,替换变量占位符:
az cloud set --name AzureCloud
az login --service-principal --username ${client_id} --password ${client_secret} --tenant ${tenant_id}
  1. 修改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
}))
  1. 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逻辑的场景:

  1. 工作流中添加脚本渲染步骤
    利用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 }}
  1. 修改Terraform指向渲染后的脚本
custom_data = filebase64("rendered_test.sh")

关键注意事项

  • 敏感数据必须标记为Terraform敏感变量,或确保在工作流中不会被打印到日志。
  • Azure自定义数据要求必须是base64编码,两种方法都满足该要求。
  • GitHub Secrets的值通过${{ secrets.XXX }}引用时,不会在工作流日志中暴露。

内容的提问来源于stack exchange,提问作者Klaus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:13:19