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édentes Révision précédente
Prochaine révision
Révision précédente
gestion_configuration:terraform:toc [2019/10/11 20:35]
sgariepy
gestion_configuration:terraform:toc [2019/10/17 22:15] (Version actuelle)
sgariepy [Modules]
Ligne 1: Ligne 1:
-====== Terraform ​Examples ​======+====== Terraform ======
  
 +  * [[https://​www.terraform.io/​|Site officiel]]
  
  
-<​code>​ +====== Commandes ======
-provider "​aws"​ { +
-  #Virginia, USA +
-  region ​"​us-east-1"​ +
-}+
  
-resource "​aws_instance"​ "​example"​ { +Initialiser terraform: 
-  #​Ubuntu 14.04 AMI (Amazon Machine Image+ 
-  ami = "ami-2d39803a"​ +    $ terraform init 
-  ​instance_type = "t2.micro"+ 
 + 
 +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 49:
 </​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 206:
 </​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 236:
  
  
 +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.1570840504.txt.gz · Dernière modification: 2019/10/11 20:35 par sgariepy