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.. Terraform поддерживает следующие типы этих ссылок.

• 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

  }

}


Вложенные блоки