IBM Cloud Docs
Creación de plantillas de Terraform

Creación de plantillas de Terraform

Aprenda a crear plantillas de Terraform que estén bien estructuradas y sean reutilizables y completas.

Una plantilla de Terraform consta de uno o más archivos de configuración de Terraform que declaran el estado que desea alcanzar para los recursos de IBM Cloud®. Para trabajar correctamente con sus recursos, debe configurar IBM como su proveedor de nube y añadir recursos a su archivo de configuración de Terraform. De manera opcional, puede utilizar variables de entrada para personalizar los recursos.

Puede escribir el archivo de configuración de Terraform utilizando la sintaxis de HashiCorp Configuration Language (HCL) o el formato JSON.

Antes de empezar a crear su plantilla de Terraform, revise la sección Limitaciones de IBM Cloud Schematics.

Configuración del bloque provider

Especifique el proveedor de nube que desee utilizar en el bloque provider del archivo de configuración de Terraform. El bloque provider incluye todas las variables de entrada que el plugin de proveedor de IBM Cloud® para Terraform requiere para poderle suministrar recursos.

Clave de API de IBM Cloud

La clave de API IBM Cloud es esencial para autenticarse con la plataforma IBM Cloud. También la señal de IAM y la señal de renovación de IAM que Schematics requiere para trabajar con la API del recurso y para determinar los permisos que se le han otorgado. Cuando utiliza Terraform nativo, siempre debe proporcionar la clave de API de IBM Cloud. En Schematics, la señal de IAM se recupera automáticamente para todos los recursos habilitados para IAM, incluyendo los clústeres de IBM Cloud Kubernetes Service y los recursos de infraestructura de VPC. Sin embargo, el token IAM no se recupera para los recursos de infraestructura clásicos y la clave API debe proporcionarse en el bloque provider.

**Diferente IBM Cloud Clave API en el bloque provider **

Si desea utilizar una clave de API distinta de la que tiene asociada a su cuenta de IBM Cloud, puede proporcionar esta clave de API en el bloque provider. Si se configura una clave de API en el bloque provider, esta clave de API tiene prioridad sobre la clave de API almacenada en IBM Cloud.

IBM Cloud Clave API para un ID de servicio

Puede proporcionar una clave de API para un ID de servicio para todos los servicios habilitados para IAM, incluyendo los recursos de infraestructura de VPC. No se puede utilizar un ID de servicio para los recursos de infraestructura clásicos.

Siga las instrucciones para configurar el bloque provider.

  1. Elija cómo desea configurar el bloque provider.

    • Opción 1 Cree un archivo provider.tf independiente. La información de este archivo se carga mediante Terraform e IBM Cloud Schematics, y se aplica a todos los archivos de configuración de Terraform que existen en el mismo directorio de GitHub o archivo de archivado de cinta .tar. Este enfoque es útil si divide el código de infraestructura en varios archivos.
    • Opción 2 Añada un bloque provider a su archivo de configuración de Terraform. Puede elegir esta opción si prefiere especificar el proveedor junto con sus variables y recursos en un archivo de configuración de Terraform.
  2. Revise qué credenciales e información debe proporcionar en el bloque provider para trabajar con los recursos. Schematics recupera automáticamente la clave de API IBM Cloud para que no tenga que especificar esta información en el bloque provider.

  3. Cree un archivo provider.tf o añada el código siguiente al archivo de configuración de Terraform. Para obtener una lista completa de los parámetros soportados que puede definir el bloque provider, consulte la referencia de proveedor de IBM Cloud.

    Ejemplo de recursos de infraestructura VPC

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

    Ejemplo de recursos de infraestructura clásicos

    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
    }
    
    

    Ejemplo para todos los recursos IBM Cloud Kubernetes Service

    provider "ibm" {
    }
    

    Ejemplo para todos los demás recursos

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

Añadir recursos en la nube al bloque resource

Utilice los bloques resource para definir los recursos de la nube que desea gestionar con IBM Cloud Schematics.

