如何在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
相关产品推荐
相关产品推荐

