Файл local_exec поставщика Terraform не найден с помощью EOT

Я хочу выполнить команду в Terraform для создания ресурса, для которого требуется файл. Команда отлично выполняется при использовании ее в однострочнике, таком как command = "<COMMAND>".

Однако, поскольку команда довольно длинная, я хочу использовать EOT и создать многострочную команду с разделителем \. Теперь он не распознает ни один файл, который мне нужен, но он распознавал его до использования oneliner (команда ниже — это просто пример).

  provisioner "local-exec" {
    interpreter = ["bash", "-c"]
    command = <<-EOT
      cat .state/test.txt
    EOT
  }

Я выбрасываю следующую ошибку:

│ Error running command 'cat .state/test.txt
│ ': exit status 1. Output: cat: '.state/test.txt'$'\r': No such file or directory

а файл существует?

Любая помощь в понимании приветствуется.

Где находится каталог state?

Marko E 31.03.2022 15:28
Стоит ли изучать 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
1
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я собираюсь пойти на риск и предположить, что каталог state находится в том же каталоге, из которого вы запускаете код terraform, так что это должно быть легко исправить:

  provisioner "local-exec" {
    interpreter = ["bash", "-c"]
    command = <<-EOT
      cat ./state/test.txt
    EOT
  }

В качестве альтернативы вы можете сделать следующее:

  provisioner "local-exec" {
    interpreter = ["bash", "-c"]
    command = <<-EOT
      cat "${path.root}/state/test.txt"
    EOT
  }

Более подробную информацию об использовании переменных на основе path можно найти в [1].


[1] https://www.terraform.io/language/expressions/references#filesystem-and-workspace-info

Хотя это логичное решение, абсолютные пути также не заставляют его работать. Я думаю, что ошибка находится в $'\r в конце пути к файлу, откуда я не знаю.

kennybuffel 02.04.2022 16:56

Линукс против Винды?

Marko E 02.04.2022 19:30

Какова структура каталогов?

Marko E 02.04.2022 20:40

Я работаю с Windows WSL (пока). На самом деле, я хочу запустить Ansible из Terraform, но, используя описанный выше метод, он не может найти playbook. Я узнал о Ansible провизор , который намного чище, чем я собирался сделать.

kennybuffel 03.04.2022 21:46

Итак, я вижу эту проблему как «решенную», но если я смогу понять, почему возникает ошибка, я весь вслух.

kennybuffel 03.04.2022 21:48

Как я уже сказал, я думаю, что это как-то связано с CRLF и LF. Если вы сохранили код в среде IDE, где установлен CRLF, и попытались запустить его в bash, он не будет работать должным образом. Однако вы можете добавить все в сценарий оболочки (вместо многострочных команд), запустить dos2unix, и ошибка должна исчезнуть.

Marko E 04.04.2022 08:34

Хотя я использовал dos2unix раньше, я не применил его к документам Terraform, что было решением. Спасибо, что подняли его еще раз. Это было то, что я должен был знать сам.

kennybuffel 04.04.2022 11:56

Кроме того, я думал о написании сценария mysqelf, но мне нужны значения, сгенерированные Terraform, поэтому мне все равно нужно передать их в сценарий. Я доволен поставщиком Ansible.

kennybuffel 04.04.2022 11:59

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