2017-12-08 6 views
0

/dataというマウントが必要なEC2インスタンスを展開しています。これは、AWSでボリュームアタッチを使用して接続している別個のディスクです。Terraform EC2のユーザーデータを使用した問題

私は手動で以下の操作を行ったときに正常に動作するので、私が使用するスクリプトは動作しますが、経由で追加すると問題が発生し、mkfsコマンドは実行されません。あなたは私のテラフォームの設定が表示される場合

resource "aws_instance" "bastion01" { 
    ami = "${var.aws_ami}" 
    key_name = "a36-key" 
    vpc_security_group_ids = ["${aws_security_group.bath_office_sg.id}","${aws_security_group.bastion01_sg.id}","${aws_security_group.outbound_access_sg.id}"] 
    subnet_id = "${element(module.vpc.public_subnets, 0)}" 
    instance_type = "t2.micro" 
    tags { 
    Name = "x_bastion_01" 
    Role = "bastion" 
    } 
} 

resource "aws_instance" "riak" { 
    count = 5 
    ami = "${var.aws_ami}" 
    vpc_security_group_ids = ["${aws_security_group.bastion01_sg.id}","${aws_security_group.riak_sg.id}","${aws_security_group.outbound_access_sg.id}"] 
    subnet_id = "${element(module.vpc.database_subnets, 0)}" 
    instance_type = "m4.xlarge" 
    tags { 
    Name = "x_riak_${count.index}" 
    Role = "riak" 
    } 
    root_block_device { 
    volume_size = 20 
    } 
    provisioner "file" { 
    source  = "datapartition.sh" 
    destination = "/tmp/datapartition.sh" 
    } 
} 

resource "aws_volume_attachment" "riak_data" { 
    count = 5 
    device_name = "/dev/sdh" 
    volume_id = "${element(aws_ebs_volume.riak_data.*.id, count.index)}" 
    instance_id = "${element(aws_instance.riak.*.id, count.index)}" 
    provisioner "remote-exec" { 
    inline = [ 
     "chmod +x /tmp/datapartition.sh", 
     "/tmp/datapartition.sh", 
    ] 
    connection { 
     bastion_host = "${aws_instance.bastion01.public_ip}" 
     bastion_user = "ubuntu" 
    } 
    } 
} 

を、次のように、パーティションのスクリプトは次のとおりです。

#!/bin/bash 

if [ ! -d /data ]; 
then mkdir /data 
fi 

/sbin/mkfs -t ext4 /dev/xvdh; 

while [ -e /dev/xvdh ] ; do sleep 1 ; done 

mount /dev/xvdh /data 

echo "/dev/xvdh /data ext4 defaults 0 2" >> /etc/fstab 

私はterraform mkfsコマンドを経由して、これを行う際に今起こるとは思われないと私はsyslogに明らかなエラーは見られません。スクリプトを手動でコピーしただけで、bash script.shマウントが作成され、期待どおりに動作します。

誰にでも何か提案がありますか?

編集:これはAWS guiでuserdataの下に追加しても問題ありません。

+1

そうな 'は/ dev/xvdh'がまだ付いていません。最初の条件の後に30秒の睡眠を投げて試してみてはどうでしょう。 –

+0

これはありがとうございました。もともと30秒の睡眠がありました。私はこれもそうだと思って、別の方法で示唆されたログ行を追加しました(私はすべてのログ行を見ることができましたが、mkfsとは関係ありません)。応答 –

答えて

2

user_dataの代わりにremote_execを試すことができます。

User_dataは、クラウドプロバイダのイメージによって異なる動作をするクラウド初期化に関するものです。

また、クラウド初期セクションで実行する前にしばらく待つスクリプトを実行することをお勧めします。>これは、タイムアウトのために起動が失敗したと考えられるVMにつながる可能性がありますあなたのクラウドプロバイダで)。

あなたの/ dev/xvdhが

を添付されるまで、あなたは待つことができるようになりますので、Remote_execはここに良いかもしれ

See here

resource "aws_instance" "web" { 
    # ... 

    provisioner "file" { 
    source  = "script.sh" 
    destination = "/tmp/script.sh" 
    } 

    provisioner "remote-exec" { 
    inline = [ 
     "chmod +x /tmp/script.sh", 
     "/tmp/script.sh args", 
    ] 
    } 
} 
+0

のおかげで、またここに:https://github.com/hashicorp/terraform/issues/4668 =>スクリプトを起動する前にフルブートを待つ方法に関するいくつかのハック – jseguillon

+0

ありがとう、現在これを今すぐテストしてください! –

+0

このスクリプトを実行した後、ボリュームの添付ファイルが作成されているような気がします。これにより、ボリュームの作成中にタイムアウトが発生しました。 –

関連する問題