Nano Hash - криптовалюты, майнинг, программирование

Передача сложных, непримитивных типов данных поставщику шаблонов Terraform

Имея более сложный объект списка, подобный этому

variable "proxy" {
  type = list(object({
    enabled = bool
    host = string
    port = number
    user = string
    password = string
  }))
  default = [
    {
      enabled = false
      host = ""
      port = 0
      user = ""
      password = ""
    }
  ]
}

Я хочу использовать это во внешнем шаблоне (в моем случае cloudinit). Директива template_file позволяет передавать переменные в шаблон. К сожалению, не для более сложных типов:

Обратите внимание, что все переменные должны быть примитивами. Прямые ссылки на списки или карты вызовут ошибку проверки.

Так что-то вроде этого

data "template_file" "cloudinit_data" {
  template = file("cloudinit.cfg")
  vars = {
    proxy = var.proxy
  }
}

вызвать ошибку

Неподходящее значение для атрибута "vars": элемент "proxy": обязательная строка.

Это приводит меня к двум вопросам:

  1. Как передать переменную в шаблон? Я предполагаю, что мне нужно преобразовать его в такой примитивный тип:

    vars = {
        proxy_host = var.proxy.host
    }
    

Это не работает:

Это значение не имеет атрибутов.

  1. Есть ли альтернативный способ передать этот объект прямо в шаблон?

Пользуюсь v0.12.17.

07.02.2020

  • Средство визуализации шаблонов, вероятно, еще не поддерживает это, поэтому вам придется сделать это в Terraform DSL. Тогда, безусловно, можно добиться того, что вы пытаетесь сделать. 07.02.2020
  • И как я могу получить доступ к прокси-переменной, чтобы передать ее элемент как отдельные переменные в шаблон? 07.02.2020
  • Я попытался найти документацию по этому поводу, но мне кажется, что это сложно гуглить. Вы бы сделали что-то вроде var.proxy[0]["host"], чтобы получить доступ к значению ключа host в 0th элементе массива. 07.02.2020
  • Это сработало, спасибо! Мне не нужен массив, поэтому я изменил type = list(object({ на type = object({. Он работает, но сразу после того, как я удалил определение значения default (также без скобок массива []). Со значением по умолчанию я получил Недопустимое выражение. Ожидалось начало выражения, но обнаружил ошибку токена недопустимого выражения. Разве невозможно определить значение по умолчанию только для объектов, которые не были частью массива? 10.02.2020
  • Звучит как проблема с синтаксисом, но я могу попробовать воспроизвести это позже сам. 10.02.2020

Ответы:


1

Источник данных template_file продолжает существовать только для совместимости с конфигурациями, написанными для Terraform 0.11. Поскольку вы используете Terraform 0.12, вам следует вместо этого использовать функцию templatefile , который является встроенной частью языка и поддерживает все типы значений.

Поскольку templatefile - это функция, вы можете вызывать ее из любого места, где ожидаются выражения. Если вы хотите использовать обработанный результат несколько раз, вы можете определить его как именованное локальное значение, например:

locals {
  cloudinit_data = templatefile("${path.module}/cloudinit.cfg", {
    proxy = var.proxy
  })
}

Если вам нужен этот результат только один раз - например, если вы используете его только для заполнения user_data одного aws_instance ресурса - тогда вы можете просто написать это выражение встроенным в блок ресурсов, чтобы сохранить все вместе и сделать конфигурацию (субъективно) легче читать:

resource "aws_instance" "example" {
  # ...

  user_data = templatefile("${path.module}/cloudinit.cfg", {
    proxy = var.proxy
  })
}
11.02.2020
  • Действительно полезно для кого-то вроде меня, который ошибочно принимал источник данных за функцию и задавался вопросом, почему это не сработает. 01.09.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..