簡體   English   中英

為什么terraform + apt-get會間歇性地失敗?

[英]Why does terraform + apt-get fail, intermittently?

我正在使用terraform在aws上創建多個ec2節點:

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

當我說count = 4時,某些節點間歇性地失敗,並出現apt-get錯誤,例如:

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

而其他3個節點發現awcli很好。 現在,所有節點都是從同一AMI創建的,使用完全相同的配置命令,為什么只有其中一部分會失敗? 變化可能來自:

  • 亞馬遜上的AMI的多個副本不相同
  • 多個不一樣的apt-get鏡像

哪個更有可能? 還有其他可能性嗎?
我是否可以使用apt-get“強制”類型標志來使配置更加可重復?

通過腳本自動配置的全部目的是避免節點之間的這種變化:/

Terraform的remote-exec Provisioner功能僅生成一個Shell腳本,該腳本會上傳到新實例並運行您指定的命令。 最有可能您實際上遇到了cloud-init問題,該問題已配置為在標准Ubuntu AMI上運行,並且cloud-init正在嘗試在cloud-init同時運行的情況下運行,因此您遇到了時間安排/沖突。

您可以讓腳本等到cloud-init完成cloud-init之后。 cloud-init/var/lib/cloud/instance/boot-finished創建一個文件,因此您可以將其與/var/lib/cloud/instance/boot-finished內聯:

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

或者,您可以利用cloud-init並讓它為您安裝任意軟件包 您可以像在Terraform中一樣為實例指定user-data (從上面的代碼段進行了修改):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM