如何通过Terraform输出远端机器执行命令的返回结果
Terraform remote-exec 命令结果输出到Output的实现方案
remote-exec provisioner本身没有内置的返回值字段,你可以通过「远程执行写入结果 -> 拉取结果到本地 -> 读取结果输出」的链路实现需求,两种常用落地方式如下:
方案1:搭配terraform_data + local_file实现(适配复杂远程执行场景)
适合需要先执行多步安装、配置再获取最终结果的场景,示例代码如下:
# 替换为你实际使用的云主机/物理机资源定义 resource "aws_instance" "demo_server" { # 你的主机配置逻辑 } # 执行远程命令并拉取结果到本地 resource "terraform_data" "exec_remote_cmd" { triggers = { server_ip = aws_instance.demo_server.public_ip } # 远程执行目标命令,写入结果到远端临时文件 provisioner "remote-exec" { connection { type = "ssh" user = "ubuntu" private_key = file("~/.ssh/id_rsa") host = self.triggers.server_ip } inline = [ # 替换为你实际要执行的命令,这里以获取系统版本为例 "cat /etc/os-release > /tmp/tf_cmd_result.tmp" ] } # 将远端结果文件拉取到本地 provisioner "local-exec" { command = "scp -o StrictHostKeyChecking=no ubuntu@${self.triggers.server_ip}:/tmp/tf_cmd_result.tmp ./tf_local_cmd_result.tmp" } } # 读取本地存储的命令结果 data "local_file" "cmd_output" { depends_on = [terraform_data.exec_remote_cmd] filename = "./tf_local_cmd_result.tmp" } # 定义output输出结果 output "remote_exec_result" { value = trimspace(data.local_file.cmd_output.content) }
方案2:使用external数据源直接获取结果(适配单步命令场景)
如果只需要执行单条命令拿结果,可以跳过remote-exec,直接用external数据源通过ssh执行命令获取返回值,示例如下:
resource "aws_instance" "demo_server" { # 你的主机配置逻辑 } data "external" "get_remote_result" { program = ["bash", "-c", <<EOT # 执行ssh远程命令,将结果包装为json格式返回给Terraform ssh -o StrictHostKeyChecking=no ubuntu@${aws_instance.demo_server.public_ip} "cat /etc/os-release" | jq -R -s -c '{"output": .}' EOT ] } output "remote_exec_result" { value = trimspace(data.external.get_remote_result.result.output) }
注意事项
- 两种方案都要求执行Terraform的本地环境与目标主机之间SSH网络连通、权限正常
- 如果命令返回结构化数据,建议提前格式化为JSON,方便后续在Terraform中直接引用对应字段
- 优先使用云厂商官方数据源获取主机属性,仅当需要自定义命令执行结果时使用上述方案,避免破坏Terraform的声明式特性
内容的提问来源于stack exchange,提问作者cloudops
相关产品推荐
相关产品推荐

