Creazione di modelli Terraform

Impara a creare modelli Terraform ben strutturati, riutilizzabili e completi.

Il modello Terraform è costituito da uno o più file di configurazione Terraform che dichiarano lo stato che desideri raggiungere per le tue risorseIBM Cloud®. Per lavorare con successo con le risorse, è necessario configurare IBM come provider cloud e aggiungere le risorse al file di configurazione di Terraform. Facoltativamente, puoi utilizzare variabili di input per personalizzare le tue risorse.

È possibile scrivere il file di configurazione di Terraform utilizzando HashiCorp Configuration Language (HCL) o il formato JSON. Si può anche usare Terraform IBM Modules(TIM) che offre componenti infrastrutturali precostituiti che aiutano a standardizzare e semplificare il processo di distribuzione.

Prima di iniziare a creare il modello di Terraform, assicurarsi di rivedere il sito IBM Cloud Schematics limitazioni.

Configurazione del blocco provider

Specifica il provider cloud che desideri utilizzare nel blocco provider del tuo file di configurazione Terraform. Il blocco provider include tutte le variabili di input richieste dal plugin IBM Cloud® Provider per Terraform per il provisioning delle tue risorse.

Chiave API di IBM Cloud

La chiave API di IBM Cloud è essenziale per autenticarsi con la piattaforma IBM Cloud. Anche il token IAM e il token di aggiornamento IAM che Schematics richiede per lavorare con l'API della risorsa e per determinare le autorizzazioni concesse. Quando si usa Terraform nativo, è sempre necessario fornire la chiave API IBM Cloud. In Schematics, il token IAM viene recuperato per tutte le risorse abilitate IAM, compresi i cluster IBM Cloud Kubernetes Service e le risorse dell'infrastruttura VPC. Tuttavia, il token IAM non viene recuperato per le risorse dell'infrastruttura classica e la chiave API deve essere fornita nel blocco provider.

**Chiave API IBM Cloud diversa nel blocco provider **

Se vuoi utilizzare una chiave API diversa da quella associata al tuo account IBM Cloud, puoi fornire questa chiave API nel blocco provider. Se una chiave API è configurata nel blocco provider, questa chiave API ha la precedenza su quella archiviata in IBM Cloud.

IBM Cloud Chiave API per l'ID di un servizio

Puoi fornire una chiave API per un ID servizio per tutti i servizi abilitati IAM, comprese le risorse dell'infrastruttura VPC. Non è possibile utilizzare un ID servizio per le risorse dell'infrastruttura classica.

Seguire le istruzioni per configurare il blocco provider.

  1. Scegli come vuoi configurare il blocco provider.

    • Opzione 1 Creare un file provider.tf separato. Le informazioni contenute in questo file vengono caricate da Terraform e IBM Cloud Schematics, e applicate a tutti i file di configurazione di Terraform che esistono nella stessa directory GitHub o nel file di archivio su nastro .tar. Questo approccio è utile se suddividi il tuo codice dell'infrastruttura in più file.
    • Opzione 2 Aggiungere un blocco provider al file di configurazione di Terraform. Si può scegliere questa opzione se si preferisce specificare il provider insieme alle variabili e alle risorse in un unico file di configurazione di Terraform.
  2. Esaminare le credenziali e le informazioni da fornire nel blocco provider per lavorare con le risorse. Schematics recupera automaticamente la chiave API IBM Cloud, in modo che non sia necessario specificare queste informazioni nel blocco provider.

  3. Crea un file provider.tf o aggiungi il seguente codice al tuo file di configurazione Terraform. Per un elenco completo dei parametri supportati che è possibile impostare nel blocco provider, consultare il riferimento del provider IBM Cloud.

    Esempio per le risorse dell'infrastruttura VPC

    provider "ibm" {
        generation = 1
        region = "<region_name>"
    }
    

    Esempio di risorse infrastrutturali classiche

    variable "iaas_classic_username" {
        type = "string"
    }
    variable "iaas_classic_api_key" {
        type = "string"
    }
    
    provider "ibm" {
        region = "<region_name>"
        iaas_classic_username = var.iaas_classic_username
        iaas_classic_api_key  = var.iaas_classic_api_key
    }
    
    

    Esempio per tutte le risorse di IBM Cloud Kubernetes Service

    provider "ibm" {
    }
    

    Esempio per tutte le altre risorse

    provider "ibm" {
        region = "<region_name>"
    }
    

