【发布时间】:2017-07-07 07:54:55
【问题描述】:
我无法通过-target 定位单个aws_volume_attachment 及其对应的aws_instance。
问题是 aws_instance 是使用 count.index 从列表中获取的,这会强制 terraform 刷新该列表中的所有 aws_instance 资源。
在我的具体案例中,我正在尝试使用 terraform 管理领事集群。
目标是能够通过-target 标志重新初始化单个aws_instance 资源,这样我就可以逐个节点升级/更改整个集群而不会停机。
我有以下 tf 代码:
### IP suffixes
variable "subnet_cidr" { "10.10.0.0/16" }
// I want nodes with addresses 10.10.1.100, 10.10.1.101, 10.10.1.102
variable "consul_private_ips_suffix" {
default = {
"0" = "100"
"1" = "101"
"2" = "102"
}
}
###########
# EBS
#
// Get existing data EBS via Name Tag
data "aws_ebs_volume" "consul-data" {
count = "${length(keys(var.consul_private_ips_suffix))}"
filter {
name = "volume-type"
values = ["gp2"]
}
filter {
name = "tag:Name"
values = ["${var.platform_type}.${var.platform_id}.consul.data.${count.index}"]
}
}
#########
# EC2
#
resource "aws_instance" "consul" {
count = "${length(keys(var.consul_private_ips_suffix))}"
...
private_ip = "${cidrhost(aws_subnet.private-b.cidr_block, lookup(var.consul_private_ips_suffix, count.index))}"
}
resource "aws_volume_attachment" "consul-data" {
count = "${length(keys(var.consul_private_ips_suffix))}"
device_name = "/dev/sdh"
volume_id = "${element(data.aws_ebs_volume.consul-data.*.id, count.index)}"
instance_id = "${element(aws_instance.consul.*.id, count.index)}"
}
这非常适合初始化集群。
现在,我对 consul 节点的 user_data init 脚本进行了更改,并希望逐个节点推出。
我运行 terraform plan -target=aws_volume_attachment.consul_data[0] 来重新初始化节点 0。
这是我遇到上述问题的时候,因为instance_id = "${element(aws_instance.consul.*.id, count.index)}",terraform 会渲染所有aws_instance 资源。
有没有办法“强制” tf 只针对单个 aws_volume_attachment 及其对应的 aws_instance 资源?
【问题讨论】:
标签: terraform