En introduktion till Terraform för nybörjare – Tutorial för Terraform

Undrar, vad är Terraform? Låt oss ta reda på det.

Infrastructure as Code (IaC) är en utbredd terminologi bland DevOps-proffs. Det är processen att hantera och tillhandahålla hela IT-infrastrukturen (omfattar både fysiska och virtuella maskiner) med hjälp av maskinläsbara definitionsfiler. Det är en mjukvaruteknisk strategi för verksamheten. Det hjälper till att automatisera hela datacentret genom att använda programmeringsskript.

Med alla funktioner som Infrastructure as Code tillhandahåller, har den flera utmaningar:

  • Behöver lära sig att koda
  • Vet inte förändringens inverkan.
  • Måste återställa ändringen
  • Kan inte spåra ändringar
  • Det går inte att automatisera en resurs
  • Flera miljöer för infrastruktur

Terraform har skapats för att lösa dessa utmaningar.

Vad är Terraform?

Terraform är en öppen källkodsinfrastruktur som kodverktyg utvecklat av HashiCorp. Den används för att definiera och tillhandahålla hela infrastrukturen med ett lättläst deklarativt språk.

Det är ett infrastrukturförsörjningsverktyg där du kan lagra din molninfrastrukturkonfiguration som koder. Det är väldigt likt verktyg som t.ex CloudFormation, som du skulle använda för att automatisera din AWS-infrastruktur, men du kan bara använda den på AWS. Med Terraform kan du använda den på andra molnplattformar också.

Nedan är några av fördelarna med att använda Terraform.

  • Gör orkestrering, inte bara konfigurationshantering
  • Stöder flera leverantörer som AWS, Azure, GCP, DigitalOcean och många fler
  • Tillhandahåll oföränderlig infrastruktur där konfigurationen ändras smidigt
  • Använder lättförståeligt språk, HCL (HashiCorp konfigurationsspråk)
  • Lätt att bära till vilken annan leverantör som helst
  • Stöder klientarkitektur, så inget behov av ytterligare konfigurationshantering på en server

Terraforms kärnkoncept

Nedan är de centrala begreppen/terminologierna som används i Terraform:

  • Variabler: Används även som indatavariabler, det är nyckel-värdepar som används av Terraform-moduler för att möjliggöra anpassning.
  • Leverantör: Det är ett plugin för att interagera med API:er för tjänsten och komma åt dess relaterade resurser.
  • Modul: Det är en mapp med Terraform-mallar där alla konfigurationer är definierade
  • Status: Den består av cachad information om infrastrukturen som hanteras av Terraform och de relaterade konfigurationerna.
  • Resurser: Det hänvisar till ett block av ett eller flera infrastrukturobjekt (datorinstanser, virtuella nätverk, etc.), som används för att konfigurera och hantera infrastrukturen.
  • Datakälla: Det implementeras av leverantörer för att returnera information om externa objekt till terraform.
  • Utdatavärden: Dessa är returvärden för en terraform-modul som kan användas av andra konfigurationer.
  • Plan: Det är ett av stegen där det avgör vad som behöver skapas, uppdateras eller förstöras för att gå från verkligt/nuvarande tillstånd av infrastrukturen till önskat tillstånd.
  • Tillämpa: Det är ett av stegen där det tillämpar ändringarnas verkliga/nuvarande tillstånd för infrastrukturen för att flytta till önskat tillstånd.

Terraforms livscykel

Terraforms livscykel består av – initiera, planera, tillämpa och förstöra.

  • Terraform init initierar arbetskatalogen som består av alla konfigurationsfiler
  • Terraform plan används för att skapa en utförandeplan för att nå ett önskat tillstånd av infrastrukturen. Ändringar i konfigurationsfilerna görs för att uppnå önskat tillstånd.
  • Terraform applicerar sedan ändringarna i infrastrukturen enligt planen, och infrastrukturen kommer till önskat skick.
  • Terraform destroy används för att ta bort alla gamla infrastrukturresurser, som är markerade som fläckade efter appliceringsfasen.

Hur fungerar Terraform?

Terraform har två huvudkomponenter som utgör dess arkitektur:

Terraform kärna

Terraform core använder två ingångskällor för att göra sitt jobb.

Den första ingångskällan är en Terraform-konfiguration som du som användare konfigurerar. Här definierar du vad som behöver skapas eller tillhandahållas. Och den andra ingångskällan är ett tillstånd där terraform håller det uppdaterade tillståndet för hur den nuvarande uppsättningen av infrastrukturen ser ut.

