В соответствии с моим предыдущим сообщением о том, как использовать встроенные механизмы цикла 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://www.terraform.io/docs/extend/writing-custom-providers.html
- https://github.com/terraform-providers/terraform-provider-template
- https://stackoverflow.com/a/8758771
- https://www.calhoun.io/intro-to-templates-p3-functions/
- https://medium.com/ovni/terraform-templating-and-loops-9a88c0786c5c
Оригинал: «https://dev.to/ineedale/writing-my-own-terraform-template-data-provider-loa»