En introduksjon til Terraform for nybegynnere – Terraform-veiledning

Lurer du på, hva er Terraform? La oss finne ut om det.

Infrastructure as Code (IaC) er en utbredt terminologi blant DevOps-fagfolk. Det er prosessen med å administrere og klargjøre den komplette IT-infrastrukturen (som omfatter både fysiske og virtuelle maskiner) ved hjelp av maskinlesbare definisjonsfiler. Det er en programvareteknisk tilnærming til drift. Det hjelper med å automatisere hele datasenteret ved å bruke programmeringsskript.

Med alle funksjonene som Infrastructure as Code gir, har den flere utfordringer:

  • Trenger å lære å kode
  • Vet ikke endringseffekten.
  • Må tilbakestille endringen
  • Kan ikke spore endringer
  • Kan ikke automatisere en ressurs
  • Flere miljøer for infrastruktur

Terraform er laget for å løse disse utfordringene.

Hva er Terraform?

Terraform er en åpen kildekode-infrastruktur som kodeverktøy utviklet av HashiCorp. Den brukes til å definere og levere den komplette infrastrukturen ved å bruke et deklarativt språk som er lett å lære.

Det er et infrastrukturklargjøringsverktøy der du kan lagre skyinfrastrukturoppsettet ditt som koder. Det er veldig likt verktøy som f.eks CloudFormation, som du vil bruke til å automatisere AWS-infrastrukturen din, men du kan bare bruke den på AWS. Med Terraform kan du bruke den på andre skyplattformer også.

Nedenfor er noen av fordelene med å bruke Terraform.

  • Gjør orkestrering, ikke bare konfigurasjonsstyring
  • Støtter flere leverandører som AWS, Azure, GCP, DigitalOcean og mange flere
  • Gi uforanderlig infrastruktur der konfigurasjonen endres jevnt
  • Bruker lett forståelig språk, HCL (HashiCorp konfigurasjonsspråk)
  • Enkelt portabel til enhver annen leverandør
  • Støtter kun klientarkitektur, så det er ikke behov for ytterligere konfigurasjonsadministrasjon på en server

Terraform Kjernekonsepter

Nedenfor er kjernebegrepene/terminologiene som brukes i Terraform:

  • Variabler: Brukes også som inngangsvariabler, det er nøkkelverdi-par som brukes av Terraform-moduler for å tillate tilpasning.
  • Leverandør: Det er en plugin for å samhandle med API-er for tjenesten og få tilgang til tilhørende ressurser.
  • Modul: Det er en mappe med Terraform-maler hvor alle konfigurasjonene er definert
  • Tilstand: Den består av bufret informasjon om infrastrukturen administrert av Terraform og de relaterte konfigurasjonene.
  • Ressurser: Det refererer til en blokk med ett eller flere infrastrukturobjekter (dataforekomster, virtuelle nettverk, etc.), som brukes til å konfigurere og administrere infrastrukturen.
  • Datakilde: Det implementeres av tilbydere for å returnere informasjon om eksterne objekter til terraform.
  • Utgangsverdier: Dette er returverdier for en terraform-modul som kan brukes av andre konfigurasjoner.
  • Plan: Det er et av stadiene der det bestemmer hva som må opprettes, oppdateres eller ødelegges for å gå fra reell/nåværende tilstand av infrastrukturen til ønsket tilstand.
  • Bruk: Det er et av stadiene der den bruker endringene reell/nåværende tilstand av infrastrukturen for å flytte til ønsket tilstand.

Terraform livssyklus

Terraforms livssyklus består av – starte, planlegge, bruke og ødelegge.

  • Terraform init initialiserer arbeidskatalogen som består av alle konfigurasjonsfilene
  • Terraform-plan brukes til å lage en utførelsesplan for å nå en ønsket tilstand av infrastrukturen. Endringer i konfigurasjonsfilene gjøres for å oppnå ønsket tilstand.
  • Terraform application foretar deretter endringene i infrastrukturen som definert i planen, og infrastrukturen kommer i ønsket tilstand.
  • Terraform destroy brukes til å slette alle de gamle infrastrukturressursene, som er merket med skjemmet etter søknadsfasen.

Hvordan fungerer Terraform?

Terraform har to hovedkomponenter som utgjør arkitekturen:

Terraform kjerne

Terraform core bruker to inngangskilder for å gjøre jobben sin.

Den første inngangskilden er en Terraform-konfigurasjon som du som bruker konfigurerer. Her definerer du hva som må opprettes eller klargjøres. Og den andre inngangskilden er en tilstand der terraform holder den oppdaterte tilstanden til hvordan det nåværende oppsettet av infrastrukturen ser ut.