Para dar soporte al enfoque multinube, Terraform trabaja con varios proveedores de nube. Un proveedor de nube tiene la responsabilidad de conocer los recursos que puede suministrar, su API y los métodos para exponer estos recursos en la nube. Para que este conocimiento esté disponible para los usuarios, cada proveedor de nube admitido debe proporcionar un plugin de línea de mandatos para Terraform que los usuarios puedan utilizar para trabajar con los recursos. Para encontrar una visión general de los recursos que puede suministrar en IBM Cloud, consulte la Referencia de IBM Cloud Provider Plug-in for Terraform.

Ejemplo de código de infraestructura para el aprovisionamiento de una VPC

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

Cómo hacer referencia a recursos en otros bloques de recursos

Revise las opciones que tiene para hacer referencia a recursos existentes en otros bloques de recursos del archivo de configuración de Terraform.

La referencia del plugin de proveedor de IBM Cloud incluye dos tipos de objetos, orígenes de datos y recursos. Puede utilizar ambos objetos para hacer referencia a recursos en otros bloques de recursos.

  • Recursos: para crear un recurso, utilice la definición del recurso en la referencia del plugin de proveedor de IBM Cloud. Una definición de recurso incluye la sintaxis para configurar sus recursos de Nube y una referencia de Atributos que muestra las propiedades a las que puede hacer referencia como parámetros de entrada en otros bloques de recursos. Por ejemplo, al crear una VPC, el ID de la VPC está disponible tras la creación. Puede utilizar el ID como parámetro de entrada al crear una subred para la VPC. Utilice esta opción si combina varios recursos en un archivo de configuración de Terraform.

    Ejemplo de un código de infraestructura

    resource ibm_is_vpc "vpc" {
        name = "myvpc"
    }
    
    resource ibm_is_security_group "sg1" {
        name = "mysecuritygroup"
    vpc  = ibm_is_vpc.vpc.id
    }
    
  • Fuentes de datos: También puede utilizar las fuentes de datos de la referencia del complemento IBM Cloud Provider para recuperar información sobre un recurso Cloud existente. Revise la sección Referencia de argumentos de la referencia del plugin de proveedor de IBM Cloud para ver qué parámetros de entrada debe proporcionar para recuperar un recurso existente. A continuación, revise la sección Referencia de atributos para obtener una visión general de los parámetros que tiene disponibles y a los que puede hacer referencia en los bloques resource. Utilice esta opción si desea acceder a los detalles de un recurso configurado en otro archivo de configuración de Terraform.

    Ejemplo de un código de infraestructura

    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]
    }
    }
    

Gestión de recursos en otra cuenta

Puede utilizar espacios de trabajo en la cuenta de origen IBM Cloud para ejecutar trabajos de Terraform para crear recursos en una cuenta de destino. Para suministrar recursos en una cuenta de destino, se deben proporcionar los permisos de identidad y acceso de la cuenta de destino. Esto puede ser utilizando la identidad de un usuario con permisos para la cuenta de destino. O un ID de servicio con autenticación y autorización de cuentas cruzadas adecuada para la cuenta de destino utilizando una clave de API.

Cuando se ejecutan trabajos a través de la interfaz de usuario sin pasar claves de API, se presupone la identidad del usuario que ha iniciado la sesión para ejecutar operaciones.

Utilización de bloques variable para personalizar recursos

Puede utilizar bloques variable para crear una plantilla para el código de infraestructura. Por ejemplo, en lugar de crear varios archivos de configuración de Terraform para un recurso que desea desplegar en varios centros de datos. Simplemente reutilice la misma configuración con una variable de entrada para definir el centro de datos.

Almacenamiento de variables

Puede optar por declarar sus variables dentro del mismo archivo de configuración de Terraform donde especifica los recursos que desea suministrar, o crear un archivo variables.tf aparte que incluya todas las declaraciones de variables. Al crear un espacio de trabajo, IBM Cloud Schematics analiza automáticamente los archivos de configuración de Terraform para encontrar las declaraciones de variables.

Declarar una variable

Al declarar una variable de entrada, debe proporcionar un nombre para la variable y el tipo de datos de acuerdo con la versión de Terraform. De forma opcional, puede proporcionar un valor predeterminado para la variable. Cuando las variables de entrada se importan en Schematics y se especifica un valor por defecto, puede elegir sobrescribir el valor por defecto. \n IBM Cloud Schematics acepta los valores como una cadena para tipos primitivos como bool, number, string, y HCL formato para variables complejas.

  • Terraform v1.5 admite tipos de datos de cadena, lista, mapa, bool, número y complejos como lista(tipo), mapa(tipo), objeto( {attribute name=type,.} ), conjunto(tipo), tupla( [tipo] ).

