3

そのため、terraform を使用して ec2 インスタンスと openstack インスタンスをプロビジョニングしています。(consul を設定するために) それらを使用するコマンドを実行する必要があるため、作成しているインスタンスの IP アドレスを参照しようとしています。terraform applyただし、これらの変数への参照を追加した後、テラフォームは停止し、またはを実行した後はまったく何もしませんterraform plan:

実行しようとしているリソース ブロックのサンプルを次に示します。

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

  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",
      "echo ${aws_instance.consul.0.private_ip} >> /home/ubuntu/test.txt",
      "echo ${aws_instance.consul.1.private_ip} >> /home/ubuntu/test.txt",
      "echo ${aws_instance.consul.2.private_ip} >> /home/ubuntu/test.txt"
    ]
  }
}

更新: openstack クラウドで同様のコマンドを実行しようとしたところ、同じ問題が発生しました:

  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}"
    ]
  }

したがって、代わりに IP アドレスの 1 つだけを使用すると、次のブロックのように、最初のインスタンスが作成されるまで他のインスタンスが作成されないことがわかりました。

  provisioner "remote-exec" {
    inline = [
      "echo ${openstack_compute_instance_v2.consul.0.network.0.fixed_ip_v4}",
    ]
  }

すべてのインスタンスを同時に作成し、作成された他のすべてのインスタンスの IP アドレスにアクセスできるようにする必要があります。

4

1 に答える 1

4

したがって、これを詳しく見てみると、実際には依存関係サイクルにロックされるTerraformの問題のように見えます。

同じ問題には、 を使用してnull_resource、プロビジョニングされたすべてのインスタンスに接続し、それらに対してスクリプトを実行するという回避策も含まれています。

ユースケースでは、次のようなものを使用できます。

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"
    ]
  }
}

これにより、3 つのインスタンスが起動され、それらに接続され、curl がインストールされ、3 つのインスタンスのプライベート IP アドレスのリストが改行で区切られたファイルが作成されます。

于 2016-06-16T17:43:57.230 に答える