Сравнение числовых значений с двумя переменными в шаблоне Terraform templatefile

#terraform #terraform-template-file

#terraform #terraform-template-file

Вопрос:

Я пытаюсь создать визуализированный файл с помощью функции templatefile Terraform.

Вот мой код:

 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.
Как я могу сделать возможным сравнение этой строки с доступом к индексной переменной?

Ответ №1:

У local.ips вас будет карта формы:

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

Поэтому в вашем шаблоне при записи %{ for index, ip in private ~} index будет строка (например addressname1 , и addressname2 ), а не число. Это означает, что вы не можете использовать index в выражении if.

Неясно, чего вы хотите достичь с local.ips помощью и for цикла в шаблоне. Но если вы используете следующий in AnsibleInventory , он, по крайней мере, будет работать:

 private = values(local.ips)
 

Ответ №2:

Теперь я решил это по-другому.

 [kube-master]
%{ for index, ip in private ~}
%{ if tonumber(element(split("-",index),1)) < masters_count ~}${index}
%{ endif ~}
%{ endfor ~}