Aggiunta di risorse cloud al blocco resource

Utilizzare i blocchi resource per definire le risorse Cloud che si desidera gestire con IBM Cloud Schematics.

Per poter supportare un approccio multi-cloud, Terraform utilizza più provider cloud. Il provider cloud si occupa di comprendere le risorse di cui puoi eseguire il provisioning, le loro API e i metodi da utilizzare per esporle nel cloud. Per rendere questa conoscenza disponibile agli utenti, ogni cloud provider supportato deve fornire un plug-in a riga di comando per Terraform che gli utenti possono utilizzare per lavorare con le risorse. Per avere una panoramica delle risorse che è possibile mettere a disposizione in IBM Cloud, consultare il riferimento IBM Cloud Provider Plug-in for Terraform.

Esempio di codice dell'infrastruttura per il provisioning di una VPC

resource ibm_is_vpc "vpc" {
    name = "myvpc"
}

Riferimento a risorse in altri blocchi di risorse

Rivedi le opzioni disponibili per fare riferimento alle risorse esistenti in altri blocchi di risorse del tuo file di configurazione Terraform.

La guida di riferimento per il plugin IBM Cloud Provider comprende due tipi di oggetti, origini dati e risorse. Puoi utilizzare entrambi gli oggetti per fare riferimento a risorse appartenenti ad altri blocchi di risorse.

  • Risorse: per creare una risorsa, utilizza la definizione di risorsa fornita nella guida di riferimento per il plugin IBM Cloud Provider. Una definizione di risorsa include la sintassi per configurare le risorse Cloud e un riferimento agli Attributi che mostra le proprietà che si possono referenziare come parametri di input in altri blocchi di risorse. Ad esempio, quando crei un VPC, il suo ID viene messo a disposizione al termine della creazione. Puoi utilizzarlo come parametro di input quando crei una sottorete per il tuo VPC. Utilizza questa opzione se combini più risorse in un unico file di configurazione Terraform.

    Esempio di codice dell'infrastruttura

    resource ibm_is_vpc "vpc" {
        name = "myvpc"
    }
    
    resource ibm_is_security_group "sg1" {
        name = "mysecuritygroup"
    vpc  = ibm_is_vpc.vpc.id
    }
    
  • Fonti di dati: È inoltre possibile utilizzare le fonti di dati del plug-in IBM Cloud Provider per recuperare informazioni su una risorsa Cloud esistente. Esamina la sezione Guida di riferimento agli argomenti dei riferimenti del plugin IBM Cloud Provider per vedere quali parametri di input devi fornire per richiamare una risorsa esistente. Successivamente, consulta la sezione Riferimenti degli attributi per una panoramica dei parametri di cui disponi e a cui puoi fare riferimento nei tuoi blocchi resource. Utilizza questa opzione se vuoi accedere ai dettagli di una risorsa configurata in un altro file di configurazione Terraform.

    Esempio di codice dell'infrastruttura

    data ibm_is_image "ubuntu" {
        name = "ubuntu-18.04-amd64"
    }
    
    resource ibm_is_instance "vsi1" {
        name    = "$mysi"
    vpc     = ibm_is_vpc.vpc.id
    zone    = "us-south1"
    keys    = [data.ibm_is_ssh_key.ssh_key_id.id]
    image   = data.ibm_is_image.ubuntu.id
    profile = "cc1-2x4"
    
    primary_network_interface {
        subnet          = ibm_is_subnet.subnet1.id
        security_groups = [ibm_is_security_group.sg1.id]
    }
    }
    

Gestione delle risorse in altri account

È possibile usare gli spazi di lavoro nell'account di origine IBM Cloud per eseguire lavori Terraform per creare risorse in un account di destinazione. Per fornire risorse in un account di destinazione, è necessario fornire l'identità e le autorizzazioni di accesso dell'account di destinazione. Questo può avvenire utilizzando l'identità di un utente con i permessi per l'account di destinazione. Oppure un ID servizio con autenticazione e autorizzazione trasversale appropriata per l'account di destinazione utilizzando una chiave API.

