Terraform: инфраструктура на уровне кода | страница 81
user_data = < #!/bin/bash echo "Hello, World" >> index.html echo "${data.terraform_remote_state.db.outputs.address}" >> index.html echo "${data.terraform_remote_state.db.outputs.port}" >> index.html nohup busybox httpd -f -p ${var.server_port} & EOF Чем длиннее становится скрипт в параметре user_data, тем более неряшливым выглядит ваш код. Встраивание одного языка программирования (bash) в другой (Terraform) усложняет поддержку обоих, поэтому давайте на секунду остановимся и вынесем bash-скрипт в отдельный файл. Для этого можно использовать встроенную функцию file и источник данных template_file. Рассмотрим их по отдельности. Terraform включает в себя ряд встроенных функций, которые можно выполнять с помощью выражения такого вида: function_name (...) Возьмем для примера функцию format: format( Эта функция форматирует аргументы в ARGS в соответствии с синтаксисом sprintf, заданным в строке FMT41. Отличным способом поэкспериментировать со встроенными функциями является использование команды terraformconsole. Она создает интерактивную консоль, в которой вы можете попробовать синтаксис Terraform, запросить состояние вашей инфраструктуры и сразу же получить результаты: $ terraform console > format("%.3f", 3.14159265359) 3.142 Стоит отметить, что консоль Terraform предназначена только для чтения, поэтому не нужно волноваться о случайном изменении инфраструктуры или состояния. Существует целый ряд других встроенных функций для работы со строками, числами, списками и ассоциативными массивами42. К их числу относится функция file: file( Эта функция читает файл с путем PATH и возвращает его содержимое в виде строки. Например, вы могли бы сохранить скрипт пользовательских данных в файл stage/services/webserver-cluster/user-data.sh и загружать его следующим образом: file("user-data.sh") Подвох в том, что скрипту пользовательских данных для кластера веб-серверов необходима определенная динамическая информация из Terraform, включая порт сервера, а также адрес и порт базы данных. Когда скрипт был встроен в код Terraform, он получал эти значения с помощью ссылок и интерполяции. С функцией file это не сработает. Однако вместо этого вы можете воспользоваться источником данных template_file. Источник данных template_file принимает два аргумента: template (строка, которую нужно обработать) и vars (ассоциативный массив с переменными, которые должные быть доступны во время обработки). Он содержит одну выходную переменную, rendered, которая является результатом обработки template. Чтобы увидеть это в деле, добавьте следующий код источника template_file в файл stage/services/webserver-cluster/main.tf: