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



data "template_file" "user_data" {

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

  vars = {

    server_port = var.server_port

    db_address  = data.terraform_remote_state.db.outputs.address

    db_port     = data.terraform_remote_state.db.outputs.port

  }

}

Скрипт user-data.sh сейчас выглядит так:

#!/bin/bash

cat > index.html <

Hello, World

DB address: ${db_address}

DB port: ${db_port}

EOF

nohup busybox httpd -f -p ${server_port} &

Теперь представьте, что вы хотите позволить некоторым из своих кластеров использовать следующую, более короткую альтернативу под названием user-data-new.sh:

#!/bin/bash

echo "Hello, World, v2" > index.html

nohup busybox httpd -f -p ${server_port} &

Для загрузки этого скрипта вам понадобится новый источник данных template_file:

data "template_file" "user_data_new" {

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

  vars = {

    server_port = var.server_port

  }

}

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

variable "enable_new_user_data" {

  description = "If set to true, use the new User Data script"

  type        = bool

}

Если бы вы использовали язык программирования общего назначения, вы могли бы разместить в конфигурации запуска выражение if-else, которое выбирает между двумя вариантами template_file в user_data:

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

resource "aws_launch_configuration" "example" {

  image_id        = "ami-0c55b159cbfafe1f0"

  instance_type   = var.instance_type

  security_groups = [aws_security_group.instance.id]

  if var.enable_new_user_data {

    user_data = data.template_file.user_data_new.rendered

  } else {

    user_data = data.template_file.user_data.rendered

  }

}

Чтобы это заработало в настоящем коде Terraform, сначала нужно воспользоваться приемом симуляции выражения if-else, который мы рассмотрели ранее, чтобы в итоге создавался только один источник данных template_file:

data "template_file" "user_data" {

  count = var.enable_new_user_data ? 0 : 1

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

  vars = {

    server_port = var.server_port

    db_address  = data.terraform_remote_state.db.outputs.address

    db_port     = data.terraform_remote_state.db.outputs.port

  }

}

data "template_file" "user_data_new" {

  count = var.enable_new_user_data ? 1 : 0