Quando si eseguono lavori attraverso l'interfaccia utente senza passare le chiavi API, per l'esecuzione delle operazioni viene assunta l'identità dell'utente connesso.

Utilizzo dei blocchi variable per personalizzare le risorse

È possibile utilizzare i blocchi di variable per creare modelli per il codice dell'infrastruttura. Ad esempio, invece di creare più file di configurazione Terraform per una risorsa che si vuole distribuire in più data center. È sufficiente riutilizzare la stessa configurazione con una variabile di input per definire il centro dati.

Memorizzazione della variabile

Puoi decidere di dichiarare le tue variabili all'interno dello stesso file di configurazione Terraform in cui specifichi le risorse di cui desideri eseguire il provisioning o di creare un file variables.tf distinto che includa tutte le tue dichiarazioni di variabile. Quando crei uno spazio di lavoro, IBM Cloud Schematics analizza automaticamente i tuoi file di configurazione Terraform per trovare le dichiarazioni di variabile.

Dichiarazione di una variabile

Quando si dichiara una variabile di input, è necessario fornire un nome per la variabile e il tipo di dati in base alla versione di Terraform. È possibile fornire un valore predefinito per la variabile. Quando le variabili di input vengono importate in Schematics e viene specificato un valore predefinito, è possibile scegliere di sovrascrivere il valore predefinito. \n IBM Cloud Schematics accetta i valori come stringa per i tipi primitivi come bool, number, string e HCL formato per le variabili complesse.

  • Terraform v1.5 supporta stringhe, elenchi, mappe, bool, numeri e tipi di dati complessi come list(type), map(type), object( {attribute name=type,.} ), set(type), tuple( [type] ).

Variabile di ingresso limitante

Sì. Se definisci le variabili di input nel tuo file di configurazione Terraform, tieni presente che il valore che immetti per queste variabili può contenere fino a 2049 caratteri. Se la tua variabile di input richiede un valore che supera questo limite, il valore viene troncato dopo 2049 caratteri.

Esempio di dichiarazione di variabile senza valore predefinito

variable "datacenter" {
    type        = "string"
    description = "The data center that you want to deploy your Kubernetes cluster in."
}

Esempio di dichiarazione di variabile con valore predefinito

variable "datacenter" {
    type        = "string"
    description = "The data center that you want to deploy your Kubernetes cluster in."
    default = "dal10"
}

Riferimento alle variabili

È possibile fare riferimento al valore della variabile in altri blocchi dei file di configurazione di Terraform, utilizzando la sintassi "${var.<variable_name>}".

Esempio di riferimento a una variabile datacenter

resource ibm_container_cluster "test_cluster" {
    name         = "test"
    datacenter   = var.datacenter
}

Sfruttare i moduli Terraform IBM per uno sviluppo più rapido

Opzionalmente, è possibile utilizzare Terraform IBM Modules(TIM) per creare i modelli. Aiuta a costruire rapidamente infrastrutture complesse, a semplificare le dipendenze dalle risorse, ad applicare le best practice di IBM Cloud e ad evolversi grazie ai contributi della comunità di IBM Cloud.

Esempio: Utilizzo del modulo VPC di TIM

module "vpc" {
  source  = "terraform-ibm-modules/vpc/ibm"
  version = "1.1.0"

  vpc_name                    = "my-production-vpc"
  resource_group_id           = "Default"
  classic_access              = false
  default_address_prefix      = "auto"
  default_network_acl_name    = "my-default-acl"
  default_security_group_name = "my-default-sg"
  default_routing_table_name  = "my-default-rt"
}

Esplorate i moduli disponibili:

Fornire i valori a IBM Cloud Schematics per le variabili dichiarate

