Terraform: инфраструктура на уровне кода | страница 82
data "template_file" "user_data" {
template = file("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
}
}
Как видите, этот код присваивает параметрам template и vars содержимое скрипта user-data.sh и, соответственно, три переменные, которые нужны этому скрипту: порт сервера, адрес и порт базы данных. Для использования этих переменных нужно соответствующим образом обновить скрипт stage/services/webserver-cluster/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} &
Обратите внимание на несколько изменений в этом bash-скрипте по сравнению с оригиналом.
• Он ищет переменные с помощью стандартного синтаксиса интерполяции Terraform. Единственными переменными в данном случае являются те, что находятся в ассоциативном массиве vars источника template_file. Стоит отметить, что для доступа к ним не нужен никакой префикс: например, вместо var.server_port следует писать server_port.
• Теперь в скрипте можно заметить синтаксис HTML (скажем,
), который делает вывод более удобным для чтения в браузере.
Замечание о внешних файлах
Одним из преимуществ выноса скрипта пользовательских данных в отдельный файл является возможность написания для него модульных тестов. Код теста может даже заполнить интерполированные значения с помощью переменных среды, поскольку для поиска последних bash использует тот же синтаксис, который в Terraform применяется для интерполяции. Вы можете написать автоматический тест для user-data.sh примерно такого вида:
export db_address=12.34.56.78
export db_port=5555
export server_port=8888
./user-data.sh
output=$(curl "http://localhost:$server_port")
if [[ $output == *"Hello, World"* ]]; then
echo "Success! Got expected text from server."
else
echo "Error. Did not get back expected text 'Hello, World'."
fi
Заключительным шагом будет обновление параметра user_data в ресурсе aws_launch_configuration. Присвойте ему обработанный выходной атрибут источника данных template_file:
resource "aws_launch_configuration" "example" {
image_id = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
security_groups = [aws_security_group.instance.id]
user_data = data.template_file.user_data.rendered
# Требуется при использовании группы автомасштабирования