Création de modèles Terraform
Découvrez comment créer des modèles Terraform bien structurés, réutilisables et complets.
Un modèle Terraform est constitué d'un ou de plusieurs fichiers de configuration Terraform qui déclarent l'état que vous souhaitez réaliser pour vos ressources IBM Cloud®. Pour travailler avec vos ressources, vous devez configurer IBM en tant que fournisseur de cloud et ajouter des ressources à votre fichier de configuration Terraform. Vous pouvez éventuellement utiliser des variables d'entrée pour personnaliser vos ressources.
Vous pouvez écrire votre fichier de configuration Terraform au format HCL (HashiCorp Configuration Language) ou JSON. Vous pouvez également utiliser les modules Terraform IBM(TIM), qui offrent des composants d'infrastructure prédéfinis permettant de standardiser et de simplifier le processus de déploiement.
Avant de commencer à créer votre modèle Terraform, prenez soin de passer en revue les limitations d'IBM Cloud Schematics.
Configuration du bloc provider
Spécifiez le fournisseur de cloud que vous souhaitez utiliser dans le bloc provider de votre fichier de configuration Terraform. Le bloc provider inclut toutes les variables d'entrée requises par le plug-in IBM Cloud®
Provider for Terraform afin de mettre à disposition vos ressources.
Clé d'API IBM Cloud
La clé API IBM Cloud est indispensable pour s'authentifier auprès de la plateforme IBM Cloud. Également le jeton IAM et le jeton de rafraîchissement IAM dont Schematics a besoin pour travailler avec l'API de la ressource et pour déterminer les
autorisations qui vous ont été accordées. Lorsque vous utilisez Terraform natif, vous devez toujours fournir la clé de l'API IBM Cloud. Dans Schematics, le jeton IAM est extrait pour toutes les ressources activées par IAM, y compris les clusters
IBM Cloud Kubernetes Service et les ressources d'infrastructure VPC. Toutefois, le jeton IAM n'est pas récupéré pour les ressources d'infrastructure classique et la clé API doit être fournie dans le bloc « provider ».
**Clé d'API IBM Cloud différente dans le bloc provider **
Si vous souhaitez utiliser une clé d'API différente de celle qui est associée à votre compte IBM Cloud, vous pouvez fournir cette clé d'API dans le bloc provider. Si une clé d'API est configurée dans le bloc provider,
cette clé est prioritaire sur la clé d'API qui est stockée dans IBM Cloud.
IBM Cloud Clé API pour un identifiant de service
Vous pouvez fournir une clé d'API pour un ID de service pour tous les services activés pour IAM, y compris les ressources d'infrastructure VPC. Vous ne pouvez pas utiliser d'identifiant de service pour les ressources d'infrastructure classique.
Suivez les instructions pour configurer le bloc provider.
-
Choisissez le mode de configuration du bloc
provider.- Option 1 : Créez un fichier «
provider.tf» distinct. Les informations contenues dans ce fichier sont chargées par Terraform et IBM Cloud Schematics, puis appliquées à tous les fichiers de configuration Terraform se trouvant dans le même répertoire GitHub ou fichier d'archivage sur bande.tar. Cette approche est utile si vous fractionnez votre code d'infrastructure sur plusieurs fichiers. - Option 2 : Ajoutez un bloc «
provider» à votre fichier de configuration Terraform. Vous pouvez choisir cette option si vous préférez spécifier le fournisseur en même temps que vos variables et ressources dans un seul fichier de configuration Terraform.
- Option 1 : Créez un fichier «
-
Examinez les références et les informations que vous devez fournir dans le bloc
providerpour travailler avec vos ressources. Schematics récupère automatiquement votre clé d'API IBM Cloud, de sorte que vous n'avez pas besoin de spécifier ces informations dans votre blocprovider. -
Créez un fichier
provider.tfou ajoutez le code suivant à votre fichier de configuration Terraform. Pour la liste complète des paramètres pris en charge que vous pouvez définir dans le blocprovider, voir le document de référence de IBM Cloud Provider.Exemple de ressources d'infrastructure VPC
provider "ibm" { generation = 1 region = "<region_name>" }Exemple de ressources d'infrastructure classique
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 }Exemple pour toutes les ressources « IBM Cloud Kubernetes Service »
provider "ibm" { }Exemple pour toutes les autres ressources
provider "ibm" { region = "<region_name>" }
Ajout de ressources cloud au bloc « resource »
Utilisez les blocs « resource » pour définir les ressources cloud que vous souhaitez gérer à l'aide d' IBM Cloud Schematics.
Pour prendre en charge une approche multicloud, Terraform fonctionne avec plusieurs fournisseurs de cloud. Un fournisseur de cloud est chargé de comprendre les ressources que vous pouvez mettre à disposition, leur API, ainsi que les méthodes permettant d'exposer ces ressources dans le cloud. Pour que ces connaissances soient accessibles aux utilisateurs, chaque fournisseur de cloud pris en charge doit fournir un plug-in de ligne de commande pour Terraform que les utilisateurs peuvent utiliser pour gérer les ressources. Pour obtenir une présentation des ressources que vous pouvez fournir dans IBM Cloud, voir la Référence IBM Cloud Provider Plug-in for Terraform.
Exemple de code d'infrastructure pour la mise en place d'un VPC
resource ibm_is_vpc "vpc" {
name = "myvpc"
}
Référencement de ressources dans d'autres blocs de ressources
Passez en revue les options dont vous disposez pour faire référence à des ressources existantes dans d'autres blocs de ressources de votre fichier de configuration Terraform.
Le document de référence du plug-in IBM Cloud Provider comprend deux types d'objet, les sources de données et les ressources. Vous pouvez utiliser ces deux types d'objet pour faire référence à des ressources dans d'autres blocs de ressources.
-
Ressources : pour créer une ressource, vous utilisez la définition de ressource spécifiée dans le document de référence du plug-in IBM Cloud Provider. Une définition de ressource comprend la syntaxe permettant de configurer vos ressources Cloud, ainsi qu'un répertoire des attributs qui répertorie les propriétés que vous pouvez utiliser comme paramètres d'entrée dans d'autres blocs de ressources. Par exemple, lorsque vous créez un VPC, l'ID de ce VPC est disponible après la création. Vous pouvez utiliser l'ID comme paramètre d'entrée lorsque vous créez un sous-réseau pour votre VPC. Utilisez cette option si vous combinez plusieurs ressources dans un fichier de configuration Terraform.
Exemple de code d'infrastructure
resource ibm_is_vpc "vpc" { name = "myvpc" } resource ibm_is_security_group "sg1" { name = "mysecuritygroup" vpc = ibm_is_vpc.vpc.id } -
Sources de données: vous pouvez également utiliser les sources de données décrites dans la documentation du plug-in « IBM Cloud Provider » pour récupérer des informations sur une ressource Cloud existante. Passez en revue la section Argument Reference du document de référence du plug-in IBM Cloud Provider pour voir les paramètres d'entrée que vous devez fournir afin d'extraire une ressource existante. Ensuite, consultez la section Attributes Reference pour obtenir une présentation des paramètres qui sont mis à votre disposition et auxquels vous pouvez faire référence dans vos blocs
resource. Utilisez cette option si vous souhaitez accéder aux détails d'une ressource qui est configurée dans un autre fichier de configuration Terraform.Exemple de code d'infrastructure
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] } }
Gestion des ressources dans un autre compte
Vous pouvez utiliser les espaces de travail du compte source IBM Cloud pour exécuter des tâches Terraform afin de créer des ressources dans un compte cible. Pour provisionner des ressources dans un compte cible, l'identité et les autorisations d'accès du compte cible doivent être fournies. Cela peut se faire en utilisant l'identité d'un utilisateur disposant des autorisations pour le compte cible. Ou un identifiant de service avec authentification et autorisation croisée appropriée pour le compte cible à l'aide d'une clé API.
Lors de l'exécution de tâches via l'interface utilisateur sans transmission de clés API, l'identité de l'utilisateur connecté est prise en compte pour l'exécution des opérations.
Utilisation de blocs variable pour personnaliser des ressources
Vous pouvez utiliser des blocs variable pour créer un modèle pour votre code d'infrastructure. Par exemple, au lieu de créer plusieurs fichiers de configuration Terraform pour une ressource que vous souhaitez déployer dans plusieurs
centres de données. Il suffit de réutiliser la même configuration avec une variable d'entrée pour définir le centre de données.
Stockage des variables
Vous pouvez décider de déclarer vos variables dans le même fichier de configuration Terraform où vous spécifiez les ressources que vous souhaitez mettre à disposition ou de créer un fichier variables.tf distinct qui inclut toutes
vos déclarations de variable. Lorsque vous créez un espace de travail, IBM Cloud Schematics effectue automatiquement une analyse syntaxique de vos fichiers de configuration Terraform pour rechercher des déclarations de variable.
Déclarer une variable
Lorsque vous déclarez une variable d'entrée, vous devez fournir un nom pour votre variable et le type de données en fonction de la version Terraform. Vous pouvez éventuellement fournir une valeur par défaut pour votre variable. Lorsque des variables
d'entrée sont importées dans Schematics et qu'une valeur par défaut est spécifiée, vous pouvez choisir de remplacer cette valeur par défaut. \n IBM Cloud Schematics accepte les valeurs sous forme de chaîne de caractères pour les types primitifs
tels que bool, number, string, ainsi que le format HCL pour les variables complexes. - La fonction Terraform v1.5 prend en charge les types de données suivants : chaîne de caractères, liste, carte, bool``, nombre et types complexes tels que liste(type), carte(type), objet( {attribute name=type,.} ), ensemble(type) et tuple( [type] ).
Limitation de la variable d'entrée
Oui. Si vous définissez des variables d'entrée dans votre fichier de configuration Terraform, n'oubliez pas que la valeur que vous entrez pour ces variables ne peut pas comporter plus de 2049 caractères. Si votre variable d'entrée requiert une valeur qui dépasse cette limite, cette valeur est tronquée au-delà de 2049 caractères.
Exemple de déclaration de variable sans valeur par défaut
variable "datacenter" {
type = "string"
description = "The data center that you want to deploy your Kubernetes cluster in."
}
Exemple de déclaration de variable avec une valeur par défaut
variable "datacenter" {
type = "string"
description = "The data center that you want to deploy your Kubernetes cluster in."
default = "dal10"
}
Référencement de variables
Vous pouvez référer la valeur de la variable dans d'autres blocs de vos fichiers de configuration Terraform à l'aide de la syntaxe "${var.<variable_name>}".
Exemple d'accès à une variable de type « datacenter »
resource ibm_container_cluster "test_cluster" {
name = "test"
datacenter = var.datacenter
}
Tirer parti des modules Terraform IBM pour accélérer le développement
En option, vous pouvez utiliser Terraform IBM Modules(TIM) pour créer vos modèles. Il permet de construire rapidement une infrastructure complexe, de simplifier les dépendances des ressources, d'appliquer les meilleures pratiques de IBM Cloud et d'évoluer grâce aux contributions de la communauté IBM Cloud.
Exemple : Utilisation du module VPC de 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"
}
Découvrez les modules disponibles :
Apport de valeurs à IBM Cloud Schematics pour les variables déclarées
Vous pouvez fournir les valeurs après avoir créé l'espace de travail pour le IBM Cloud Schematics à utiliser sur les actions Terraform, pour les variables qui sont déclarées dans le modèle.
-
Pour «
UI», vous pouvez définir les valeurs sur la page IBM Cloud > « Schematics » > « workspace » > « Settings ». La zonevalueest la valeur de formatHCLtelle que fournie dans le fichier.tfvars. -
Pour
CLI, vous pouvez créer ou mettre à jour les valeurs du type de données « Complex ». Dans ce cas, le champ «value» doit contenir une chaîne échappée pour la variable « store », comme indiqué dans l'exemple. -
Pour l'
API, vous pouvez consulter, créer ou mettre à jour les valeurs dans le champ «template_data» >variablestore. Le champ «value» correspond à la valeur au format «HCL» telle qu’elle figure dans le fichier «.tfvars». Il s'agit toujours d'une chaîne JSON, quel que soit le type de la variable.Exemple
"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": "" } ]
Puis-je voir comment déclarer des variables complexes dans un fichier ?
Oui, lorsque vous déclarez et affectez la valeur aux variables, vous pouvez afficher l'infobulle dans l'interface utilisateur. Le tableau ci-dessous fournit quelques exemples de type de données complexe pouvant être déclaré dans le magasin de variables.
| Type | Exemple |
|---|---|
number |
4.56 |
string |
valeur exemple |
bool |
false |
map(string) |
{key1 = "value1", key2 = "value2"} |
set(string) |
[« bonjour », « il »] |
map(number) |
{internal = 8080, external = 2020} |
list(string) |
[« us-south », « eu-gb »] |
list |
[« valeur », 30] |
list(list(string)) |
Voir la liste des exemples de chaînes de caractères. |
list(object({internal = number external = number protocol = string})) |
Voir la liste des exemples d'objets. |
Exemple de liste de chaînes de caractères
[
"test", "env:prod", "env:agent:test"
]
Exemple de liste d'objets
[
{
internal = 8300
external = 8300
protocol = "tcp"
},
{
internal = 8301
external = 8301
protocol = "ldp"
}
]
Stockage de vos modèles Terraform
Vos fichiers de configuration Terraform contiennent du code d'infrastructure que vous devez traiter comme du code normal. Pour faciliter la collaboration, la gestion des sources et le contrôle des versions, stockez vos fichiers dans un dépôt
GitHub ou GitLab. Grâce au contrôle des versions, vous pouvez revenir aux versions précédentes, effectuer un audit des changements et partager du code entre plusieurs équipes. Si vous ne souhaitez pas stocker vos fichiers sur GitHub,, fournissez
votre modèle en téléversant un fichier d'archive sur bande ou un fichier « .tar » depuis votre ordinateur local. Si vous souhaitez
cloner un fichier, consultez la liste des extensions de fichiers autorisées et bloquées pour le clonage.
La structure de répertoires du modèle Terraform dans le référentiel GitHub est répertorié dans le tableau ci-dessous.
| Fichier | Description |
|---|---|
| README.md | Crée README.md |
main.tf |
Créer main.tf |
output.tf |
Créer output.tf |
provider.tf |
Créer provider.tf |
variables.tf |
Créer variables.tf |
Exemples de solutions Terraform
Diverses solutions montrent la force des services IBM Cloud® Schematics et IBM Cloud® lorsqu'ils sont utilisés ensemble. Ces solutions utilisent un modèle ou module Terraform simple pour configurer l'infrastructure. Chaque solution est présentée à travers un cas d'utilisation particulier, mais ces infrastructures sont typiques dans les divers secteurs d'activité.
Utilisez les modèles de solution Terraform publiés via IBM Cloud Schematics pour créer votre infrastructure, gérer les ressources et utiliser des outils puissants pour sécuriser, gérer et surveiller votre espace de travail et vos actions.