如何将Terraform provisioner "local-exec"的输出存储在本地变量中,并在"remote-exec"中使用变量值

24

我正在使用Terraform provisioner。在一个场景中,我需要执行“local-exec” provisioner,并将命令的输出[这是IP地址的数组]用于下一个“remote-exec” provisioner。但我无法将“local-exec” provisioner的输出存储在本地变量中以供后续使用。我可以将其存储在本地文件中,但不能存储在中间变量中。

count = "${length(data.local_file.instance_ips.content)}" 

这不起作用。


resource "null_resource" "get-instance-ip-41" {
    provisioner "local-exec" {
         command = "${path.module}\\scripts\\findprivateip.bat  > ${data.template_file.PrivateIpAddress.rendered}"
    }
}


data "template_file" "PrivateIpAddress" {
    template = "/output.log"
}

data "local_file" "instance_ips" {
    filename = "${data.template_file.PrivateIpAddress.rendered}"
    depends_on = ["null_resource.get-instance-ip-41"]
}

output "IP-address" {
    value = "${data.local_file.instance_ips.content}"
}



# ---------------------------------------------------------------------------------------------------------------------
# Update the instnaces by installing newrelic agent using remote-exec
# ---------------------------------------------------------------------------------------------------------------------

resource "null_resource" "copy_file_newrelic_v_29" {

  depends_on = ["null_resource.get-instance-ip-41"]

  count = "${length(data.local_file.instance_ips.content)}"

  triggers = {
    cluster_instance_id =  "${element(values(data.local_file.instance_ips.content[count.index]), 0)}"
  }

  provisioner "remote-exec" {

    connection {
        agent               = "true"
        bastion_host        = "${aws_instance.bastion.*.public_ip}"
        bastion_user        = "ec2-user"
        bastion_port        = "22"
        bastion_private_key = "${file("C:/keys/nvirginia-key-pair-ajoy.pem")}"
        user                = "ec2-user"
        private_key         = "${file("C:/keys/nvirginia-key-pair-ajoy.pem")}"
        host                = "${self.triggers.cluster_instance_id}"
    }

    inline = [
      "echo 'license_key: 34adab374af99b1eaa148eb2a2fc2791faf70661' | sudo tee -a /etc/newrelic-infra.yml",
      "sudo curl -o /etc/yum.repos.d/newrelic-infra.repo https://download.newrelic.com/infrastructure_agent/linux/yum/el/6/x86_64/newrelic-infra.repo",
      "sudo yum -q makecache -y --disablerepo='*' --enablerepo='newrelic-infra'",
      "sudo yum install newrelic-infra -y" 
    ]
  }

} 

1
你不能这样做。还有一些基于此的其他问题,但我现在没有时间找到它们。 - ydaetskcoR
6
鉴于这个问题是在搜索“terraform local exec output into variable”时的第一个搜索结果,为了帮助他人,建议在回答中加入解释或提供相关问题链接以供查询答案。请注意,翻译过程中不会添加额外的信息或改变原意。 - starfry
这个回答解决了你的问题吗?Terraform,从null_resource、local-exec和AWS CLI获取输出 - Paolo
2个回答

13
很遗憾,你不能这样做。我找到的解决方案是使用外部数据源块。你可以从那里运行命令并检索输出,唯一的问题是该命令需要生成标准输出(stdout)的 JSON 格式。请参阅文档here。希望这对其他试图解决这个问题的人有所帮助。

0
你可以做到,有点复杂。在我的使用情况中,我想要获取主目录来存储SSH密钥。
创建一个shell脚本:
HOME_DIR_PATH=$(echo ~/ | sed 's:/*$::')
jq -n --arg home_dir_path "$HOME_DIR_PATH" '{"home_dir_path":$home_dir_path}'

在我的 Terraform 代码中,我使用了以下内容:
data "external" "home_dir" {
  program = ["bash", "${path.module}/get_home_dir.sh"]
}

locals {
  home_dir_path = data.external.home_dir.result.home_dir_path
}

resource "local_file" "private_key" {
  content         = tls_private_key.ssh_key.private_key_openssh
  filename        = "${local.home_dir_path}/.ssh/${var.deployment_name}"
  file_permission = "0600"
}

显然,你可以跳过创建本地变量的步骤。但这是你能接近真正变量的最接近的方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接