小编Eve*_*ert的帖子

如何使用 Terraform 格式化和挂载临时磁盘?

我正在编写 Packer 和 Terraform 代码以在 aws 上创建一个不可变的基础设施。但是,在磁盘上安装 ext4 并挂载它似乎不是很简单。

步骤看起来很简单:

  • 在包含所有软件的 t2.micro 上使用打包程序创建 ami,首先用于测试,然后用于生产。
  • 从这个 ami 启动一个 r3.4xlarge 实例,它有一个 300GB 的临时磁盘。出于性能原因,将此磁盘格式化为 ext4,挂载它并将 /var/lib/docker 重定向到新文件系统。
  • 完成其余的应用程序启动。

首先:

最佳实践是使用您将使用它的相同实例类型创建 ami 还是拥有一个“通用”映像并从中启动多个实例类型?什么哲学是最好的?

  • 打包程序(软件版本)-> terraform(实例 + 挂载磁盘)-> 部署?
  • 打包器(软件版本)-> 打包器(特定于实例类型的安装)-> terraform(实例)-> 部署?
  • 打包程序(软件版本,特定于实例的安装)-> terraform -> 部署?

后者看起来越来越好,但每个实例类型都需要一个 ami。

到目前为止我尝试过的:

根据这个答案,最好使用 user_data 工作方式而不是供应商方式。所以我要走那条路。

这个答案似乎很有希望,但太旧了,不再有效。我可以更新它,但可能有不同的更好的方法。

这个答案似乎也很有希望,但抱怨的是 ${DEVICE}。我想知道该变量来自哪里,因为 template_file 中没有指定变量。如果我将自己的 DEVICE 变量设置为 xvdb,则它会运行,但不会产生结果,因为 xvdb 在 lsblk 中可见但在 blkid 中不可见。

这是我的代码。format_disks.sh 文件与上述文件相同。任何帮助是极大的赞赏。

# Create a new instance of the latest Ubuntu 16.04 …
Run Code Online (Sandbox Code Playgroud)

amazon-ec2 amazon-web-services ec2-ami terraform

5
推荐指数
1
解决办法
2719
查看次数

vpc_zone_identifier 应该是一个列表

我不明白这一点。在做地形计划时,它抱怨该值应该是一个列表。很公平。让我们分步分解。

错误

1 error(s) occurred:

* module.instance-layer.aws_autoscaling_group.mariadb-asg: vpc_zone_identifier: should be a list
Run Code Online (Sandbox Code Playgroud)

设置

VPC 和子网是在另一个模块中使用 terraform 创建的。该模块的输出如下:

"subnets_private": {
                    "sensitive": false,
                    "type": "string",
                    "value": "subnet-1234aec7,subnet-1234c8a7"
                },
Run Code Online (Sandbox Code Playgroud)

在我的 main.tf 中,我使用所述模块的输出将其输入到我的模块的变量中,该变量负责处理自动缩放组:

  subnets_private                         = "${module.static-layer.subnets_private}"
Run Code Online (Sandbox Code Playgroud)

这在模块中用于要求变量:

variable "subnets_private" {}
Run Code Online (Sandbox Code Playgroud)

这是我配置 vpc_zone_identifier 的部分:

尝试:分裂

resource "aws_autoscaling_group" "mariadb-asg" {
  vpc_zone_identifier  = "${split(",",var.subnets_private)}"
Run Code Online (Sandbox Code Playgroud)

尝试:列表

resource "aws_autoscaling_group" "mariadb-asg" {
  vpc_zone_identifier  = "${list(split(",",var.subnets_private))}"
Run Code Online (Sandbox Code Playgroud)

上面对 list(split() 的尝试应该在理论上可行。由于 terraform 抱怨但不打印实际值,因此很难调试。任何建议表示赞赏。

手动填写值有效。

terraform

5
推荐指数
1
解决办法
3713
查看次数