Terraform: инфраструктура на уровне кода | страница 92
output "alb_dns_name" {
value = aws_lb.example.dns_name
description = "The domain name of the load balancer"
}
После этого данный вывод можно «пропустить через» файлы stage/services/webserver-cluster/outputs.tf и prod/services/webserver-cluster/outputs.tf:
output "alb_dns_name" {
value = module.webserver_cluster.alb_dns_name
description = "The domain name of the load balancer"
}
Ваш кластер веб-серверов почти готов к развертыванию. Осталось только принять во внимание несколько подводных камней.
Подводные камни
При создании модулей обращайте внимание:
• на файловые пути;
• вложенные блоки.
Файловые пути
В главе 3 вы поместили скрипт пользовательских данных для кластера веб-серверов во внешний файл, user-data.sh, и применили встроенную функцию file, чтобы прочитать его с диска. Неочевидный момент функции file состоит в том, что файловый путь, который она использует, должен быть относительным (поскольку Terraform можно запускать на множестве разных компьютеров) — но относительно чего?
По умолчанию Terraform интерпретирует этот путь относительно текущей рабочей папки. Это не вызывает проблем, если вы используете функцию file в конфигурационном файле Terraform в той же папке, из которой выполняется команда terraformapply (то есть если функция file применяется в корневом модуле). Но если сделать то же самое в модуле, размещенном в отдельной папке, ничего не будет работать.
Решить эту проблему можно с помощью выражения, известного как «ссылка на путь», которое имеет вид path.
• path.module — возвращает путь к модулю, в котором определено выражение.
• path.root — возвращает путь к корневому модулю.
• path.cwd — возвращает путь к текущей рабочей папке. При нормальном использовании Terraform это значение совпадает с path.root, но в некоторых нестандартных случаях Terraform запускается не из папки корневого модуля, что приводит к расхождению этих путей.
Для скрипта пользовательских данных нужен путь, взятый относительно самого модуля, поэтому в источнике данных template_file в файле modules/services/webser-vercluster/main.tf следует применять path.module:
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
}
}
Вложенные блоки