Heim > Backend-Entwicklung > Golang > Wie erstelle ich ein benutzerdefiniertes Terraform-Datenquellenanbieterschema für eine Karte mit Kartenwerten?

Wie erstelle ich ein benutzerdefiniertes Terraform-Datenquellenanbieterschema für eine Karte mit Kartenwerten?

PHPz
Freigeben: 2024-02-10 11:03:09
nach vorne
832 Leute haben es durchsucht

如何为地图值的地图创建自定义 terraform 数据源提供程序架构?

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!

Frageninhalt

Ich habe eine Golang-Funktion, die einen map[string]map[string]stringRollentyp

zurückgibt

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]]
Nach dem Login kopieren

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,
            },
        },
    }
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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" = "-"
}
Nach dem Login kopieren

Workaround

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: typestringtypeinttypebool.

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{
                // ...
            },
        },
    },
}
Nach dem Login kopieren

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
  })
)
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage