Я хочу выполнить команду в 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
находится в том же каталоге, из которого вы запускаете код 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
в конце пути к файлу, откуда я не знаю.
Линукс против Винды?
Какова структура каталогов?
Я работаю с Windows WSL (пока). На самом деле, я хочу запустить Ansible из Terraform, но, используя описанный выше метод, он не может найти playbook. Я узнал о Ansible провизор , который намного чище, чем я собирался сделать.
Итак, я вижу эту проблему как «решенную», но если я смогу понять, почему возникает ошибка, я весь вслух.
Как я уже сказал, я думаю, что это как-то связано с CRLF и LF. Если вы сохранили код в среде IDE, где установлен CRLF, и попытались запустить его в bash, он не будет работать должным образом. Однако вы можете добавить все в сценарий оболочки (вместо многострочных команд), запустить dos2unix
, и ошибка должна исчезнуть.
Хотя я использовал dos2unix
раньше, я не применил его к документам Terraform, что было решением. Спасибо, что подняли его еще раз. Это было то, что я должен был знать сам.
Кроме того, я думал о написании сценария mysqelf, но мне нужны значения, сгенерированные Terraform, поэтому мне все равно нужно передать их в сценарий. Я доволен поставщиком Ansible.
Где находится каталог
state
?