Terraform local-exec生成文件时文件名含'$'\r的解决办法咨询
解决WSL环境下Terraform生成文件/目录带
'$'\r的问题 问题原因
你遇到的keypairs'$'\r这类命名问题,本质是Windows风格的CRLF换行符(\r\n)被WSL的bash误解析。VS Code默认在Windows环境下保存文件会使用CRLF,当Terraform把<<-EOT块内的命令传递给bash执行时,每行末尾的\r被当成了目录/文件名的一部分,导致出现多余的'$'\r后缀。
解决办法
1. 修正VS Code的换行符设置(根治方法)
- 打开你的Terraform文件,点击VS Code右下角状态栏的
CRLF标识,选择LF,将当前文件的换行符改为Linux风格; - 若要全局默认使用LF,打开设置(快捷键
Ctrl+,),搜索files.eol,将值设置为\n,确保所有新创建的文件都使用Linux换行符。
2. 修改local-exec命令,手动过滤\r
如果暂时无法修改VS Code的换行设置,可以在命令中通过工具去除\r:
resource "tls_private_key" "create_key" { algorithm = "RSA" rsa_bits = 4096 provisioner "local-exec" { interpreter = ["/bin/bash", "-c"] command = <<-EOT # 用tr去除目录名里的\r mkdir $(echo keypairs | tr -d '\r') cd $(echo keypairs | tr -d '\r') # 输出密钥时过滤\r,同时用printf替代echo避免额外换行问题 printf "%s" "${tls_private_key.create_key.private_key_pem}" > "${var.deployment_name}.pem" printf "%s" "${tls_private_key.create_key.public_key_openssh}" > "${var.deployment_name}.pem.pub" EOT } }
3. 使用Terraform的replace函数处理密钥内容
直接在Terraform层面替换掉密钥内容中的\r:
resource "tls_private_key" "create_key" { algorithm = "RSA" rsa_bits = 4096 provisioner "local-exec" { interpreter = ["/bin/bash", "-c"] command = <<-EOT mkdir keypairs cd keypairs echo "${replace(tls_private_key.create_key.private_key_pem, "\r", "")}" > "${var.deployment_name}.pem" echo "${replace(tls_private_key.create_key.public_key_openssh, "\r", "")}" > "${var.deployment_name}.pem.pub" EOT } }
内容的提问来源于stack exchange,提问作者Adam Z
相关产品推荐
相关产品推荐

