Outils pour utilisateurs

Outils du site


gestion_configuration:terraform:toc

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
Prochaine révisionLes deux révisions suivantes
gestion_configuration:terraform:toc [2019/10/12 02:35] sgariepygestion_configuration:terraform:toc [2019/11/04 15:19] – [Terraform] sgariepy
Ligne 1: Ligne 1:
-====== Terraform Examples ======+====== Terraform ======
  
 +  * [[https://www.terraform.io/|Site officiel]]
  
  
-<code> +Sur macOSpeut être installé avec Brew:
-provider "aws"+
-  #VirginiaUSA +
-  region = "us-east-1" +
-}+
  
-resource "aws_instance" "example" { +  $ brew install terraform 
-  #Ubuntu 14.04 AMI (Amazon Machine Image+ 
-  ami = "ami-2d39803a" + 
-  instance_type = "t2.micro"+====== Commandes ====== 
 + 
 +Initialiser terraform: 
 + 
 +    $ terraform init 
 + 
 + 
 +Validation (non garantie): 
 + 
 +    $ terraform validate 
 + 
 + 
 +Plan: 
 + 
 + 
 +    $ terraform plan 
 +    $ terraform plan -out file.tfplan 
 + 
 + 
 +Apply: 
 + 
 + 
 +    $ terraform apply "file.tfplan" 
 + 
 + 
 +Destroy: 
 + 
 +    $ terraform destroy 
 +    $ terraform destroy -auto-approve
  
-  tags { 
-    #tags WILL CHANGE the state of previous runnings resources. 
-    Name = "My Instance Name" 
-  } 
-} 
-</code> 
  
  
Ligne 35: Ligne 54:
 </code> </code>
  
-Dans le répertoire de travail de Terraform, créer un fichier de configuration ''backend.hcl''.+Dans le répertoire de travail de Terraform, créer un fichier de configuration ''main.tf''.
  
 <code> <code>
-workspaces name = "workspace} +terraform { 
-hostname     = "app.terraform.io" +  backend "remote{ 
-organization = "company"+    hostname     = "app.terraform.io" 
 +    organization = "company" 
 + 
 +    workspaces { 
 +      name = "workspace-name" 
 +    } 
 +  } 
 +
 +</code> 
 + 
 + 
 +Faire l'initialisation par la suite. 
 + 
 +<code> 
 +$ terraform init
 </code> </code>
  
 Sources : [[https://www.terraform.io/docs/commands/cli-config.html|CLI Configuration File]] et [[https://www.terraform.io/docs/backends/types/remote.html|Backend - Remote]]. Sources : [[https://www.terraform.io/docs/commands/cli-config.html|CLI Configuration File]] et [[https://www.terraform.io/docs/backends/types/remote.html|Backend - Remote]].
  
 +====== Variables ======
  
  
 +On peut spécifier le nom, le type et la valeur par défaut d'une variable.
 +
 +<code>
 +# Spécifier la valeur par défaut et le type (les deux sont facultatifs)
 +variable "environment_name" {
 +  type = string
 +  default = "development"
 +}
 +
 +# Spécifier la valeur de la variable
 +environment_name = "uat"
 +</code>
 +
 +On peut déclarer des variables de plusieurs sources, celles-ci on une précédence:
 +
 +  * Variable d'environnement
 +  * Fichier
 +  * Ligne de commande
 +
 +Cela signifie qu'une variable qui est initialisée dans un fichier écrasera la valeur de cette variable initialisé depuis une variable d'environnement.
 +
 +
 +Spécifier une valeur //in-line// en ligne de commande:
 +<code>
 +$ terraform -plan -var 'environment_name=production'
 +</code>
 +
 +
 +===== Exemples =====
 +
 +Avec map:
 +
 +<code>
 +variable "cidr" {
 +  type = map(string)
 +  default = {
 +    development = "10.0.0.0/16"
 +    uat = "10.1.0.0/16"
 +    production = "10.2.0.0/16"
 +  }
 +}
 +</code>
 +
 +Utilisation:
 +
 +<code>
 +cidr_block = lookup(var.cidr, var.environment_name)
 +</code>
 +
 +
 +====== Datasources ======
 +
 +
 +
 +
 +
 +
 +
 +====== Ressources ======
 +
 +Random provider:
 +
 +<code>
 +resource "random_integer" "rand" {
 +  min = 10000
 +  max = 99999
 +}
 +</code>
 +
 +
 +===== Resource Arguments =====
 +
 +  * ''depends_on'': nommer explicitement une dépendance à une autre ressource
 +  * ''count'':
 +  * ''for_each'': 
 +  * ''provider'': utilisation explicite d'un provider quand on en utilise plusieurs
 +
 +Exemple de ''count'' et ''depends_on'':
 +
 +<code>
 +resource "aws_instance" "taco_servers" {
 +  count = 2
 +  tags {
 +    Name = "customer-${count.index}"  # Commence à 0
 +  }
 +  depends_on = [aws_iam_role_policy.allow_s3]
 +}
 +</code>
 +
 +Exemple de ''for-each'':
 +
 +<code>
 +resource "aws_s3_bucket" "taco_toppings" {
 +  for_each {
 +    food = "public-read"
 +    cash = "private"
 +  }
 +  bucket = "${each.key}-${var.bucket_suffix}"
 +  acl = each.value
 +}
 +</code>
 ====== Provisioner ====== ====== Provisioner ======
 +
  
 ===== File ===== ===== File =====
  
 +Simple:
 +
 +<code>
 +provisioner "file" {
 +  source = "/local/path/to/file.txt"
 +  destination = "/path/to/file.txt"
 +}
 +</code>
 +
 +Avec ''connection'':
  
 <code> <code>
Ligne 65: Ligne 211:
 </code> </code>
  
 +Avec ''content'':
  
 +<code>
 +provisioner {
 +  content = <<EOF
 +access_key = 
 +secret_key =
 +security_token =
 +use_https = True
 +bucket_location = US
 +
 +EOF
 +  destination = "/home/ec2-user/.s3cfg"
 +}
 +</code>
  
 ===== Remote ===== ===== Remote =====
  
 +Inline:
  
 <code> <code>
Ligne 80: Ligne 241:
  
  
 +Script:
 +
 +<code>
 +provisioner "remote-exec" {
 +  scripts = [
 +    "./scripts/01_post-install.sh",
 +  ]
 +}
 +</code>
 +
 +====== Syntaxe ======
 +
 +Utilise le HCL, qui est un langage de HashiCorp.
 +
 +Types de données:
 +
 +<code>
 +string = "taco"
 +number = 5
 +bool = true
 +list = ["Montréal", "New York"]
 +map = {name = "Ned", age = 42, loves_tacos = true}
 +</code>
 +
 +Références:
 +
 +<code>
 +var.taco_day
 +aws_instance.taco_truck.name
 +local.taco_toppings.cheeses
 +module.taco_hut.locations
 +</code>
 +
 +Référencer une chaîne, nombre et booléen:
 +
 +<code>
 +local.taco_count # retourne le nombre
 +</code>
 +
 +
 +Référencer un élément d'une liste ou une map:
 +
 +<code>
 +local.taco_toppings[2] # retourne l'élément 3
 +local.taco_map["likes_tacos"] # retourne la valeur à cette clé
 +</code>
 +
 +Valeurs des ressources:
 +
 +<code>
 +var.region # us-east-1
 +data.aws_availability_zones.azs.names[1] # retourne la deuxième zone de disponibilité
 +</code>
 +
 +Interpolation:
 +
 +<code>
 +taco_name = "neds-${var.taco_type}"
 +</code>
 +
 +====== Locals ======
 +
 +
 +<code>
 +locals {
 +  common_tags = {
 +    BillingCode = var.billing_code_tag
 +    Environment = var.environment_tag
 +  }
 +
 +  s3_bucket_name = "${var.bucket_name_prefix}-${var.environment_tag}-${random_integer.rand.result}"
 +}
 +</code>
 +
 +====== Fonctions ======
 +
 +Exemples de fonctions communes:
 +
 +
 +<code>
 +min(42, 8, 13)  # Numérique
 +lower("TACOS" # Chaine
 +merge(map1, map2)  # Collection
 +file(path)         # Filesystem
 +cidrsubnet("10.1.2.0/24", 4, 15)  # IP Network
 +timestamp()  # Date and time    
 +</code>
 +
 +
 +<code>
 +# Configure networking
 +variable network_info {
 +  default = "10.1.0.0/16"
 +}
 +
 +cidr_block = cidrsubnet(var.network_info, 8, 0)  # retourne 10.1.0.0/24
 +host_ip = cidrhost(var.network_info, 5) # retourne 10.1.0.5
 +</code>
 +
 +On peut utiliser ''terraform console'' pour évaluer et tester les fonctions.
 +
 +
 +
 +=> Référence: [[https://www.terraform.io/docs/configuration/functions.html|Functions]]
 +
 +====== Gérer les environnements ======
 +
 +On peut gérer les environnements de différentes façons.  On peut le faire avec les Workspaces, mais aussi en indiquant les fichiers à utiliser.
 +
 +<code>
 +|-- /dev
 +|    |-- dev.state
 +|    |-- dev.tfvars
 +|-- /uat
 +|    |-- uat.state
 +|    |-- uat.tfvars
 +|-- /prod
 +|    |-- prod.state
 +|    |-- prod.tfvars
 +|-- main_config.tf
 +|-- common.tfvars
 +</code>
 +
 +La commande à utiliser:
 +
 +<code>
 +$ terraform plan -state=".\dev\dev.state" -var-file="common.tfvars" -var-file=".\dev\dev.tfvars"
 +</code>
 +
 +
 +
 +
 +===== Workspaces =====
 +
 +
 +<code>
 +$ terraform workspace new dev
 +$ terraform plan
 +</code>
 +
 +
 +
 +
 +
 +
 +====== Modules ======
 +
 +
 +  * Réutilisation du code
 +  * Remote ou local source
 +    * [[https://registry.terraform.io/|Terraform Registry]]
 +  * Root module
 +  * Versioning
 +  * Provider inheritance
 +
 +
 +Composantes:
 +
 +  * Variables d'entrée
 +  * Ressources
 +  * Variables de sortie
 +
 +Example d'utilisation:
 +
 +<code>
 +# Créer le module
 +module "bucket" {
 +  name = "taco-bucket"
 +  source = ".\\Modules\\s3"
 +}
 +
 +
 +# L'utiliser
 +ressource "aws_s3_bucket_object" {
 +  bucket = module.bucket.bucket_id
 +  [...]
 +}
 +</code>
 +
 +
 +
 +
 +
 +====== Sources ======
 +
 +
 +
 +
 +  * PluralSight Terraform Getting started.
  
  
  
gestion_configuration/terraform/toc.txt · Dernière modification : 2023/10/03 21:46 de sgariepy