Sobes.tech
Senior

Como desenvolver o seu próprio provedor no Terraform?

sobes.tech IA

Resposta da IA

Para desenvolver o seu próprio provedor Terraform, é necessário:

  1. Escolher a linguagem: Go, que é a linguagem principal para os provedores Terraform.

  2. Instalar o SDK: Go e Terraform Plugin SDK.

  3. Criar a estrutura do projeto:

    # Criar arquivos básicos
    mkdir terraform-provider-myprovider
    cd terraform-provider-myprovider
    go mod init github.com/myorg/terraform-provider-myprovider
    go get github.com/hashicorp/terraform-plugin-sdk/v2
    
  4. Implementar o provedor: criar um arquivo provider.go e definir a estrutura Provider, incluindo:

    • Schema: definição dos parâmetros de configuração do provedor.
    • ResourcesMap: mapeamento dos nomes de recursos às suas implementações.
    • DataSourcesMap: mapeamento dos nomes das fontes de dados às suas implementações.
    package main
    
    import (
    	"context"
    
    	"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
    	"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
    )
    
    func Provider() *schema.Provider {
    	return &schema.Provider{
    		Schema: map[string]*schema.Schema{
    			"endpoint": { // Exemplo de parâmetro de configuração do provedor
    				Type:        schema.TypeString,
    				Optional:    true,
    				DefaultFunc: schema.EnvDefaultFunc("MYPROVIDER_ENDPOINT", nil),
    			},
    		},
    		ResourcesMap: map[string]*schema.Resource{
    			"myprovider_resource": resourceMyProviderResource(), // Implementação do recurso
    		},
    		DataSourcesMap: map[string]*schema.Resource{
    			// Implementação das fontes de dados
    		},
    		ConfigureContextFunc: providerConfigure, // Função para configurar o cliente
    	}
    }
    
    func providerConfigure(ctx context.Context, d *schema.ResourceData) (interface{}, diag.Diagnostics) {
    	// Lógica de configuração do cliente do provedor
    	return nil, nil
    }
    
    func main() {
    	// Ponto de entrada
    }
    
  5. Implementar recursos e fontes de dados: criar arquivos separados para cada recurso e fonte de dados (por exemplo, resource_myprovider_resource.go). Cada recurso deve implementar funções:

    • Schema: definição dos parâmetros do recurso.
    • Create: criação do recurso.
    • Read: leitura do estado do recurso.
    • Update: atualização do recurso.
    • Delete: exclusão do recurso.
    • Exists: verificação da existência do recurso (opcional).
    package main
    
    import (
        "context"
    
        "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
        "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
    )
    
    func resourceMyProviderResource() *schema.Resource {
        return &schema.Resource{
            CreateContext: resourceMyProviderResourceCreate,
            ReadContext:   resourceMyProviderResourceRead,
            UpdateContext: resourceMyProviderResourceUpdate,
            DeleteContext: resourceMyProviderResourceDelete,
            Schema: map[string]*schema.Schema{
                "name": { // Exemplo de parâmetro do recurso
                    Type:     schema.TypeString,
                    Required: true,
                },
            },
        }
    }
    
    func resourceMyProviderResourceCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
        // Lógica de criação do recurso
        return nil
    }
    // ... Implementação de Read, Update, Delete
    
  6. Compilar: construir o arquivo executável do provedor.

  7. Instalar: colocar o arquivo binário compilado no diretório de plugins do Terraform (~/.terraform.d/plugins/ ou outro local especificado na configuração do Terraform).

  8. Testar: escrever testes de aceitação para verificar o funcionamento correto do provedor.

Etapas adicionais podem incluir:

  • Documentar o provedor.
  • Publicar o provedor no Terraform Registry.
  • Utilizar Framework em vez do SDK para um desenvolvimento mais moderno.