Variable de entrada limitadora

Sí. Si define variables de entrada en el archivo de configuración de Terraform, tenga presente que el valor que especifique para estas variables pue de tener un máximo de 2049 caracteres. Si su variable de entrada requiere un valor que supera este límite, el valor se truncará a los 2049 caracteres.

Ejemplo de declaración de variable sin valor por defecto

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

Ejemplo de declaración de variable con un valor por defecto

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

Cómo hacer referencia a variables

Puede hacer referencia al valor de la variable en otros bloques de los archivos de configuración de Terraform utilizando la sintaxis "${var.<variable_name>}".

Ejemplo de referencia a una variable datacenter

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

Cómo proporcionar valores a IBM Cloud Schematics para las variables declaradas

Puede proporcionar los valores después de crear el espacio de trabajo para IBM Cloud Schematics para utilizar en las acciones de Terraform, para las variables que se declaran en la plantilla.

  • Para UI, puede proporcionar los valores en la página IBM Cloud > Schematics > espacio de trabajo > Configuración. El campo value es el valor de formato de HCL proporcionado en el archivo .tfvars.

  • Para CLI, puede ver crear, o actualizar los valores para el tipo de datos Complejo. A continuación, el campo value debe contener la cadena escapada para el almacén de variables, como se muestra en el ejemplo.

  • Para API, puede ver crear o actualizar los valores en el campo template_data > variablestore. El campo value es el valor del formato HCL proporcionado en el archivo .tfvars. Siempre es una serie JSON, para cualquier tipo de variable.

    Ejemplo

    "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": ""
                }
        ]
    

¿Puedo ver cómo declarar variables complejas en un archivo?

Sí, cuando declara y asigna el valor a las variables, puede ver la ayuda contextual en la interfaz de usuario. La tabla proporciona algunos ejemplos del tipo de datos complejos que se pueden declarar en el almacén de variables.

Tipos de variables complejas con ejemplo
Tipo Ejemplo
number 4.56
string valor de ejemplo
bool falso
map(string) {key1 = "value1", key2 = "value2"}
set(string) ["hola", "él"]
map(number) {internal = 8080, external = 2020}
list(string) ["us-south", "eu-gb"]
list ["valor", 30]
list(list(string)) Consulte lista de ejemplo de serie.
list(object({internal = number external = number protocol = string})) Consulte lista de ejemplos de objetos.

Ejemplo de lista de series

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

Ejemplo de lista de objetos

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

Almacenamiento de plantillas de Terraform

Los archivos de configuración de Terraform contienen código de infraestructura que se debe tratar como código normal. Para facilitar la colaboración, el código fuente y el control de versiones, almacene sus archivos en un repositorio GitHub o GitLab. Con el control de versiones, puede revertir a versiones anteriores, auditar cambios y compartir código con varios equipos. Si no desea almacenar sus archivos en GitHub, proporcione su plantilla cargando en su lugar un archivo de cinta o .tar desde su máquina local. Si desea clonar, consulte las extensiones de archivo permitidas y bloqueadas para la clonación.

La estructura de directorios de la plantilla de Terraform en el repositorio GitHub aparece en una lista en la tabla con la hora de actualización más reciente.

Estructura de directorios de plantilla de Terraform
Archivo Descripción
README.md Crear README.md
main.tf Crear main.tf
output.tf Crear output.tf
provider.tf Crear provider.tf
variables.tf Crear variables.tf

Ejemplos de soluciones Terraform

Varias soluciones muestran la fuerza de los servicios IBM Cloud® Schematics y IBM Cloud® cuando se utilizan juntos. Estas soluciones utilizan una plantilla o módulo de Terraform simple para configurar la infraestructura. Aunque cada solución se presenta en un caso de uso concreto, estas infraestructuras son típicas en varios sectores.

Utilice las Plantillas de soluciones de Terraform publicadas a través de IBM Cloud Schematics para crear su infraestructura, gestionar los recursos y utilizar herramientas potentes para proteger, gestionar y supervisar el espacio de trabajo y las acciones.