供应商错误中使用的 Terraform count.index 函数
Terraform count.index function used in provisioner error
我将以下代码与 terraform 一起使用:
#-----Workernodes-----
resource "aws_instance" "nodes-opt-us1-k8s" {
instance_type = "${var.k8s-node_instance_type}"
ami = "${var.k8s-node_ami}"
count = "${var.NodeCount}"
tags {
Name = "nodes-opt-us1-k8s"
}
key_name = "${aws_key_pair.k8s-node_auth.id}"
vpc_security_group_ids = ["${aws_security_group.opt-us1-k8s_sg.id}"]
subnet_id = "${aws_subnet.opt-us1-k8s.id}"
#-----Link Terraform worker nodes to Ansible playbooks-----
provisioner "local-exec" {
command = <<EOD
cat <<EOF > aws_worker_nodes_IP
[workers]
${aws_instance.nodes-opt-us1-k8s.*.public_ip[count.index]}
EOF
EOD
}
}
我的节点数有两个正在创建的 ec2 实例。一切都只适用于一个实例,因此错误必须与 count.index 语法有关,或者它在某处丢失,但无法解决。
但是我得到了返回的错误:
错误:aws_instance.nodes-opt-us1-k8s:连接信息不能包含引用自身的 splat 变量
我问过 Linux 学院导师,他们不深入研究就无法发现错误。我对 terraform 还很陌生,想联系这里看看以前是否遇到过这个问题……我用谷歌搜索了很多选项,但没有看到类似的东西。
我自己无法测试,你尝试过插值 ${self.private_ip}
吗?而不是 ${aws_instance.nodes-opt-us1-k8s.*.public_ip[count.index]}
此致,
在为资源使用配置器并引用自身时,您需要使用 self.ATTRIBUTE
syntax。
因此,您的资源和供应商应该如下所示:
resource "aws_instance" "nodes-opt-us1-k8s" {
instance_type = "${var.k8s-node_instance_type}"
ami = "${var.k8s-node_ami}"
count = "${var.NodeCount}"
tags {
Name = "nodes-opt-us1-k8s"
}
key_name = "${aws_key_pair.k8s-node_auth.id}"
vpc_security_group_ids = ["${aws_security_group.opt-us1-k8s_sg.id}"]
subnet_id = "${aws_subnet.opt-us1-k8s.id}"
#-----Link Terraform worker nodes to Ansible playbooks-----
provisioner "local-exec" {
command = <<EOD
cat <<EOF > aws_worker_nodes_IP
[workers]
${self.public_ip}
EOF
EOD
}
}
这也在 provisioner docs 中作为示例给出。
请注意,上面的配置程序块将在每个 运行 上覆盖您的 aws_worker_nodes_IP
文件,这意味着它只会向您显示要在 AWS 中创建的最后一个实例的输出(不保证订单)。
如果你想将 IP 附加到文件中,你可以使用 cat <<EOF >> aws_worker_nodes_IP
每次附加你的 heredoc 的整个主体,或者你可能想考虑使用一个单独的供应商来收集 IP 地址您使用 null_resource
pattern:
创建的所有实例
resource "aws_instance" "nodes-opt-us1-k8s" {
instance_type = "${var.k8s-node_instance_type}"
ami = "${var.k8s-node_ami}"
count = "${var.NodeCount}"
tags {
Name = "nodes-opt-us1-k8s"
}
key_name = "${aws_key_pair.k8s-node_auth.id}"
vpc_security_group_ids = ["${aws_security_group.opt-us1-k8s_sg.id}"]
subnet_id = "${aws_subnet.opt-us1-k8s.id}"
}
resource "null_resource" "cluster" {
# If any instance IPs change we need to change the list of IPs
triggers {
cluster_instance_ips = "${join(",", aws_instance.nodes-opt-us1-k8s.*.public_ip)}"
}
provisioner "local-exec" {
command = <<EOD
cat <<EOF > aws_worker_nodes_IP
[workers]
${aws_instance.nodes-opt-us1-k8s.*.public_ip}
EOF
EOD
}
}
我将以下代码与 terraform 一起使用:
#-----Workernodes-----
resource "aws_instance" "nodes-opt-us1-k8s" {
instance_type = "${var.k8s-node_instance_type}"
ami = "${var.k8s-node_ami}"
count = "${var.NodeCount}"
tags {
Name = "nodes-opt-us1-k8s"
}
key_name = "${aws_key_pair.k8s-node_auth.id}"
vpc_security_group_ids = ["${aws_security_group.opt-us1-k8s_sg.id}"]
subnet_id = "${aws_subnet.opt-us1-k8s.id}"
#-----Link Terraform worker nodes to Ansible playbooks-----
provisioner "local-exec" {
command = <<EOD
cat <<EOF > aws_worker_nodes_IP
[workers]
${aws_instance.nodes-opt-us1-k8s.*.public_ip[count.index]}
EOF
EOD
}
}
我的节点数有两个正在创建的 ec2 实例。一切都只适用于一个实例,因此错误必须与 count.index 语法有关,或者它在某处丢失,但无法解决。
但是我得到了返回的错误:
错误:aws_instance.nodes-opt-us1-k8s:连接信息不能包含引用自身的 splat 变量
我问过 Linux 学院导师,他们不深入研究就无法发现错误。我对 terraform 还很陌生,想联系这里看看以前是否遇到过这个问题……我用谷歌搜索了很多选项,但没有看到类似的东西。
我自己无法测试,你尝试过插值 ${self.private_ip}
吗?而不是 ${aws_instance.nodes-opt-us1-k8s.*.public_ip[count.index]}
此致,
在为资源使用配置器并引用自身时,您需要使用 self.ATTRIBUTE
syntax。
因此,您的资源和供应商应该如下所示:
resource "aws_instance" "nodes-opt-us1-k8s" {
instance_type = "${var.k8s-node_instance_type}"
ami = "${var.k8s-node_ami}"
count = "${var.NodeCount}"
tags {
Name = "nodes-opt-us1-k8s"
}
key_name = "${aws_key_pair.k8s-node_auth.id}"
vpc_security_group_ids = ["${aws_security_group.opt-us1-k8s_sg.id}"]
subnet_id = "${aws_subnet.opt-us1-k8s.id}"
#-----Link Terraform worker nodes to Ansible playbooks-----
provisioner "local-exec" {
command = <<EOD
cat <<EOF > aws_worker_nodes_IP
[workers]
${self.public_ip}
EOF
EOD
}
}
这也在 provisioner docs 中作为示例给出。
请注意,上面的配置程序块将在每个 运行 上覆盖您的 aws_worker_nodes_IP
文件,这意味着它只会向您显示要在 AWS 中创建的最后一个实例的输出(不保证订单)。
如果你想将 IP 附加到文件中,你可以使用 cat <<EOF >> aws_worker_nodes_IP
每次附加你的 heredoc 的整个主体,或者你可能想考虑使用一个单独的供应商来收集 IP 地址您使用 null_resource
pattern:
resource "aws_instance" "nodes-opt-us1-k8s" {
instance_type = "${var.k8s-node_instance_type}"
ami = "${var.k8s-node_ami}"
count = "${var.NodeCount}"
tags {
Name = "nodes-opt-us1-k8s"
}
key_name = "${aws_key_pair.k8s-node_auth.id}"
vpc_security_group_ids = ["${aws_security_group.opt-us1-k8s_sg.id}"]
subnet_id = "${aws_subnet.opt-us1-k8s.id}"
}
resource "null_resource" "cluster" {
# If any instance IPs change we need to change the list of IPs
triggers {
cluster_instance_ips = "${join(",", aws_instance.nodes-opt-us1-k8s.*.public_ip)}"
}
provisioner "local-exec" {
command = <<EOD
cat <<EOF > aws_worker_nodes_IP
[workers]
${aws_instance.nodes-opt-us1-k8s.*.public_ip}
EOF
EOD
}
}