2017-02-16 2 views
1
내가 AWS에하여 여러개의 EC2 노드를 만들 terraform을 사용하고

:terraform + apt-get이 간헐적으로 실패하는 이유는 무엇입니까?

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

:

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, 일부 노드가 간헐적으로 실패 횟수 등의 오류가 쉽다는-되찾아 실행

다른 3 개 노드는 awscli를 잘 찾았습니다. 이제 모든 노드가 동일한 AMI에서 생성되고 똑같은 프로비저닝 명령을 사용합니다. 왜 일부 노드 만 실패합니까? 동일하지 않은 아마존에 AMI를의

  • 여러 복사본,
  • 여러 apt-get을 가능성이 어느

동일하지 않은 거울 : 변화는 잠재적으로 올 수 있을까? 내가 누락 된 다른 가능성은 없습니까?
프로비저닝을보다 반복 가능하게 만들 수있는 apt-get "force"유형 플래그가 있습니까? Terraform의 remote-exec 제공자의 기능은 단지 새로운 인스턴스에 업로드하고 명령을 실행하는 쉘 스크립트를 생성/

답변

4

:

스크립트를 통해 프로비저닝을 자동화의 요점은 노드 사이의 변화의이 종류를 방지하는 것입니다 지정하십시오. 대부분의 경우 표준 우분투 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 있습니다. 그래서 Terraform에서 (위의 미리보기에서 수정)처럼 당신은 예를 들어 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

관련 문제