У меня есть следующая многострочная переменная в Terraform для PRIVATE_KEY, закодированная с помощью функции base64encode
.
oci_prv_key = <<EOT
-----BEGIN PRIVATE KEY-----
xxxxxxxxx
xxxxxxxx
xxxxxxxxx
xxxxxxxxx
-----END PRIVATE KEY-----
EOT
когда я декодирую переменную с помощью функции base64decode
маркер heredoc <<EOT
и EOT
включен в значение, как я могу исправить это поведение?
предполагается или я предполагаю, что значение должно иметь только закрытый ключ без маркеров Heredoc и начала и конца или строки
С вашим кодом все в порядке — переменная была задана как строка heredoc и будет отображаться так в плане, если вы создадите выходную переменную с ее значением. Именно так Terraform представляет или отображает многострочные строки.
Рассмотрим следующий модуль, который создает текстовый файл на основе локальной переменной oci_prv_key
:
locals {
oci_prv_key = <<EOT
-----BEGIN PRIVATE KEY-----
xxxxxxxxx
xxxxxxxx
xxxxxxxxx
xxxxxxxxx
-----END PRIVATE KEY-----
EOT
}
resource "local_file" "key_file" {
content = local.oci_prv_key
filename = "${path.module}/key.txt"
}
output "key" {
value = local.oci_prv_key
}
Запуск terraform plan
по-прежнему показывает <<-EOT
:
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# local_file.key_file will be created
+ resource "local_file" "key_file" {
+ content = <<-EOT
-----BEGIN PRIVATE KEY-----
xxxxxxxxx
xxxxxxxx
xxxxxxxxx
xxxxxxxxx
-----END PRIVATE KEY-----
EOT
+ content_base64sha256 = (known after apply)
+ content_base64sha512 = (known after apply)
+ content_md5 = (known after apply)
+ content_sha1 = (known after apply)
+ content_sha256 = (known after apply)
+ content_sha512 = (known after apply)
+ directory_permission = "0777"
+ file_permission = "0777"
+ filename = "./key.txt"
+ id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
Changes to Outputs:
+ key = <<-EOT
-----BEGIN PRIVATE KEY-----
xxxxxxxxx
xxxxxxxx
xxxxxxxxx
xxxxxxxxx
-----END PRIVATE KEY-----
EOT
Но при запуске terraform apply
файл key.txt
будет сгенерирован с соответствующим содержимым, то есть без <<-EOT
:
-----BEGIN PRIVATE KEY-----
xxxxxxxxx
xxxxxxxx
xxxxxxxxx
xxxxxxxxx
-----END PRIVATE KEY-----
Честно говоря, я никогда не использую строки heredoc, так как они делают код более уродливым и трудным для понимания — чем больше строка, тем хуже она становится.
Вместо этого я предпочитаю хранить длинные и сложные строки, такие как содержимое json или XML, в файлах и использовать функцию file для чтения его содержимого. Или, в качестве альтернативы, используйте функцию templatefile для визуализации файла шаблона с предоставленными переменными.
Рассмотрим следующий модуль, который считывает закрытый ключ из текстового файла iac/files/key.txt
:
locals {
private_key = file("${path.module}/files/key.txt")
}
output "private_key" {
value = local.private_key
}
-----BEGIN PRIVATE KEY-----
xxxxxxxxx
xxxxxxxx
xxxxxxxxx
xxxxxxxxx
-----END PRIVATE KEY-----
При запуске terraform plan
в выходной переменной отображается <<-EOT
, поскольку это многострочная строка:
Changes to Outputs:
+ private_key = <<-EOT
-----BEGIN PRIVATE KEY-----
xxxxxxxxx
xxxxxxxx
xxxxxxxxx
xxxxxxxxx
-----END PRIVATE KEY-----
EOT
спасибо за ваш подробный ответ и хороший совет использовать содержимое файла вместо многострочных переменных. Я мог бы использовать функцию basefile64
для одновременного чтения содержимого и кодирования, а затем декодирования с помощью base64decode
Под переменной вы подразумеваете локальную переменную?