1

我正在尝试使用 Terraform 的 templatefile 函数创建一个渲染文件。

这是我的代码:

variable "prefix" {
  default = "k8s"
}

variable "masters_count" {
  default = 2
}

resource "google_compute_address" "k8s-static-ips" {
  name = "${var.prefix}-${count.index}"
  count = var.num_k8s_nodes
}

locals {
  ips = {
    for k in google_compute_address.k8s-static-ips : k.name => k.address
  }
}

resource "local_file" "AnsibleInventory" {

  content = templatefile("inventory.ini.tmpl",
  {
    private = local.ips
    prefix = var.prefix
    masters_count = var.masters_count
  }
  )
  filename = "inventory.ini"
}
[all]
%{ for index, ip in private ~}
${prefix}-${index} ansible_host=${ip} 
%{ endfor ~}

[kube-master]
%{ for index, ip in private ~}
%{ if index < masters_count ~}${prefix}-${index}%{ endif ~}
%{ endfor ~}

[calico-rr]

[k8s-cluster:children]
kube-master
kube-node
calico-rr

我的问题是%{ if index < masters_count ~}条件不起作用,我收到 Terraform 错误:

Call to function "templatefile" failed: inventory.ini.tmpl:11,7-12: Invalid
operand; Unsuitable value for left operand: a number is required., and 4 other
diagnostic(s).

看起来它不知道 if 块中的索引变量。如何使该行的比较可以访问索引变量?

4

2 回答 2

1

local.ips将成为以下表格的地图

{
  "addressname1" = "ip1"
  "addressname2" = "ip2"
}

因此,在您编写的模板中%{ for index, ip in private ~}index 将是字符串(例如addressname1addressname2),而不是数字。这意味着您不能index在 if 表达式中使用。

目前尚不清楚您想要实现什么local.ips以及模板中的for循环。但是,如果您在 中使用以下内容AnsibleInventory,它至少会起作用:

private = values(local.ips)
于 2020-12-06T10:25:49.170 回答
0

我现在以不同的方式解决了它。

[kube-master]
%{ for index, ip in private ~}
%{ if tonumber(element(split("-",index),1)) < masters_count ~}${index}
%{ endif ~}
%{ endfor ~}
于 2020-12-06T10:36:59.657 回答