Openstack Terraform,如何在现有资源上运行provisioner?

Openstack Terraform,如何在现有资源上运行provisioner?,openstack,provisioning,terraform,Openstack,Provisioning,Terraform,我的问题与git hub的帖子类似: 它还与我的另一个堆栈交换站有关: 我正在尝试引导几个服务器,我需要在我的实例上运行几个命令,这些命令需要所有其他实例的IP地址。但是,在创建之前,我无法访问保存新创建实例的IP地址的变量。因此,当我尝试运行provisioner“remote exec”块时,如下所示: provisioner "remote-exec" { inline = [ "sudo apt-get update", "sudo apt-get

我的问题与git hub的帖子类似:

它还与我的另一个堆栈交换站有关:

我正在尝试引导几个服务器,我需要在我的实例上运行几个命令,这些命令需要所有其他实例的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地址。

解决方案是创建一个
资源“null_resource”名称youwant“{}
,然后在其中运行您的命令。它们将在创建初始资源后运行:

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"
    ]
  }
}
也可以在这里看到答案:


非常感谢@ydaetskcor的回答

除了@alex cohen answer之外,还有另一个来自的提示

如果要启动对
local exec
的调用,而不考虑资源的创建,请使用
触发器

resource "null_resource" "deployment" {
  provisioner "local-exec" {
    command = "echo ${PATH} > output.log"
  }
  triggers = {
    always_run = timestamp()
  }
}

Hi@Alex Cohen的可能重复,一个问题,“null_资源”中定义的“连接”块如何知道连接到哪里?即,它如何知道ec2实例地址?您没有在“连接”块中指定它。(如果你在“aws_实例”中定义了“连接”块,我就不会有这样的问题。)@Bruce我对此也有同样的怀疑。如何将连接和远程执行映射到资源?