#terraform #terraform-provider-aws
Вопрос:
Я хочу сформировать командную строку присоединения файловой системы в terraform.
Например, я хочу сформировать следующую командную строку
"net use Z: \fs-0e711dfff4523c0bcbbe6a.example.comshare"
Я пытаюсь следовать сценарию
fs_attach_command = format("%s%s%s%s%s","net use Z: ", "\", aws_fsx_windows_file_system.fsx_windows_file_system[project.name].dns_name, "\","share")
Но это возвращение
"net use Z: \fs-0e711dfff4523c0bcbbe6a.example.com\share"
Версия Terraform-v1.0.8
Как правильно сделать это в terraform?
Комментарии:
1. Как насчет того, чтобы поставить одну косую черту в вашем 4-м параметре вместо двойной?
2. @vele не сработало. проблема с форматом строки перенастроена
3. Какую ошибку вы получаете? Вы должны отредактировать свой вопрос, чтобы показать альтернативную версию, которую вы пробовали, и ошибку, которую вы получили от нее.
Ответ №1:
Terraform наследует C-подобное соглашение об использовании обратной косой черты в качестве escape-символа внутри шаблонов строк в кавычках, и поэтому, если вы хотите, чтобы ваша конечная строка (результат после оценки) включала буквальную обратную косую черту, вам нужно ее избежать, написав две обратные косые \
черты .
В вашем случае у вас есть ситуация, когда вы хотите, чтобы полученная строка содержала две последовательные обратные косые черты, и поэтому вам нужно будет экранировать каждую из них отдельно, что означает четыре последовательных обратных косых черты в исходной программе: \\
.
Собрав все это вместе, мы получим:
"net use Z: \\${aws_fsx_windows_file_system.fsx_windows_file_system[project.name].dns_name}\share
Каждая из этих пар обратных косых черт станет одной обратной косой чертой в результирующей строке, что даст желаемый результат:
net use Z: \fs-0e711dfff4523c0bcbbe6a.example.comshare
Обратите внимание, что Terraform обычно показывает строки в своем пользовательском интерфейсе в кавычках , как вы бы написали их в исходном коде, поэтому Terraform, скорее всего, покажет это значение в плане как "net use Z: \\fs-0e711dfff4523c0bcbbe6a.example.com\share"
, и поэтому вам нужно самостоятельно мысленно оценить эти escape-последовательности, чтобы увидеть фактическое значение строки.
Поскольку это, кажется, окна пакетной программы или аналогичного, это уже неважно, если у вас был символ новой строки в конце строки, и поэтому, возможно, стоит оставить этот, а не как мульти-линия «помощи heredoc» строки шаблона , что позволяет избежать обратной косой черты побега, потому что терраформировать занимает буквально обратные косые черты в шаблоне синтаксиса:
fs_attach_command = <<-EOT
net use Z: \${aws_fsx_windows_file_system.fsx_windows_file_system[project.name].dns_name}share
EOT
Эта форма, возможно, более удобочитаема, потому что она не включает в себя экранирование, и единственной не буквальной частью является последовательность интерполяции шаблона ${ .. }
. Однако, поскольку теперь это многострочная строка, конечное значение этого будет включать символ новой строки в конце, который может быть или не быть подходящим в зависимости от того, как вы в конечном итоге будете использовать эту строку. Terraform не имеет синтаксиса шаблона «heredoc» для однострочных строк.