2016-06-14 13 views
2

私はterraformを使ってec2インスタンスとopenstackインスタンスをプロビジョニングしています。私はそれらを使用するコマンドを実行する必要があるため(作成するインスタンスのIPアドレスを参照しようとしています。しかし、これらの変数への参照を追加した後ちょうど屋台と私はterraform applyまたはterraform planを実行した後に絶対に何もしませんテラフォーム:複数のインスタンスのIPアドレスを取得しようとするとTerraformが停止しますか?

ここでは、私が実行しようとしています何のためのリソースブロックのサンプルです:

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

だから私が見つけました

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

私はすべての私のインスタンスを同時に作成する必要があり、IPへのアクセス権を持っている:私の最初のインスタンスが作成されるまで、以下のブロックでのように、他のインスタンスが文句を言わないとしても、作成されたIPアドレスの作成されるとすぐに作成された他のすべてのインスタンスのアドレス。

+0

あなたの望むものとまったく同じように見えます。どうしたの? – ydaetskcoR

+0

これは問題ではありません。 'aws_instance.consul ...'部分は、 'consul'というaws_instance'リソースからの出力を得ることを言っています。 'count'を削除してecho $ {aws_instance.consul.private_ip} >>/home/ubuntu/test.txt'を1つだけ持つとどうなりますか?" – ydaetskcoR

+0

私はopenstackクラウドと非常に似た何かをやろうとしましたが、同じ問題がありました。 'terraform apply'を実行した後、私の端末は何もしません。 5分の間何かをするのを待ってから、私はダブル 'control + c'をやめてエラーの壁を提示した。 –

答えて

3

これを見てみると、実際にはissue with Terraformのようになり、依存関係のサイクルにロックされているように見えます。

同じ問題には、null_resourceを使用してプロビジョニングされたすべてのインスタンスに接続し、それらに対してスクリプトを実行することでこれを回避する方法もあります。これは3つのインスタンスを起動し、それらに接続し、カールをインストールし、民間の改行区切りリストを使用してファイルを作成する必要があり

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つのインスタンスのIPアドレス。

+0

本当にありがとうございました! –

+0

私は 'null resources'が他のサーバが行うすべてのコマンドを実行できないことに気付きました。したがって、本質的に、以前の' resource'ブロックで作成されたサーバに再接続していません。別の解決策は、最初の3の後に別のサーバーを作成し、その新しいサーバーからリモートbashコマンドを実行することでした。とにかくロードバランサのインスタンスを作成する必要があったので、私のterraformスクリプトにそれを動作させるのはかなり簡単でした。これで、4番目のインスタンスが必要なコマンドを実行し、最初の3つのサーバーのIPアドレスにアクセスできます。 –

関連する問題