У меня есть локальный каталог с файлами. Как я могу скопировать этот каталог с включенными объектами в другой с помощью Terraform? И мне нужно делать это каждый раз, когда я применяю модуль, а не только в первый раз.
Я пытался использовать provisioner "local-exec"
, но мне это не подходит, потому что я буду запускать это в Linux и Win, и я не хочу каждый раз менять команду и интерпретатор.
Terraform не предназначен для управления локальными файлами; в первую очередь он предназначен для работы с удаленными API по сети, чтобы результаты могли сохраняться в удаленной системе между запусками.
Тем не менее, поставщик hashicorp/local имеет некоторые типы ресурсов, которые пытаются обрабатывать локальную файловую систему, как если бы это был удаленный API. Его документация содержит предупреждение о возможных ограничениях этого:
Terraform в первую очередь имеет дело с удаленными ресурсами, которые способны пережить один запуск Terraform, поэтому локальные ресурсы иногда могут нарушать его предположения. Ресурсы здесь лучше всего использовать с осторожностью, поскольку в зависимости от локального состояния может быть сложно применить одну и ту же конфигурацию Terraform во многих разных локальных системах, где локальные ресурсы могут быть недоступны повсеместно. Дополнительные сведения см. в конкретных примечаниях к каждому ресурсу.
Если этот компромисс для вас приемлем, то должна быть возможность реализовать модуль Terraform, который объявляет эффект, который вы описываете, используя тип ресурса local_file для объявления файлов назначения, но у провайдера нет источника данных для чтения содержимое каталога, поэтому для исходных файлов набор файлов необходимо будет исправить на диске до запуска Terraform, чтобы можно было использовать функцию набора файлов. (Функции оцениваются как часть первоначальной оценки конфигурации до того, как Terraform предпримет какие-либо другие действия, поэтому эта функция не может реагировать на изменения, внесенные в файловую систему во время работы Terraform.)
variable "source_dir" {
type = string
}
variable "destination_dir" {
type = string
}
locals {
source_files = fileset(var.source_dir, "**")
}
resource "local_file" "dest" {
for_each = local.source_files
filename = "${var.source_dir}/${each.value}"
content_base64 = filebase64("${var.destination_dir}/${each.value}")
}
Это использует local_file, чтобы объявить, что каждый целевой файл должен существовать.
Важным предостережением здесь является то, что функция filebase64
считывает полное содержимое данного файла в память, а затем Terraform копирует это значение в аргумент content_base64
провайдера как часть запроса к плагину провайдера. Это означает, что этот метод возможен только в том случае, если вы знаете, что все файлы, которые вы будете копировать, относительно малы. Если у вас есть особенно большие файлы, вы, вероятно, столкнетесь либо с ограничениями ОЗУ при загрузке файла в память, либо с ограничением размера сообщения протокола плагина провайдера, отправляющего контент провайдеру hashicorp/local
.
Если есть какой-либо способ решить эту часть вашей проблемы с помощью программного обеспечения вне Terraform, например, с помощью традиционного инструмента управления конфигурацией, то я бы рекомендовал вместо этого рассмотреть этот подход. Хотя это может сработать, Terraform предназначен не для этого.