我正在编写Packer和Terraform代码以在aws上创建一个不可变的infra。但是,在磁盘上安装ext4并安装它似乎并不简单。
步骤看似简单:
最佳做法是使用您将使用的相同实例类型创建ami,或者使用一个' generic'从那张图片并启动多重实例类型? 什么哲学是最好的?
后者开始变得越来越好,但每个实例类型需要一个ami。
根据this answer,最好使用user_data工作方式而不是供应方式。所以我走了那条路。
This answer看起来很有希望但是已经老了它不再适用了。我可以更新它,但可能有一种不同的,更好的方式。
This answer似乎也很有希望,但却抱怨$ {DEVICE}。我想知道该变量来自哪里,因为template_file中没有指定vars。如果我将自己的DEVICE变量设置为xvdb然后运行,但不会产生结果,因为xvdb在lsblk中可见但在blkid中不可见。
这是我的代码。 format_disks.sh文件与the one mentioned above相同。非常感谢任何帮助。
# 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"
}
}
答案 0 :(得分:0)
让我对这个话题发表看法。
我认为cloud-init是AWS的关键,因为您可以动态创建所需的机器。 首先,尝试更改一些全局脚本,这些脚本将在计算机启动时使用。然后,您应该将该脚本添加为用户数据,我建议您同时使用ec2自动缩放功能,因此,如果更改cloud-init脚本,则可以终止实例,另一个实例将自动创建。
我的结构目录。
.
|____main.tf
|____templates
| |____cloud-init.tpl
main.tf
provider "aws" {
region = "us-east-1"
}
data "template_file" "cloud_init" {
template = file("${path.module}/templates/cloud-init.tpl")
}
data "aws_ami" "linux_ami" {
most_recent = "true"
owners = ["amazon"]
filter {
name = "name"
values = ["amzn2-ami-hvm-2.0.????????.?-x86_64-gp2"]
}
}
resource "aws_instance" "test1" {
ami = data.aws_ami.linux_ami.image_id
instance_type = "r3.4xlarge"
key_name = "keypair-1"
subnet_id = "subnet-xxxxxx"
associate_public_ip_address = true
vpc_security_group_ids = ["sg-xxxxxxx"]
user_data = data.template_file.cloud_init.rendered
root_block_device {
delete_on_termination = true
encrypted = true
volume_size = 10
volume_type = "gp2"
}
ebs_block_device {
device_name = "ebs-block-device-name"
delete_on_termination = true
encrypted = true
volume_size = 10
volume_type = "gp2"
}
network_interface {
device_index = 0
network_interface_id = var.network_interface_id
delete_on_termination = true
}
tags = {
Name = "test1"
costCenter = "xxxxx"
owner = "xxxxx"
}
}
templates / cloud-init.tpl
#!/bin/bash -x
yum update -y
yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
systemctl enable amazon-ssm-agent
systemctl start amazon-ssm-agent
pip install aws-ssm-tunnel-agent
echo "[INFO] SSM agent has been installed!"
# More scripts here.
您要附加临时磁盘吗?您是否尝试过将root_block_device
的{{1}}值添加为delete_on_termination
?这样,销毁aws ec2实例资源后,磁盘将被删除。这是节省AWS成本的好方法,但要小心,如果存储的数据不重要或已备份,请使用它。
如果需要在此实例上附加外部ebs磁盘,则可以使用AWS API,并确保将计算机与可以使用的磁盘放在同一true
中。
让我知道您是否需要一些bash脚本,但这很简单。