Рубрики
Uncategorized

Написание моего собственного поставщика шаблона Terraform (данные)

В качестве продолжения моего предыдущего поста о том, как использовать встроенные механизмы петли Terrafrom, я установил Ou … Tagged with Go, Terraform, DevOps, Automation.

В соответствии с моим предыдущим сообщением о том, как использовать встроенные механизмы цикла Terrafrom, я решил написать свой собственный поставщик данных «данные», в данном случае новый визуализатор шаблона, который позволил бы мне использовать текст/шаблон Golang. самого терраформа.

TL; DR — Код здесь ..

Алекс-Леонхардт/Терраформ-провален-холени

Я начал с того, что пытался следовать Hashicorp’s Написание пользовательских провайдеров Документация, однако, это не объясняет, как написать данные поставщик , и хотя у меня был базовый Hello World, работающий, я не был слишком близко к тому, что я на самом деле хотел сделать.

Итак, поскольку существует существующий поставщик шаблонов, я решил использовать это в качестве своего рода отправной точки и взломать все те биты, которые я не хотел/нуждался. Что, вероятно, означает, что я не следовал «Лучшая практика» Анкет То, что я хотел, было просто, я передаю кодируемую переменной JSON поставщику Go-Template, и она будет читать файл шаблона, рендерировать его (или сбой), и я должен иметь доступ к результату, используя метод .Rendered, Точно так же, как это делает оригинальный поставщик шаблонов.

Чтобы использовать его, это было бы примерно так …

variable "data" {
 default = {
 "msg" = "Hello World"
 "msg2" = [1, 2, 3, 4]
 }
}

data "gotemplate" "gotmpl" {
template = "${path.module}/file.tmpl"
data = "${jsonencode(var.data)}"
}

output "tmpl" {
value = "${data.gotemplate.gotmpl.rendered}"
}

Как вы можете видеть, у нас есть переменная карты «данные» со смесью значений ключей типа строки, другие типы не допускаются, кажется, — см. https://stackoverflow.com/a/8758771

Я решил, что 2 переменных должны быть достаточными, путем к файлу шаблона (шаблон) и самих кодируемых данных JSON (данные). Я, вероятно, не буду вдаваться в подробности того, как провайдер должен быть структурирован, поскольку поставщик шаблонов TF кажется немного отличным от «Написание пользовательских провайдеров» Инструкции — вероятно, так как это немного старше и, возможно, одно из первых. Таким образом, так как я следовал этому примеру (более или менее), мой новый провайдер также не следит за ним, по крайней мере, не близко.

Чтобы использовать моего нового поставщика, все, что нужно,-это составить его в файл, называемый Terraform-Provider-Gotemplate, и я могу использовать поставщика Gotemplate, это указано в файле Main.go здесь

// Provider is a TF provider
func Provider() *schema.Provider {
 return &schema.Provider{
 DataSourcesMap: map[string]*schema.Resource{
 "gotemplate": dataSourceFile(),
 },
 }
}

Важная часть действительно находится в DataSourceFile (), в котором указано, какие переменные можно получить с помощью поставщика, в моем случае это было

  • Шаблон (путь к файлу шаблона GO)
  • Данные (кодированные данные JSON)
  • рендер (готовый рендеринг)

Кроме установки схемы, я также должен был сделать ее на самом деле, это делается с

func dataSourceFile() *schema.Resource {
 return &schema.Resource{
 Read: dataSourceFileRead,

который передает функцию DataSourceFileRead с схемой. Поле чтения ресурса (или свойство? Мне нравится думать об этом как о собственности), которая должна соответствовать этой подписи функции

type ReadFunc func(*ResourceData, interface{}) error

что делается с

func dataSourceFileRead(d *schema.ResourceData, meta interface{}) error {
 rendered, err := renderFile(d)
 if err != nil {
 return err
 }
 d.Set("rendered", rendered)
 d.SetId(hash(rendered))
 return nil
}

D.Set важно установить визуализированную переменную с помощью готового шаблона рендеринга, поэтому ее можно использовать с выходом или другими поставщиками в качестве входных данных.

Перед настройкой рендеринга мы извлекит выходной выход, вызывая функцию renderfile (d), которая выглядит так

Окончательный результат доступен на GitHub, используйте его, сделайте PRS, если хотите, я научился делать это, хотя все еще немного смущен и, вероятно, не следовал Стандартный путь Письменных провайдеров, но было весело заставить это работать.

Алекс-Леонхардт/Терраформ-провален-холени

Использованная литература:

Оригинал: «https://dev.to/ineedale/writing-my-own-terraform-template-data-provider-loa»