Der PHP-Editor Banana stellt Ihnen heute vor, wie Sie eine benutzerdefinierte Terraform-Datenquellenanbieterarchitektur für eine Karte mit Kartenwerten erstellen. Wenn wir Terraform für die Orchestrierung der Infrastruktur verwenden, müssen wir für die dynamische Konfiguration häufig Daten von externen Systemen oder Diensten abrufen. Und ein benutzerdefinierter Datenquellenanbieter kann uns dabei helfen, dieses Ziel zu erreichen. Durch die Erstellung eines benutzerdefinierten Datenquellenanbieterschemas können wir die benötigten Daten einfach aus der Karte der Kartenwerte abrufen und in unserer Terraform-Konfiguration anwenden. Als nächstes lernen wir, wie man es erreicht!
Ich habe eine Golang-Funktion, die einen map[string]map[string]string
Rollentyp
Zum Beispiel:
map[foo:map[name:abc env:dev id:465 project:e-1] boo:map[name:def env:prd id:82 project:e-1] :doo[name:ght env:stg id:353 project:e-3]]
Ich habe ein Schema dafür erstellt, wie unten gezeigt...
func datasourceaccounthelper() *schema.resource { return &schema.resource{ read: accounthelperread, schema: map[string]*schema.schema{ "roles": { type: schema.typemap, elem: &schema.schema{ type: schema.typemap, computed: true, elem: &schema.schema{ type: schema.typestring, }, }, computed: true, }, "id": &schema.schema{ computed: true, type: schema.typestring, }, }, } }
Und die Erstellungsmethode zum Übergeben des Rollenwerts an das Schema
func rolesread(d *schema.resourcedata, m interface{}) error { filteredroles := filteraccounts("john") // returns `map[string]map[string]string` if err := d.set("account_map", filteredroles); err != nil { return err } //accountmaps := make(map[string]interface{}) d.setid("-") return nil }
Aber die Terraform-Ausgabe ist eine leere Karte, wie kann ich das beheben, bitte helfen Sie :)
outputs: output = { "roles" = tomap(null) /* of map of string */ "id" = tostring(null) }
Die erwartete Ausgabe ist wie folgt
Outputs: output = { "roles" = { foo = {name = "abc" env = "dev" id= 465 project = "e-1"} boo = {name = "efg" env = "prd" id= 82 project = "e-2"} }, "id" = "-" }
Die alte Version von Terraform SDK, die Sie verwenden, erreicht nicht das, was Sie hier erreichen möchten. Zuordnungen können nur primitiven Typs sein: typestring
、typeint
、typebool
.
Um diese Struktur zu erstellen, müssen Sie auf das neue Framework migrieren, das für das Typsystem des modernen Terraform erstellt wurde, und nicht (wie es bei SDKv2 der Fall ist) für das Typsystem des klassischen Terraform v0.11 und früher.
Im Terraform-Plugin-Framework ist die äquivalente Struktur zu dem, was Sie hier beschreiben möchten, mapnestedattribute
, und im Folgenden wird die Architekturstruktur beschrieben, die Sie in Ihrer Frage zeigen:
schema.mapnestedattribute{ nestedobject: schema.nestedattributeobject{ attributes: map[string]schema.attribute{ "name": schema.stringattribute{ // ... }, "env": schema.stringattribute{ // ... }, "id": schema.numberattribute{ // ... }, "project": schema.stringattribute{ // ... }, }, }, }
Dies stellt eine Zuordnung von Objekten mit bestimmten Eigenschaften dar, sodass der obige Schematyp der folgenden Typeinschränkung entspricht, die mithilfe der Typeinschränkungssyntax der Terraform-Sprache verwendet werden kann:
map( object({ name = string env = string id = number project = string }) )
Das obige ist der detaillierte Inhalt vonWie erstelle ich ein benutzerdefiniertes Terraform-Datenquellenanbieterschema für eine Karte mit Kartenwerten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!