在 Terraform 中动态创建资源

Meg*_*ghP 2 amazon-web-services terraform

如何将资源块(例如:资源“aws 卷附件”“ebs att”)作为 tf 文件的输入发送

resource "aws_volume_attachment" "ebs_att" {
device_name = "/dev/sdh"
volume_id   = "${aws_ebs_volume.example.id}"
instance_id = "${aws_instance.example.id}"
force_detach = "true"
}
Run Code Online (Sandbox Code Playgroud)

假设,下面是我的 terraform .tf 文件

provider "aws" {
region     = "${var.region}"
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"

}

resource "aws_key_pair" "deployer" {
key_name   = "testkey-${var.hostname}"
public_key = "${file(var.public_key_path)}"
}
Run Code Online (Sandbox Code Playgroud)

对于这个文件,我必须发送资源块->

resource "aws_volume_attachment" "ebs_att"
Run Code Online (Sandbox Code Playgroud)

最终的 .tf 文件看起来像

provider "aws" {
region     = "${var.region}"
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"

}

resource "aws_key_pair" "deployer" {
key_name   = "testkey-${var.hostname}"
public_key = "${file(var.public_key_path)}"
}
resource "aws_volume_attachment" "ebs_att" {
device_name = "/dev/sdh"
volume_id   = "${aws_ebs_volume.example.id}"
instance_id = "${aws_instance.example.id}"
force_detach = "true"
}
Run Code Online (Sandbox Code Playgroud)

Saj*_*nnu 5

您将无法单独使用 terraform 脚本动态添加新资源(为什么我说“单独”是因为在我的情况下,我使用 python 类作为配置并从中动态生成 terraform 文件并从 python 脚本运行 apply 命令

您可以通过另一种方式实现此目的,即向资源添加计数并将默认变量值设置为 0,这样资源通常不会被创建,除非您专门将计数值设置为 1

variable "create_ebs_resource" {
  type = number
  default = 0
}

resource "aws_volume_attachment" "ebs_att" {
  device_name = "/dev/sdh"
  volume_id   = "${aws_ebs_volume.example.id}"
  instance_id = "${aws_instance.example.id}"
  force_detach = "true"
  count = var.create_ebs_resource
}
Run Code Online (Sandbox Code Playgroud)

然后运行 ​​apply 命令,就像 terraform apply -var="create_ebs_resource=1"您想创建资源一样,否则只需运行terraform apply