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