Terraform: инфраструктура на уровне кода | страница 110



Параметр count, который вы видели ранее, позволяет создавать простые циклы. Но если проявить смекалку, тот же механизм можно использовать и для условных выражений. Мы начнем с рассмотрения конструкций if в пункте «Выражения if с использованием параметра count» ниже, а затем перейдем к выражениям if-else.


Выражения if с использованием параметра count

В главе 4 вы написали модуль Terraform, который можно применить в качестве «чертежа» для развертывания кластеров с веб-серверами. Этот модуль создавал группу автомасштабирования (ASG), балансировщик нагрузки (ALB), группы безопасности и ряд других ресурсов. Чего он не создавал, так это запланированного действия. Поскольку кластер нужно масштабировать только в промышленных условиях, вы определили ресурсы aws_autoscaling_schedule непосредственно в промышленной конфигурации в файле live/prod/services/webserver-cluster/main.tf. Можно ли их определить в модуле webserver-cluster и затем создавать только для определенных пользователей?

Попробуем это сделать. Для начала добавим булеву входную переменную в файл modules/services/webserver-cluster/variables.tf, чтобы иметь возможность включать и выключать автомасштабирование в этом модуле:

variable "enable_autoscaling" {

  description = "If set to true, enable auto scaling"

  type        = bool

}

Теперь, если бы вы использовали язык программирования общего назначения, вы бы могли применить эту входную переменную в выражении if:

# Это просто псевдокод. Он не будет работать в Terraform.

if var.enable_autoscaling {

  resource "aws_autoscaling_schedule" "scale_out_during_business_hours" {

    scheduled_action_name  = "${var.cluster_name}-scale-out-during-business-hours"

    min_size               = 2

    max_size               = 10

    desired_capacity       = 10

    recurrence             = "0 9 * * *"

    autoscaling_group_name = aws_autoscaling_group.example.name

  }

  resource "aws_autoscaling_schedule" "scale_in_at_night" {

    scheduled_action_name  = "${var.cluster_name}-scale-in-at-night"

    min_size               = 2

    max_size               = 10

    desired_capacity       = 2

    recurrence             = "0 17 * * *"

    autoscaling_group_name = aws_autoscaling_group.example.name

  }

}

Terraform не поддерживает выражения if, поэтому данный код работать не будет. Но того же результата можно добиться с помощью параметра count и двух особенностей языка.

• Если внутри ресурса параметру count присвоить значение 1, вы получите копию этого ресурса; если указать 0, этот ресурс вообще не будет создан.