Переменная блока Terraform 12

#terraform #infrastructure-as-code

#терраформирование #инфраструктура как код #terraform

Вопрос:

Сейчас я нахожусь в процессе перехода на Terraform 12. Одной из главных особенностей здесь является более строгий HCL2, и мне это нравится.

Например, если у меня есть список карт:

   elb_listeners = [
     {
       instance_port     = 80
       instance_protocol = "http"
       lb_port           = 80
       lb_protocol       = "http"
     },
     {
       instance_port      = 443
       instance_protocol  = "http"
       lb_port            = 443
       lb_protocol        = "https"
       ssl_certificate_id = ARN certificate
     }
  

Я могу вращать ее с помощью динамического блока, например:

   dynamic "listener" {
    for_each = [for listener in var.elb_listeners : {
      instance_port     = listener.instance_port
      instance_protocol = listener.instance_protocol
      lb_port           = listener.lb_port
      lb_protocol       = listener.lb_protocol
    }]

    content {
      instance_port     = listener.value.instance_port
      instance_protocol = listener.value.instance_protocol
      lb_port           = listener.value.lb_port
      lb_protocol       = listener.value.lb_protocol
    }
  }
  

Но давайте предположим, что у меня есть только один блок и возможен только один блок:

   health_check {
    healthy_threshold   = 2
    unhealthy_threshold = 2
    timeout             = 3
    target              = "HTTP:8000/"
    interval            = 30
  }
  

Я не хочу объявлять все эти переменные, я также хочу описать это как блок один раз в настройках. Да, здесь я также могу использовать dynamic_block только с одним элементом, но здесь это будет выглядеть излишеством. Возможно ли это сделать? Нравится

   health_check {
    var.health_check
  }
  

или что-то в этом роде.

Ответ №1:

Я понимаю, к чему вы клоните. Но я не думаю, что в настоящее время возможно «развернуть» карту внутри ресурса, например. Вы могли бы определить переменную map со значениями по умолчанию, хотя это займет больше строк кода.

 variable health_check {
    type = "map"
    default = {
        healthy_threshold   = 2
        unhealthy_threshold = 2
        timeout             = 3
        target              = "HTTP:8000/"
        interval            = 30
    }
}

health_check {
    healthy_threshold   = var.health_check.healthy_threshold
    unhealthy_threshold = var.health_check.unhealthy_threshold
    timeout             = var.health_check.timeout
    target              = var.health_check.target
    interval            = var.health_check.interval
}
  

С другой стороны, я не понимаю, зачем вам это нужно. Это делает структуру вашего кода менее читаемой и менее явной. Таким образом, есть варианты определить ее явно со значениями по умолчанию или без них или использовать for_each, когда у вас есть несколько ресурсов для создания из списка / карты.

Комментарии:

1. > не думаю, что в настоящее время возможно «развернуть» карту внутри ресурса health_check не может быть больше ресурсов, у него может быть только один блок. Вот почему я не хочу использовать for_each