L'éditeur php Banana vous présentera aujourd'hui comment créer une architecture de fournisseur de source de données Terraform personnalisée pour une carte de valeurs de carte. Lorsque nous utilisons Terraform pour l'orchestration de l'infrastructure, nous avons souvent besoin d'obtenir des données de systèmes ou de services externes pour une configuration dynamique. Et un fournisseur de sources de données personnalisées peut nous aider à atteindre cet objectif. En créant un schéma de fournisseur de source de données personnalisé, nous pouvons facilement obtenir les données dont nous avons besoin à partir de la carte des valeurs de la carte et les appliquer dans notre configuration Terraform. Ensuite, apprenons comment y parvenir !
J'ai une fonction golang qui renvoie un map[string]map[string]string
type de rôle
Par exemple :
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]]
J'ai créé un schéma pour cela comme indiqué ci-dessous...
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, }, }, } }
Et la méthode de création pour transmettre la valeur du rôle au schéma
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 }
Mais la sortie de Terraform est une carte vide, comment puis-je la réparer, aidez-moi s'il vous plaît :)
outputs: output = { "roles" = tomap(null) /* of map of string */ "id" = tostring(null) }
Le résultat attendu est le suivant
Outputs: output = { "roles" = { foo = {name = "abc" env = "dev" id= 465 project = "e-1"} boo = {name = "efg" env = "prd" id= 82 project = "e-2"} }, "id" = "-" }
L'ancienne version du SDK Terraform que vous utilisez ne réalise pas ce que vous essayez de faire ici. Les mappages ne peuvent être que de types primitifs : typestring
、typeint
、typebool
.
Pour créer cette structure, vous devez migrer vers le nouveau framework, qui est construit pour le système de types de Terraform moderne, plutôt que (comme c'est le cas avec sdkv2) le système de types de Terraform classique v0.11 et versions antérieures.
Dans le framework du plugin Terraform, la structure équivalente à ce que vous essayez de décrire ici est mapnestedattribute
, et ce qui suit décrit la structure d'architecture que vous montrez dans votre question :
schema.mapnestedattribute{ nestedobject: schema.nestedattributeobject{ attributes: map[string]schema.attribute{ "name": schema.stringattribute{ // ... }, "env": schema.stringattribute{ // ... }, "id": schema.numberattribute{ // ... }, "project": schema.stringattribute{ // ... }, }, }, }
Cela représente un mappage d'objets avec des propriétés données, donc le type de schéma ci-dessus est équivalent à la contrainte de type suivante, qui peut être utilisée en utilisant la syntaxe de contrainte de type du langage Terraform :
map( object({ name = string env = string id = number project = string }) )
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!