Så det terraform-kjerne gjør er at den tar innspill, og den finner ut planen for hva som må gjøres. Den sammenligner tilstanden, hva som er den nåværende tilstanden, og hva er konfigurasjonen du ønsker i sluttresultatet. Den finner ut hva som må gjøres for å komme til ønsket tilstand i konfigurasjonsfilen. Den viser hva som må opprettes, hva som må oppdateres, hva som må slettes for å opprette og klargjøre infrastrukturen.

  Slik konverterer du nettside til PDF: 12 beste verktøy

Leverandører

Den andre komponenten i arkitekturen er leverandører for spesifikke teknologier. Dette kan være skyleverandører som AWS, Azure, GCP eller annen infrastruktur som en tjenesteplattform. Det er også en leverandør for mer høynivåkomponenter som Kubernetes eller andre plattform-som-en-tjeneste-verktøy, til og med noe programvare som et selvbetjeningsverktøy.

Det gir deg muligheten til å lage infrastruktur på ulike nivåer.

For eksempel – lag en AWS-infrastruktur, distribuer deretter Kubernetes på toppen av den og lag deretter tjenester/komponenter inne i den Kubernetes-klyngen.

Terraform har over hundre leverandører for ulike teknologier, og hver tilbyder gir deretter terraform-bruker tilgang til ressursene sine. Så gjennom AWS-leverandøren, for eksempel, har du tilgang til hundrevis av AWS-ressurser som EC2-forekomster, AWS-brukerne osv. Med Kubernetes-leverandøren får du tilgang til varer, ressurser som tjenester og distribusjoner og navnerom, etc.

Så dette er hvordan Terraform fungerer, og på denne måten prøver den å hjelpe deg med å klargjøre og dekke hele applikasjonsoppsettet fra infrastruktur og helt til applikasjonen.

La oss gjøre noen praktiske ting. 👨‍💻

Vi vil installere Terraform på Ubuntu og sørge for en veldig grunnleggende infrastruktur.

Installer Terraform

Last ned den nyeste terraform-pakken.

Referere til offisiell nedlastingsside for å få den nyeste versjonen for det respektive operativsystemet.

[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 terraform-filen til banen vist nedenfor. 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 at dette er de tilgjengelige kommandoene i terraform for utførelse.

[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

Tilveiebring AWS EC2-instans ved bruk av Terraform

I denne demoen skal jeg lansere en ny AWS EC2-instans ved hjelp av Terraform.

Lag en arbeidskatalog for denne Terraform-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-forekomst.

[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: Jeg har endret tilgang og hemmelige nøkler 😛, du må bruke din egen.

  Fix Kan ikke etablere en sikker forbindelse med Google Play Musikk

Fra konfigurasjonen nevnt ovenfor kan du se at jeg nevner leverandøren som AWS. Inne i leverandøren gir jeg AWS-brukerlegitimasjon og regioner der forekomsten må lanseres.

I ressurser gir jeg AMI-detaljer om Ubuntu (ami-0a634ae95e11c6f91) og nevner at instanstypen skal være t2.micro

Du kan se hvor enkel og lesbar konfigurasjonsfilen er, selv om du ikke er en die-hard koder.

terraform init

Nå er det første trinnet å 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 er planstadiet; det vil lage utførelsesgrafen 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 gjelder

Applikasjonsstadiet vil kjøre konfigurasjonsfilen og starte en AWS EC2-forekomst. Når du kjører påfør kommando, vil den spørre deg: «Vil du utføre disse handlingene?», Du må skrive ja 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 ditt, og du vil se en ny forekomst med forekomst-IDen nevnt på slutten av bruk-kommandoen er opprettet.

  Finnes det et JCPenney Mastercard?

Du har lansert en AWS EC2-forekomst med Terraform.

terraform ødelegge

Til slutt, hvis du vil slette infrastrukturen, må du kjøre ødeleggelseskommandoen.

[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.

Hvis du sjekker EC2-dashbordet på nytt, vil du se at forekomsten ble avsluttet.

Konklusjon

Jeg tror at ovenstående gir deg en idé om å komme i gang med Terraform. Gå videre og prøv eksemplet jeg nettopp har vist.

Du bør også sjekke ut disse infrastrukturautomatiseringsprogramvarene.

Hvis du er interessert i å lære mer, så vil jeg foreslå å sjekke Lære DevOps med Terraform-kurs.