2017-02-16 17 views
1

私はAWS上みとめEC2のノードを作成するために、テラフォームを使用しています:terraform + apt-getが断続的に失敗するのはなぜですか?

resource "aws_instance" "myapp" { 
    count = "${var.count}" 
    ami = "${data.aws_ami.ubuntu.id}" 
    instance_type = "m4.large" 
    vpc_security_group_ids = ["${aws_security_group.myapp-security-group.id}"] 
    subnet_id = "${var.subnet_id}" 
    key_name = "${var.key_name}" 
    iam_instance_profile = "${aws_iam_instance_profile.myapp_instance_profile.id}" 

    connection { 
     user = "ubuntu" 
     private_key = "${file("${var.key_file_path}")}" 
    } 

    provisioner "remote-exec" { 
     inline = [ 
      "sudo apt-get update", 
      "sudo apt-get upgrade -y", 
      "sudo apt-get install -f -y openjdk-7-jre-headless git awscli" 
     ] 
    } 
} 

私は、カウント= 4言うと、これを実行すると、いくつかのノードが断続的のようなapt-getのエラーで失敗する:

aws_instance.myapp.1 (remote-exec): E: Unable to locate package awscli 

他の3つのノードはawscliをうまく見つけました。今度はすべてのノードが同じAMIから作成され、まったく同じプロビジョニングコマンドを使用しますが、なぜそれらの一部だけが失敗するのでしょうか?より多くの可能性が高い同一ではありませんAmazonでのAMIの

  • 複数のコピー、同一ではない
  • 複数のapt-getのミラー

:変動は、潜在的から来るだろうか?私が行方不明の他の可能性?
プロビジョニングをより反復可能にするapt-get "force"タイプフラグがありますか?

スクリプトを使用して、プロビジョニングの自動化の全体のポイントは、ノード間のばらつきのこの種のを避けるためです:/

答えて

4

テラフォームのremote-execプロビジョニング機能は、ちょうどあなたの新しいインスタンスにアップロードされたシェルスクリプトを生成し、コマンドを実行します指定する。ほとんどの場合、標準のUbuntu AMIで動作するように設定されたcloud-initの問題が実際に発生しており、プロビジョナはcloud-initが実行されている間に実行しようとしているため、タイミング/競合が発生しています。

cloud-initがプロビジョニングを終了するまでスクリプトを待機させることができます。 cloud-init/var/lib/cloud/instance/boot-finishedにファイルを作成しますので、あなたのプロビジョニングと、このインラインを置くことができます。

until [[ -f /var/lib/cloud/instance/boot-finished ]]; do 
    sleep 1 
done 

を別の方法として、あなたはcloud-initを利用することができ、それがinstall arbitrary packages for youを持っています。あなたはテラフォーム(上記のスニペットから変更)にそのようなあなたのインスタンスのuser-dataを指定することができます: `ブートfinished`を待っ

resource "aws_instance" "myapp" { 
    count = "${var.count}" 
    ami = "${data.aws_ami.ubuntu.id}" 
    instance_type = "m4.large" 
    vpc_security_group_ids = ["${aws_security_group.myapp-security-group.id}"] 
    subnet_id = "${var.subnet_id}" 
    key_name = "${var.key_name}" 
    iam_instance_profile = "${aws_iam_instance_profile.myapp_instance_profile.id}" 

    user_data = "${data.template_cloudinit_config.config.rendered}" 
} 

# Standard cloud-init stuff 
data "template_cloudinit_config" "config" { 
    # I've 
    gzip = false 
    base64_encode = false 

    part { 
     content_type = "text/cloud-config" 
     content = <<EOF 
packages: 
    - awscli 
    - git 
    - openjdk-7-headless 
EOF 
    } 
} 
+0

は私のために動作するようです。 – RaGe