Terraform: инфраструктура на уровне кода | страница 116
template = file("${path.module}/user-data-new.sh")
vars = {
server_port = var.server_port
}
}
Если атрибут var.enable_new_user_data равен true, будет создан источник data.template_file.user_data_new, но не data.template_file.user_data. Если он равен false, все будет наоборот. Вам остается лишь присвоить параметру user_data ресурса aws_launch_configuration источник данных template_file, который на самом деле существует. Для этого можно воспользоваться еще одним условным выражением:
resource "aws_launch_configuration" "example" {
image_id = "ami-0c55b159cbfafe1f0"
instance_type = var.instance_type
security_groups = [aws_security_group.instance.id]
user_data = (
length(data.template_file.user_data[*]) > 0
? data.template_file.user_data[0].rendered
: data.template_file.user_data_new[0].rendered
)
# Требуется при использовании группы автомасштабирования
# в конфигурации запуска.
# https://www.terraform.io/docs/providers/aws/r/launch_configuration.html
lifecycle {
create_before_destroy = true
}
}
Разберем по частям большое значение параметра user_data. Вначале взгляните на проверку булева условия:
length(data.template_file.user_data[*]) > 0
Обратите внимание, что оба источника данных используют параметр count и, следовательно, являются массивами, поэтому для работы с ними нужно использовать соответствующий синтаксис. Однако один из них имеет длину 1, а другой — 0, поэтому вы не можете напрямую обратиться по заданному индексу (например, data.template_file.user_data[0]), так как массив может оказаться пустым. В качестве решения можно воспользоваться выражением *, которое всегда возвращает массив (хоть и потенциально пустой), и затем проверить его длину.
Затем, учитывая длину массива, мы можем выбрать одно из следующих выражений:
? data.template_file.user_data[0].rendered
: data.template_file.user_data_new[0].rendered
Terraform выполняет отложенное вычисление условных результатов, поэтому значение true будет получено, только если условие истинно. В противном случае значение равно false. Таким образом, обращение к элементам user_data и user_data_new с индексом 0 будет безопасным, поскольку мы знаем, что вычислению подлежит только выражение с непустым массивом.
Можете теперь попробовать новый скрипт пользовательских данных в тестовой среде. Для этого присвойте параметру enable_new_user_data в файле live/stage/services/webserver-cluster/main.tf значение true: