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

如何在Terraform heredoc模板中输出带%前缀的变量内容?

解决Terraform模板生成sudoers文件的两个问题

1. 正确输出%前缀+组名变量

外部模板文件方式(推荐)

直接在模板文件(比如sudoers.tpl)中写入:

%${group_name} ALL=(ALL) NOPASSWD:ALL

然后在Terraform代码中通过templatefile加载并传入变量:

data "template_file" "sudoers" {
  template = file("${path.module}/sudoers.tpl")
  vars = {
    group_name = "my-admins"
  }
}

这种方式下,%作为字面量直接输出,变量正常替换,最终结果就是%my-admins ALL=(ALL) NOPASSWD:ALL。

内联heredoc方式

如果不想用外部文件,直接在代码中写:

locals {
  sudoers_content = "%${var.group_name} ALL=(ALL) NOPASSWD:ALL"
}

或者用heredoc时直接拼接:

locals {
  sudoers_content = <<-EOT
    %${var.group_name} ALL=(ALL) NOPASSWD:ALL
  EOT
}

如果是用format函数生成字符串,需要用%%转义字面%,同时用%s作为变量占位符:

locals {
  sudoers_content = format("%%%s ALL=(ALL) NOPASSWD:ALL", var.group_name)
}

2. 消除<<-EOT的缩进问题

<<-EOT仅会移除内容行开头的制表符(Tab),对空格缩进无效,且要求EOT标记必须顶格书写。

正确用法(制表符缩进)

locals {
  sudoers_content = <<-EOT
	%${var.group_name} ALL=(ALL) NOPASSWD:ALL
	EOT
}

注意:内容行开头用Tab,EOT前面不能有任何缩进。

空格缩进兼容方案

如果习惯用空格缩进,可配合trimspace函数去除首尾空白:

locals {
  sudoers_content = trimspace(<<-EOT
    %${var.group_name} ALL=(ALL) NOPASSWD:ALL
  EOT)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:47:14