È possibile fornire i valori dopo la creazione dell'area di lavoro per IBM Cloud Schematics da usare nelle azioni di Terraform, per le variabili dichiarate nel modello.

  • Per UI, è possibile fornire i valori nella pagina IBM Cloud > Schematics > spazio di lavoro > Impostazioni. Il campo value è il valore del formato HCL fornito nel file .tfvars.

  • Per CLI, è possibile vedere creare o aggiornare i valori per il tipo di dati Complex. Quindi, il campo value deve contenere la stringa di escape per l'archivio delle variabili, come mostrato nell'esempio.

  • Per API, è possibile vedere creare o aggiornare i valori nel campo template_data > variablestore. Il campo value è il valore del formato HCL fornito nel file .tfvars. È sempre una stringa JSON per qualsiasi tipo di variabile.

    Esempio

    "variablestore": [
                {
                    "value": "[\n    {\n      internal = 800\n      external = 83009\n      protocol = \"tcp\"\n    }\n  ]",
                    "description": "",
                    "name": "docker_ports",
                    "type": "list(object({\n    internal = number\n    external = number\n    protocol = string\n  }))"
                },
                {
                    "name": "worker_pool_labels",
                    "type": "map(string)",
                    "value": "{\n        \"label-name1\": \"label-value1\",\n        \"label-name2\": \"label-value2\"\n}"
                },
                {
                    "name": "docker_ports",
                    "type": "list(object({\n    internal = number\n    external = number\n    protocol = string\n  }))",
                    "value": "[\n    {\n      internal = 800\n      external = 83009\n      protocol = \"tcp\"\n    }\n  ]",
                    "description": ""
                }
        ]
    

Posso vedere come dichiarare variabili complesse in un file?

Sì, quando si dichiara e si assegna il valore alle variabili, è possibile visualizzare il tooltip nell'interfaccia utente. La tabella fornisce alcuni esempi di tipi di dati complessi che possono essere dichiarati nell'archivio delle variabili.

Tipi di variabili complesse con esempio
Immettere Esempio
number 4.56
string Valore di esempio
bool false
map(string) {key1 = "value1", key2 = "value2"}
set(string) ["ciao", "lui"]
map(number) {internal = 8080, external = 2020}
list(string) ["us-south", "eu-gb"]
list ["valore", 30]
list(list(string)) Vedere l'elenco di esempi di stringhe.
list(object({internal = number external = number protocol = string})) Vedere l'elenco degli esempi di oggetti.

Esempio di elenco di stringhe

[
        "test", "env:prod", "env:agent:test"
]

Esempio di elenco di Oggetti

[
    {
        internal = 8300
        external = 8300
        protocol = "tcp"
    },
    {
        internal = 8301
        external = 8301
        protocol = "ldp"
    }
]

Archiviazione dei tuoi modelli Terraform

I tuoi file di configurazione Terraform contengono codice dell'infrastruttura, che devi gestire come il codice standard. Per supportare la collaborazione, l'origine e il controllo delle versioni, archiviate i vostri file in un repository GitHub o GitLab. Con il controllo delle versioni, puoi ripristinare le versioni precedenti, controllare le modifiche e condividere il codice con più team. Se non si desidera archiviare i file in GitHub,, fornire il modello caricando un file di archivio su nastro o .tar dal proprio computer locale. Se si desidera clonare, vedere le estensioni di file consentite e bloccate per la clonazione.

La struttura delle directory del modello Terraform nel repository GitHub è elencata nella tabella con l'ultimo aggiornamento.

Struttura della directory dei template di Terraform
File Descrizione
README.md Creare README.md
main.tf Crea main.tf
output.tf Crea output.tf
provider.tf Crea provider.tf
variables.tf Crea variables.tf

Soluzioni Terraform di esempio

Diverse soluzioni dimostrano la forza dei servizi IBM Cloud® Schematics e IBM Cloud® quando vengono utilizzati insieme. Queste soluzioni utilizzano un semplice modello o modulo Terraform per configurare l'infrastruttura. Anche se ogni soluzione è presentata attraverso l'obiettivo di un particolare caso d'uso, queste infrastrutture sono tipiche di diversi settori.

Utilizzate i modelli di soluzione Terraform pubblicati attraverso IBM Cloud Schematics per creare la vostra infrastruttura, gestire le risorse e utilizzare strumenti potenti per proteggere, gestire e monitorare il vostro spazio di lavoro e le vostre azioni.