我正在编写Packer和Terraform代码,在aws上创建一个不可变的基础架构。然而,安装ext4到磁盘并将其挂载起来似乎并不是很简单。
步骤看起来很简单:
- 使用Packer在t2.micro上创建包含所有软件的ami,首先在测试中使用,然后在生产中使用。 - 从此ami启动一个r3.4xlarge实例,该实例具有300GB的临时磁盘。将该磁盘格式化为ext4,挂载它并将/var/lib/docker重定向到新文件系统以提高性能。 - 完成其余应用程序的启动。
首先:
最佳实践是使用与要使用的实例类型相同的实例类型创建ami,还是拥有一个“通用”映像并从其中启动多个实例类型?哪种理念最好?
- packer(软件版本)-> terraform(实例+挂载磁盘)-> 部署? - packer(软件版本)-> packer(实例特定挂载)-> terraform(实例)-> 部署? - packer(软件版本,实例特定挂载)-> terraform -> 部署?
后者看起来越来越好,但需要一个每个实例类型的AMI。
我已经尝试过的内容:
根据此答案,最好使用user_data的方式工作,而不是provisioners的方式。所以我走了这条路。 这个答案看起来很有前途,但太旧了,不能用了。我可以更新它,但可能有一种不同、更好的方法。 这个答案也看起来很有前途,但抱怨${DEVICE}。我想知道那个变量从哪里来,因为在template_file中没有指定任何变量。如果我将自己的DEVICE变量设置为xvdb,那么它就会运行,但不会产生结果,因为xvdb在lsblk中可见,但在blkid中不可见。
步骤看起来很简单:
- 使用Packer在t2.micro上创建包含所有软件的ami,首先在测试中使用,然后在生产中使用。 - 从此ami启动一个r3.4xlarge实例,该实例具有300GB的临时磁盘。将该磁盘格式化为ext4,挂载它并将/var/lib/docker重定向到新文件系统以提高性能。 - 完成其余应用程序的启动。
首先:
最佳实践是使用与要使用的实例类型相同的实例类型创建ami,还是拥有一个“通用”映像并从其中启动多个实例类型?哪种理念最好?
- packer(软件版本)-> terraform(实例+挂载磁盘)-> 部署? - packer(软件版本)-> packer(实例特定挂载)-> terraform(实例)-> 部署? - packer(软件版本,实例特定挂载)-> terraform -> 部署?
后者看起来越来越好,但需要一个每个实例类型的AMI。
我已经尝试过的内容:
根据此答案,最好使用user_data的方式工作,而不是provisioners的方式。所以我走了这条路。 这个答案看起来很有前途,但太旧了,不能用了。我可以更新它,但可能有一种不同、更好的方法。 这个答案也看起来很有前途,但抱怨${DEVICE}。我想知道那个变量从哪里来,因为在template_file中没有指定任何变量。如果我将自己的DEVICE变量设置为xvdb,那么它就会运行,但不会产生结果,因为xvdb在lsblk中可见,但在blkid中不可见。
这是我的代码。format_disks.sh文件与上面提到的那个相同。非常感谢任何帮助。
# Create a new instance of the latest Ubuntu 16.04 on an
# t2.micro node with an AWS Tag naming it "test1"
provider "aws" {
region = "us-east-1"
}
data "template_file" "format-disks" {
template = "${file("format_disk.sh")}"
vars {
DEVICE = "xvdb"
}
}
resource "aws_instance" "test1" {
ami = "ami-98181234"
instance_type = "r3.4xlarge"
key_name = "keypair-1" # This needs to be changed so multiple users can use this
subnet_id = "subnet-a0aeb123" # maps to the vpc for the us production
associate_public_ip_address = "true"
vpc_security_group_ids = ["sg-f3e91234"] #backendservers
user_data = "${data.template_file.format-disks.rendered}"
tags {
Name = "test1"
}
ephemeral_block_device {
device_name = "xvdb"
virtual_name = "ephemeral0"
}
}
format_disk.sh
脚本与一些配置一起集成到您的 AMI 中,使其在启动时运行,并完全脱离 Terraform 的控制。Terraform 只需安排附加磁盘,AMI 中的软件将负责在启动时格式化它。这样,您还可以更轻松地协调任何其他应用程序启动任务,以确保例如需要文件系统的应用程序在文件系统格式化和挂载之后才启动。 - Martin Atkins