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