Så vad terraform kärna gör är att den tar input, och den räknar ut planen för vad som behöver göras. Den jämför tillståndet, vad som är det nuvarande tillståndet och vilken konfiguration du önskar i slutresultatet. Den tar reda på vad som behöver göras för att komma till det önskade tillståndet i konfigurationsfilen. Den räknar ut vad som behöver skapas, vad som behöver uppdateras, vad som behöver raderas för att skapa och tillhandahålla infrastrukturen.

Leverantörer

Den andra komponenten i arkitekturen är leverantörer av specifika teknologier. Detta kan vara molnleverantörer som AWS, Azure, GCP eller annan infrastruktur som en tjänst-plattform. Det är också en leverantör av mer högnivåkomponenter som Kubernetes eller andra plattforms-som-en-tjänst-verktyg, till och med viss programvara som ett självbetjäningsverktyg.

Det ger dig möjlighet att skapa infrastruktur på olika nivåer.

Till exempel – skapa en AWS-infrastruktur, distribuera sedan Kubernetes ovanpå den och skapa sedan tjänster/komponenter inuti det Kubernetes-klustret.

Terraform har över hundra leverantörer för olika teknologier, och varje leverantör ger sedan terraform-användare tillgång till sina resurser. Så genom AWS-leverantören, till exempel, har du tillgång till hundratals AWS-resurser som EC2-instanser, AWS-användarna, etc. Med Kubernetes-leverantören får du tillgång till varor, resurser som tjänster och distributioner och namnutrymmen, etc.

Så, det är så här Terraform fungerar, och på det här sättet försöker den hjälpa dig att tillhandahålla och täcka hela applikationsinställningen från infrastruktur hela vägen till applikationen.

Låt oss göra lite praktiska saker. 👨‍💻

Vi kommer att installera Terraform på Ubuntu och tillhandahålla en mycket grundläggande infrastruktur.

Installera Terraform

Ladda ner det senaste terraform-paketet.

Referera till officiella nedladdningssida för att få den senaste versionen för respektive OS.

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

Extrahera det nedladdade paketet.

[email protected]:~$ unzip terraform_0.13.0_linux_amd64.zip
Archive:
terraform_0.13.0_linux_amd64.zip
inflating: terraform

Flytta den körbara terraform-filen till sökvägen som visas nedan. Kontrollera terraform-versionen.

[email protected]:~$ sudo mv terraform /usr/local/bin/
[sudo] password for adminvista.com:
[email protected]:~$ terraform -v
Terraform v0.13.0

Du kan se att dessa är tillgängliga kommandon i terraform för exekvering.

[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

Tillhandahåll AWS EC2-instans med Terraform

I den här demon kommer jag att lansera en ny AWS EC2-instans med Terraform.

Skapa en arbetskatalog för denna Terraform-demo.

[email protected]:~$ mkdir terraform_demo

Gå till katalogen och skapa en terraform-konfigurationsfil där du definierar leverantören och resurserna för att starta 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"
}

Obs: Jag har ändrat åtkomst- och hemliga nycklar 😛, du måste använda din egen.

Från konfigurationen som nämns ovan kan du se att jag nämner leverantören som AWS. Inuti leverantören ger jag AWS användaruppgifter och regioner där instansen måste startas.

I resurser ger jag AMI-detaljer om Ubuntu (ami-0a634ae95e11c6f91) och nämner att instanstypen ska vara t2.micro

Du kan se hur lätt och läsbar konfigurationsfilen är, även om du inte är en inbiten kodare.

terraform init

Nu är det första steget att initiera 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

Nästa är planstadiet; det kommer att skapa exekveringsdiagrammet för att skapa och tillhandahålla 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 tillämpas

Appliceringssteget kommer att exekvera konfigurationsfilen och starta en AWS EC2-instans. När du kör applicera kommandot kommer det att fråga dig ”Vill du utföra dessa åtgärder?”, du måste skriva ja och trycka på 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å till din AWS EC2-instrumentpanel och du kommer att se en ny instans med det instans-ID som nämns i slutet av appliceringskommandot har skapats.

Du har framgångsrikt startat en AWS EC2-instans med Terraform.

terraform förstöra

Slutligen, om du vill ta bort infrastrukturen måste du köra förstörelsekommandot.

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

Om du kontrollerar EC2-instrumentpanelen igen kommer du att se att instansen har avslutats.

Slutsats

Jag tror att ovanstående ger dig en idé för att komma igång med Terraform. Varsågod och prova exemplet jag just visade.

Du bör också kolla in dessa programvara för automatisering av infrastruktur.

Om du är intresserad av att lära dig mer, skulle jag rekommendera att kolla Lär dig DevOps med Terraform-kurs.