Как создать строку с одной косой чертой в terraform?

#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» для однострочных строк.