我正在编写 Packer 和 Terraform 代码以在 aws 上创建一个不可变的基础设施。但是,在磁盘上安装 ext4 并挂载它似乎不是很简单。
步骤看起来很简单:
最佳实践是使用您将使用它的相同实例类型创建 ami 还是拥有一个“通用”映像并从中启动多个实例类型?什么哲学是最好的?
后者看起来越来越好,但每个实例类型都需要一个 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) 我不明白这一点。在做地形计划时,它抱怨该值应该是一个列表。很公平。让我们分步分解。
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 抱怨但不打印实际值,因此很难调试。任何建议表示赞赏。
手动填写值有效。