4

我的问题类似于这个 git hub 帖子:

https://github.com/hashicorp/terraform/issues/745

它也与我的另一个堆栈交换帖子有关:

Terraform 在尝试获取多个实例的 IP 地址时停止?

我正在尝试引导多台服务器,并且需要在我的实例上运行一些命令,这些命令需要所有其他实例的 IP 地址。但是,在创建新实例之前,我无法访问保存新创建实例的 IP 地址的变量。因此,当我尝试运行这样的provisioner "remote-exec"块时:

  provisioner "remote-exec" {
    inline = [
      "sudo apt-get update",
      "sudo apt-get install -y curl",
      "echo ${openstack_compute_instance_v2.consul.0.network.0.fixed_ip_v4}",
      "echo ${openstack_compute_instance_v2.consul.1.network.1.fixed_ip_v4}",
      "echo ${openstack_compute_instance_v2.consul.2.network.2.fixed_ip_v4}"
    ]
  }

什么都没有发生,因为所有实例都在等待所有其他实例完成创建,所以一开始什么都没有创建。所以我需要一种方法来创建我的资源,然后在创建provisioner "remote-exec"它们之后运行我的块命令,并且 terraform 可以访问我所有实例的 IP 地址。

4

2 回答 2

7

解决方案是创建一个resource "null_resource" "nameYouWant" { }然后在其中运行您的命令。它们将在创建初始资源后运行:

resource "aws_instance" "consul" {
  count = 3
  ami = "ami-ce5a9fa3"
  instance_type = "t2.micro"
  key_name = "ansible_aws"
  tags {
    Name = "consul"
  }
}

resource "null_resource" "configure-consul-ips" {
  count = 3

  connection {
    user = "ubuntu"
    private_key="${file("/home/ubuntu/.ssh/id_rsa")}"
    agent = true
    timeout = "3m"
  }

  provisioner "remote-exec" {
    inline = [
      "sudo apt-get update",
      "sudo apt-get install -y curl",
      "sudo echo '${join("\n", aws_instance.consul.*.private_ip)}' > /home/ubuntu/test.txt"
    ]
  }
}

另请参阅此处的答案:

Terraform 在尝试获取多个实例的 IP 地址时停止?

非常感谢@ydaetskcor 的回答

于 2016-06-16T18:05:17.720 回答
2

除了@alex-cohen 的回答,来自https://github.com/hashicorp/terraform/issues/8266#issuecomment-454377049的另一个提示。

如果您想发起对 的调用local-exec,无论创建资源如何,请使用triggers

resource "null_resource" "deployment" {
  provisioner "local-exec" {
    command = "echo ${PATH} > output.log"
  }
  triggers = {
    always_run = timestamp()
  }
}
于 2019-12-09T04:13:41.213 回答