Hva er Terraform? En Introduksjon til Infrastruktur som Kode
Er du nysgjerrig på hva Terraform er? La oss dykke ned i dette verktøyet for infrastrukturadministrasjon.
«Infrastruktur som kode» (IaC) er et velkjent begrep i DevOps-miljøet. Det handler om å administrere og klargjøre IT-infrastruktur, både fysiske og virtuelle maskiner, ved hjelp av maskinlesbare konfigurasjonsfiler. Dette er en programvareorientert tilnærming til drift, som muliggjør automatisering av hele datasentre ved hjelp av skript.
Til tross for fordelene med IaC, er det noen utfordringer:
- Det krever kunnskap om koding
- Det er vanskelig å forutse effekten av endringer
- Tilbakerulling av endringer kan være komplisert
- Endringssporing kan være vanskelig
- Automatisering av enkelte ressurser kan være utfordrende
- Håndtering av flere infrastrukturmiljøer
Terraform er utviklet for å håndtere disse utfordringene.
Hva er Terraform?
Terraform er et åpen kildekode IaC-verktøy utviklet av HashiCorp. Det brukes for å definere og levere fullstendig infrastruktur ved hjelp av et deklarativt språk som er enkelt å lære.
Terraform lar deg lagre konfigurasjonen av skyinfrastrukturen din som kode. Det er liknende verktøy som
CloudFormation, som er for automatisering av AWS-infrastruktur, men CloudFormation er begrenset til AWS. Terraform kan brukes på tvers av flere skyplattformer.
Her er noen fordeler med å bruke Terraform:
- Muliggjør orkestrering, ikke bare konfigurasjonsstyring
- Støtter flere leverandører som AWS, Azure, GCP, DigitalOcean og mange flere
- Tilbyr uforanderlig infrastruktur der endringer skjer på en forutsigbar måte
- Bruker HCL (HashiCorp Configuration Language), et lettfattelig språk
- Er lett portabelt mellom ulike leverandører
- Bruker en klientarkitektur, slik at det ikke er behov for ekstra konfigurasjon på servere
Terraform Kjernebegreper
Nedenfor er de viktigste begrepene i Terraform:
- Variabler: Inngangsvariabler, nøkkel-verdi-par som brukes av Terraform-moduler for å tillate tilpasning.
- Leverandør: En plugin for å samhandle med APIer for tjenester og ressurser.
- Modul: En mappe med Terraform-maler der konfigurasjonene er definert.
- Tilstand: Bufret informasjon om infrastrukturen som administreres av Terraform, og de tilhørende konfigurasjonene.
- Ressurser: En blokk med en eller flere infrastrukturobjekter (f.eks. datainstanser, virtuelle nettverk) for å konfigurere og administrere infrastruktur.
- Datakilde: Implementert av tilbydere for å returnere informasjon om eksterne objekter til Terraform.
- Utgangsverdier: Verdier som returneres av en Terraform-modul, som kan brukes av andre konfigurasjoner.
- Plan: En fase der Terraform bestemmer hva som må opprettes, oppdateres eller slettes for å nå ønsket tilstand for infrastrukturen.
- Bruk: En fase der endringene utføres for å flytte infrastrukturen til den ønskede tilstanden.
Terraform Livssyklus
Terraforms livssyklus består av initialisering, planlegging, anvendelse og sletting.
- Terraform init: Initialiserer arbeidskatalogen med alle konfigurasjonsfilene.
- Terraform plan: Genererer en utførelsesplan for å oppnå ønsket tilstand. Endringer i konfigurasjonsfiler gjøres for å oppnå dette.
- Terraform apply: Utfører endringene som er definert i planen, og infrastrukturen oppnår den ønskede tilstanden.
- Terraform destroy: Sletter alle gamle infrastrukturressurser som er merket etter anvendelsesfasen.
Hvordan Fungerer Terraform?
Terraforms arkitektur består av to hovedkomponenter:
Terraform Kjerne
Terraform-kjernen bruker to inndatakilder:
Den første inndatakilden er en Terraform-konfigurasjon som konfigureres av brukeren, der det defineres hva som skal opprettes. Den andre er tilstanden, der Terraform holder oversikt over den nåværende konfigurasjonen av infrastrukturen.
Terraform-kjernen mottar disse inndataene og utarbeider en plan. Den sammenligner den nåværende tilstanden med den ønskede tilstanden, og bestemmer hva som må gjøres. Dette inkluderer oppretting, oppdatering eller sletting av ressurser for å nå den ønskede konfigurasjonen.
Leverandører
Den andre komponenten er leverandører for spesifikke teknologier. Dette kan være skyleverandører som AWS, Azure, og GCP, eller andre infrastrukturplattformer. Det finnes også leverandører for høyere nivåkomponenter som Kubernetes, eller selvbetjeningsverktøy.
Dette muliggjør oppretting av infrastruktur på ulike nivåer, f.eks. å lage en AWS-infrastruktur, deretter distribuere Kubernetes, og deretter distribuere tjenester i Kubernetes-klyngen.
Terraform har over hundre leverandører for ulike teknologier. Hver leverandør gir Terraform-brukere tilgang til sine ressurser. Gjennom AWS-leverandøren får man for eksempel tilgang til EC2-instanser og AWS-brukere. Kubernetes-leverandøren gir tilgang til tjenester, distribusjoner, navnerom, osv.
Terraform hjelper dermed med å klargjøre og dekke hele applikasjonsoppsettet, fra infrastruktur til applikasjon.
La oss utføre noen praktiske øvelser. 👨💻
Vi installerer Terraform på Ubuntu og konfigurerer en grunnleggende infrastruktur.
Installer Terraform
Last ned den nyeste Terraform-pakken.
Se den offisielle nedlastingssiden for å finne den nyeste versjonen for ditt operativsystem.
[email protected]:~$ wget https://releases.hashicorp.com/terraform/0.13.0/terraform_0.13.0_linux_amd64.zip
--2020-08-14 16:55:38-- https://releases.hashicorp.com/terraform/0.13.0/terraform_0.13.0_linux_amd64.zip
Resolving releases.hashicorp.com (releases.hashicorp.com)... 151.101.153.183, 2a04:4e42:24::439
Connecting to releases.hashicorp.com (releases.hashicorp.com)|151.101.153.183|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 34851622 (33M) [application/zip]
Saving to: ‘terraform_0.13.0_linux_amd64.zip’
terraform_0.13.0_linux_amd64.zip
100%[=================================================================>] 33.24M 90.3KB/s in 5m 28s
2020-08-14 17:01:06 (104 KB/s) - ‘terraform_0.13.0_linux_amd64.zip’ saved [34851622/34851622]
Pakk ut den nedlastede pakken.
[email protected]:~$ unzip terraform_0.13.0_linux_amd64.zip
Archive: terraform_0.13.0_linux_amd64.zip
inflating: terraform
Flytt den kjørbare filen til den viste banen, og sjekk Terraform-versjonen.
[email protected]:~$ sudo mv terraform /usr/local/bin/
[sudo] password for tipsbilk.net:
[email protected]:~$ terraform -v
Terraform v0.13.0
Du kan se de tilgjengelige kommandoene i Terraform.
[email protected]:~$ terraform
Usage: terraform [-version] [-help] <command> [args]
The available commands for execution are listed below.
The most common, useful commands are shown first, followed by
less common or more advanced commands. If you're just getting
started with Terraform, stick with the common commands. For the
other commands, please read the help and docs before usage.
Common commands:
apply Builds or changes infrastructure
console Interactive console for Terraform interpolations
destroy Destroy Terraform-managed infrastructure
env Workspace management
fmt Rewrites config files to canonical format
get Download and install modules for the configuration
graph Create a visual graph of Terraform resources
import Import existing infrastructure into Terraform
init Initialize a Terraform working directory
login Obtain and save credentials for a remote host
logout Remove locally-stored credentials for a remote host
output Read an output from a state file
plan Generate and show an execution plan
providers Prints a tree of the providers used in the configuration
refresh Update local state file against real resources
show Inspect Terraform state or plan
taint Manually mark a resource for recreation
untaint Manually unmark a resource as tainted
validate Validates the Terraform files
version Prints the Terraform version
workspace Workspace management
All other commands:
0.12upgrade Rewrites pre-0.12 module source code for v0.12
0.13upgrade Rewrites pre-0.13 module source code for v0.13
debug Debug output management (experimental)
force-unlock Manually unlock the terraform state
push Obsolete command for Terraform Enterprise legacy (v1)
state Advanced state management
Tilveiebringe en AWS EC2-Instans med Terraform
I denne demoen skal vi starte en AWS EC2-instans ved hjelp av Terraform.
Lag en arbeidskatalog for denne demoen.
[email protected]:~$ mkdir terraform_demo
Gå til katalogen og lag en Terraform-konfigurasjonsfil der du definerer leverandøren og ressursene for å starte en AWS EC2-instans.
[email protected]:~$ cd terraform_demo/
[email protected]:~/terraform_demo$ gedit awsec2.tf
provider "aws" {
access_key = "B5KG6Fe5GUKIATUF5UD"
secret_key = "R4gb65y56GBF6765ejYSJA4YtaZ+T6GY7H"
region = "us-west-2"
}
resource "aws_instance" "terraform_demo" {
ami = "ami-0a634ae95e11c6f91"
instance_type = "t2.micro"
}
Merk: Tilgangs- og hemmelige nøkler er endret. Du må bruke dine egne.
Konfigurasjonen nevner AWS som leverandør. Leverandøren krever AWS-legitimasjon og regionen der instansen skal lanseres.
I ressurser angis AMI-detaljene for Ubuntu (ami-0a634ae95e11c6f91) og instansypen som t2.micro.
Legg merke til hvor enkel og lesbar konfigurasjonsfilen er.
terraform init
Første skritt er å initialisere Terraform.
[email protected]:~/terraform_demo$ terraform init
Initializing the backend...
Initializing provider plugins...
- Using previously-installed hashicorp/aws v3.2.0
The following providers do not have any version constraints in configuration,
so the latest version was installed.
To prevent automatic upgrades to new major versions that may contain breaking
changes, we recommend adding version constraints in a required_providers block
in your configuration, with the constraint strings suggested below.
* hashicorp/aws: version = "~> 3.2.0"
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
terraform plan
Neste steg er planleggingsfasen. Den vil generere en utførelsesgraf for å opprette og klargjøre infrastrukturen.
[email protected]:~/terraform_demo$ terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.
------------------------------------------------------------------------
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_instance.terraform_demo will be created
+ resource "aws_instance" "terraform_demo" {
+ ami = "ami-0a634ae95e11c6f91"
+ arn = (known after apply)
+ associate_public_ip_address = (known after apply)
+ availability_zone = (known after apply)
+ cpu_core_count = (known after apply)
+ cpu_threads_per_core = (known after apply)
+ get_password_data = false
+ host_id = (known after apply)
+ id = (known after apply)
+ instance_state = (known after apply)
+ instance_type = "t2.micro"
+ ipv6_address_count = (known after apply)
+ ipv6_addresses = (known after apply)
+ key_name = (known after apply)
+ outpost_arn = (known after apply)
+ password_data = (known after apply)
+ placement_group = (known after apply)
+ primary_network_interface_id = (known after apply)
+ private_dns = (known after apply)
+ private_ip = (known after apply)
+ public_dns = (known after apply)
+ public_ip = (known after apply)
+ secondary_private_ips = (known after apply)
+ security_groups = (known after apply)
+ source_dest_check = true
+ subnet_id = (known after apply)
+ tenancy = (known after apply)
+ volume_tags = (known after apply)
+ vpc_security_group_ids = (known after apply)
+ ebs_block_device {
+ delete_on_termination = (known after apply)
+ device_name = (known after apply)
+ encrypted = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ snapshot_id = (known after apply)
+ volume_id = (known after apply)
+ volume_size = (known after apply)
+ volume_type = (known after apply)
}
+ ephemeral_block_device {
+ device_name = (known after apply)
+ no_device = (known after apply)
+ virtual_name = (known after apply)
}
+ metadata_options {
+ http_endpoint = (known after apply)
+ http_put_response_hop_limit = (known after apply)
+ http_tokens = (known after apply)
}
+ network_interface {
+ delete_on_termination = (known after apply)
+ device_index = (known after apply)
+ network_interface_id = (known after apply)
}
+ root_block_device {
+ delete_on_termination = (known after apply)
+ device_name = (known after apply)
+ encrypted = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ volume_id = (known after apply)
+ volume_size = (known after apply)
+ volume_type = (known after apply)
}
}
Plan: 1 to add, 0 to change, 0 to destroy.
------------------------------------------------------------------------
Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.
terraform apply
I applikasjonsfasen kjøres konfigurasjonsfilen og AWS EC2-instansen startes. Kommandoen «apply» spør: «Vil du utføre disse handlingene?», du må skrive «yes» og trykke enter.
[email protected]:~/terraform_demo$ terraform apply
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_instance.terraform_demo will be created
+ resource "aws_instance" "terraform_demo" {
+ ami = "ami-0a634ae95e11c6f91"
+ arn = (known after apply)
+ associate_public_ip_address = (known after apply)
+ availability_zone = (known after apply)
+ cpu_core_count = (known after apply)
+ cpu_threads_per_core = (known after apply)
+ get_password_data = false
+ host_id = (known after apply)
+ id = (known after apply)
+ instance_state = (known after apply)
+ instance_type = "t2.micro"
+ ipv6_address_count = (known after apply)
+ ipv6_addresses = (known after apply)
+ key_name = (known after apply)
+ outpost_arn = (known after apply)
+ password_data = (known after apply)
+ placement_group = (known after apply)
+ primary_network_interface_id = (known after apply)
+ private_dns = (known after apply)
+ private_ip = (known after apply)
+ public_dns = (known after apply)
+ public_ip = (known after apply)
+ secondary_private_ips = (known after apply)
+ security_groups = (known after apply)
+ source_dest_check = true
+ subnet_id = (known after apply)
+ tenancy = (known after apply)
+ volume_tags = (known after apply)
+ vpc_security_group_ids = (known after apply)
+ ebs_block_device {
+ delete_on_termination = (known after apply)
+ device_name = (known after apply)
+ encrypted = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ snapshot_id = (known after apply)
+ volume_id = (known after apply)
+ volume_size = (known after apply)
+ volume_type = (known after apply)
}
+ ephemeral_block_device {
+ device_name = (known after apply)
+ no_device = (known after apply)
+ virtual_name = (known after apply)
}
+ metadata_options {
+ http_endpoint = (known after apply)
+ http_put_response_hop_limit = (known after apply)
+ http_tokens = (known after apply)
}
+ network_interface {
+ delete_on_termination = (known after apply)
+ device_index = (known after apply)
+ network_interface_id = (known after apply)
}
+ root_block_device {
+ delete_on_termination = (known after apply)
+ device_name = (known after apply)
+ encrypted = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ volume_id = (known after apply)
+ volume_size = (known after apply)
+ volume_type = (known after apply)
}
}
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
aws_instance.terraform_demo: Creating...
aws_instance.terraform_demo: Still creating... [10s elapsed]
aws_instance.terraform_demo: Still creating... [20s elapsed]
aws_instance.terraform_demo: Still creating... [30s elapsed]
aws_instance.terraform_demo: Still creating... [40s elapsed]
aws_instance.terraform_demo: Creation complete after 44s [id=i-0eec33286ea4b0740]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Gå til AWS EC2-dashbordet. Du finner en ny instans med IDen som er nevnt på slutten av apply-kommandoen.
Du har nå lansert en AWS EC2-instans med Terraform.
terraform destroy
For å slette infrastrukturen, bruk «destroy»-kommandoen.
[email protected]:~/terraform_demo$ terraform destroy
aws_instance.terraform_demo: Refreshing state... [id=i-0eec33286ea4b0740]
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
- destroy
Terraform will perform the following actions:
# aws_instance.terraform_demo will be destroyed
- resource "aws_instance" "terraform_demo" {
- ami = "ami-0a634ae95e11c6f91" -> null
- arn = "arn:aws:ec2:us-west-2:259212389929:instance/i-0eec33286ea4b0740" -> null
- associate_public_ip_address = true -> null
- availability_zone = "us-west-2c" -> null
- cpu_core_count = 1 -> null
- cpu_threads_per_core = 1 -> null
- disable_api_termination = false -> null
- ebs_optimized = false -> null
- get_password_data = false -> null
- hibernation = false -> null
- id = "i-0eec33286ea4b0740" -> null
- instance_state = "running" -> null
- instance_type = "t2.micro" -> null
- ipv6_address_count = 0 -> null
- ipv6_addresses = [] -> null
- monitoring = false -> null
- primary_network_interface_id = "eni-02a46f2802fd15634" -> null
- private_dns = "ip-172-31-13-160.us-west-2.compute.internal" -> null
- private_ip = "172.31.13.160" -> null
- public_dns = "ec2-34-221-77-94.us-west-2.compute.amazonaws.com" -> null
- public_ip = "34.221.77.94" -> null
- secondary_private_ips = [] -> null
- security_groups = [
- "default",
] -> null
- source_dest_check = true -> null
- subnet_id = "subnet-5551200c" -> null
- tags = {} -> null
- tenancy = "default" -> null
- volume_tags = {} -> null
- vpc_security_group_ids = [
- "sg-b5b480d1",
] -> null
- credit_specification {
- cpu_credits = "standard" -> null
}
- metadata_options {
- http_endpoint = "enabled" -> null
- http_put_response_hop_limit = 1 -> null
- http_tokens = "optional" -> null
}
- root_block_device {
- delete_on_termination = true -> null
- device_name = "/dev/sda1" -> null
- encrypted = false -> null
- iops = 100 -> null
- volume_id = "vol-0be2673afff6b1a86" -> null
- volume_size = 8 -> null
- volume_type = "gp2" -> null
}
}
Plan: 0 to add, 0 to change, 1 to destroy.
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
aws_instance.terraform_demo: Destroying... [id=i-0eec33286ea4b0740]
aws_instance.terraform_demo: Still destroying... [id=i-0eec33286ea4b0740, 10s elapsed]
aws_instance.terraform_demo: Still destroying... [id=i-0eec33286ea4b0740, 20s elapsed]
aws_instance.terraform_demo: Still destroying... [id=i-0eec33286ea4b0740, 30s elapsed]
aws_instance.terraform_demo: Destruction complete after 34s
Destroy complete! Resources: 1 destroyed.
Sjekk EC2-dashbordet. Instansen er nå avsluttet.
Konklusjon
Dette gir deg et grunnleggende innblikk i hvordan du kommer i gang med Terraform. Prøv gjerne eksemplet.
Det er også lurt å utforske andre verktøy for infrastrukturautomatisering.
Hvis du vil lære mer, anbefales det å sjekke ut
DevOps med Terraform-kurset.