我将以下代码与terraform一起使用:
std::getline()
我的节点数有两个正在创建的ec2实例。一切都只在一个实例上运行,因此错误必须是使用count.index语法,或者它在某个地方丢失了,但是无法解决。
但是我得到此错误返回:
错误:aws_instance.nodes-opt-us1-k8s:连接信息不能包含引用自身的splat变量
我已经问过Linux Academy导师,如果不深入研究,他们将看不到错误。我对terraform相当陌生,想与您联系,看看以前是否曾遇到过此问题...我在Google上搜索了很多选项,但看不到类似的东西。
答案 0 :(得分:0)
我自己无法测试,您是否尝试过内插${self.private_ip}
?而不是$ {aws_instance.nodes-opt-us1-k8s。*。public_ip [count.index]}
此致
答案 1 :(得分:0)
在将预配器用于资源并引用自身时,您需要使用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
}
}