如何在Terraform中捕获外部环境变量并赋值给本地变量
解决Terraform捕获远程实例环境变量到本地变量的问题
你的配置报错是因为null_resource并没有导出provisioner.remote-exec.output这个属性,remote-exec的执行输出不会自动被Terraform捕获,需要通过额外步骤把输出传递到本地变量中。以下是几种可行的实现方案:
方案一:通过文件拷贝捕获输出
先在远程实例把环境变量写入文件,再拷贝到本地,最后读取文件内容作为本地变量:
resource "null_resource" "get_env_token" { count = var.config_server_count # 远程执行命令,把环境变量写入临时文件 provisioner "remote-exec" { connection { type = "ssh" user = "opc" host = aws_instance.your_instance[count.index].public_ip # 替换为你的实例公网IP属性 private_key = file(var.ssh_private_key) } inline = [ "echo $WORKER_TOKEN > /tmp/worker_token.txt" ] } # 将远程文件拷贝到本地 provisioner "file" { connection { type = "ssh" user = "opc" host = aws_instance.your_instance[count.index].public_ip private_key = file(var.ssh_private_key) } source = "/tmp/worker_token.txt" destination = "${path.module}/worker_token_${count.index}.txt" } } # 读取本地文件内容,去除首尾空白字符后作为本地变量 locals { token = trimspace(file("${path.module}/worker_token_0.txt")) }
方案二:使用Terraform Data资源结合本地命令
如果使用Terraform 1.4及以上版本,可以用terraform_data资源替代null_resource,配合local-exec直接执行SSH命令并写入本地文件,再通过triggers_replace传递值:
resource "terraform_data" "get_env_token" { count = var.config_server_count provisioner "local-exec" { # 直接通过SSH命令获取环境变量并写入本地文件 command = <<EOT ssh -i ${var.ssh_private_key} opc@${aws_instance.your_instance[count.index].public_ip} 'echo $WORKER_TOKEN' > ${path.module}/worker_token_${count.index}.txt EOT } # 将读取到的文件内容作为触发器,确保值更新时资源重新执行 triggers_replace = { token = trimspace(file("${path.module}/worker_token_${count.index}.txt")) } } # 引用触发器中的值作为本地变量 locals { token = terraform_data.get_env_token[0].triggers_replace.token }
方案三:使用External数据源
通过external数据源直接执行SSH命令,将输出转为JSON格式后读取:
data "external" "worker_token" { # 执行SSH命令获取环境变量,并包装为JSON输出 program = [ "bash", "-c", "token=$(ssh -i ${var.ssh_private_key} opc@${aws_instance.your_instance[0].public_ip} 'echo $WORKER_TOKEN'); echo '{\"value\": \"'$token'\"}'" ] } # 从数据源结果中提取变量值 locals { token = data.external.worker_token.result.value }
注意事项
- 确保远程实例的安全组允许SSH(22端口)访问你的Terraform执行环境
- 确认远程实例中
WORKER_TOKEN环境变量已正确设置,且当前用户(opc)有权限读取 - 方案一和二中的本地文件会保存在Terraform模块目录下,可根据需要调整路径
- 方案三需要确保命令输出是合法的JSON格式,避免转义错误
内容的提问来源于stack exchange,提问作者MarkK
相关产品推荐
相关产品推荐

