#git #terraform #heredoc #line-endings #terraform-template-file
Вопрос:
У меня есть этот ресурс терраформирования (немного упрощенный для ясности):
resource "azurerm_key_vault_secret" "env_secrets" {
name = "my-secret"
key_vault_id = var.key_vault_id
value = <<-EOT
{
"ADMIN_USER": "admin",
"ADMIN_PASSWORD": "some_secret",
}
EOT
content_type = "application/x-json"
}
Что происходит, так это то, что в зависимости от того, где выполняется терраформа (на WSL2 в Windows или на Ubuntu в конвейере развертывания), окончание строки меняется туда и обратно n
rn
, что означает, что все время должно применяться «изменение», которое не является идеальным.
Есть ли какой-нибудь хороший способ это исправить? Я предполагаю , возможно, жесткое преобразование n
, или удаление r
, или что-то в этом роде. Может быть, есть какие-то стандартные способы исправить это?
P.S. Я предполагаю, что разные окончания строк происходят из-за git, но, похоже, это правильный способ поведения git, поэтому его, вероятно, следует исправить в terraform.
Ответ №1:
Вот что я в итоге сделал:
locals {
value_raw = <<-EOT
{
"ADMIN_USER": "admin",
"ADMIN_PASSWORD": "some_secret",
}
EOT
value = chomp(replace(local.value_raw, "rn", "n"))
}
resource "azurerm_key_vault_secret" "env_secrets" {
value = local.value
}
Ответ №2:
Похоже, что ваша система контроля версий настроена на автоматическую перезапись окончаний строк файлов при их извлечении в разных системах. Терраформировать пытается сохранить строку именно так, как написано (ведь окончаний строк может быть важно для систем, вы используете терраформировать, чтобы управлять, хотя это не так для JSON), поэтому, если вы хотите, чтобы поведение было одинаковым на всех платформах, то вам следует общий настроить ваши системы контроля версий, чтобы сохранить именно тот байтов, записанных в .tf
файлы, а не автоматически перезаписывать их на кассе.
Если ваш исходный код находится в Git, вы можете настроить это поведение с помощью .gitattributes
файла в своем репозитории.
Однако в вашем конкретном случае, поскольку вы генерируете JSON, странно использовать строку heredoc, потому что в Terraform есть jsonencode
функция, предназначенная именно для этой цели:
resource "azurerm_key_vault_secret" "env_secrets" {
value = jsonencode({
"ADMIN_USER" = "admin"
"ADMIN_PASSWORD" = "some_secret"
})
}
Поскольку jsonencode
функция знает, что она генерирует JSON, и, следовательно, пробелы там не имеют значения, она будет генерировать согласованный результат независимо от окончаний строк, используемых в исходном файле. Этот подход также обычно работает лучше, если позже вы захотите динамически создавать части структуры данных JSON, поскольку в этом аргументе можно использовать произвольные выражения Terraform jsonencode
.
Комментарии:
1. Большое спасибо за помощь! Значения Json были только одним из примеров, и, к сожалению, у меня есть другие значения, отличные от json, созданные таким же образом. Также является проблемой настроить git на игнорирование перевода строк, так как открытие файлов в разных системах, вероятно, переопределит окончания строк туда и обратно… Я постараюсь переключиться на json, где это возможно, это кажется разумным решением
2. Настройка соглашений в вашей команде о том, как создавать файлы независимо от платформы, — это то, что вам нужно будет координировать за пределами Terraform. Например, вы можете использовать автоматические проверки в своей системе управления версиями, чтобы убедиться, что новые запросы на извлечение имеют только ожидаемые окончания строк, и вернуть ошибку, если это не так. Если все в вашей команде используют редактор, который его поддерживает, вы также можете помочь людям создавать подходящие файлы по умолчанию с помощью EditorConfig .