Как скопировать локальный полный каталог с файлами в другой локальный каталог с помощью Terraform?

У меня есть локальный каталог с файлами. Как я могу скопировать этот каталог с включенными объектами в другой с помощью Terraform? И мне нужно делать это каждый раз, когда я применяю модуль, а не только в первый раз.

Я пытался использовать provisioner "local-exec", но мне это не подходит, потому что я буду запускать это в Linux и Win, и я не хочу каждый раз менять команду и интерпретатор.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
111
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 предназначен не для этого.

Другие вопросы по теме