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



  template = file("${path.module}/user-data-new.sh")

  vars = {

    server_port = var.server_port

  }

}

Если атрибут var.enable_new_user_data равен true, будет создан источник da­ta.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, поэтому вы не можете напрямую обратиться по заданному индексу (например, da­ta.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: