O introducere în Terraform pentru începători – Tutorial Terraform

Te întreb, ce este Terraform? Să aflăm despre asta.

Infrastructura ca cod (IaC) este o terminologie larg răspândită printre profesioniștii DevOps. Este procesul de gestionare și furnizare a întregii infrastructuri IT (cuprinde atât mașini fizice, cât și virtuale) folosind fișiere de definiție care pot fi citite de mașină. Este o abordare de inginerie software a operațiunilor. Ajută la automatizarea întregului centru de date prin utilizarea scripturilor de programare.

Cu toate caracteristicile pe care Infrastructure as Code le oferă, are multiple provocări:

  • Trebuie să înveți să codificăm
  • Nu știu impactul schimbării.
  • Trebuie să anulați schimbarea
  • Nu pot urmări modificările
  • Nu se poate automatiza o resursă
  • Medii multiple pentru infrastructură

Terraform a fost creat pentru a rezolva aceste provocări.

Ce este Terraform?

Terraform este o infrastructură open-source ca instrument de cod dezvoltat de HashiCorp. Este folosit pentru a defini și furniza infrastructura completă folosind un limbaj declarativ ușor de învățat.

Este un instrument de furnizare a infrastructurii în care vă puteți stoca configurația infrastructurii cloud sub formă de coduri. Este foarte asemănător cu instrumente precum CloudFormation, pe care l-ați folosi pentru a vă automatiza infrastructura AWS, dar o puteți utiliza numai pe AWS. Cu Terraform, îl puteți folosi și pe alte platforme cloud.

Mai jos sunt câteva dintre beneficiile utilizării Terraform.

  • Face orchestrare, nu doar gestionarea configurației
  • Acceptă mai mulți furnizori, cum ar fi AWS, Azure, GCP, DigitalOcean și mulți alții
  • Furnizați o infrastructură imuabilă în care configurația se schimbă fără probleme
  • Folosește un limbaj ușor de înțeles, HCL (limbaj de configurare HashiCorp)
  • Portabil cu ușurință la orice alt furnizor
  • Acceptă arhitectura doar client, deci nu este nevoie de management suplimentar al configurației pe un server

Concepte de bază Terraform

Mai jos sunt conceptele/terminologiile de bază utilizate în Terraform:

  • Variabile: Folosită și ca variabile de intrare, este o pereche cheie-valoare utilizată de modulele Terraform pentru a permite personalizarea.
  • Furnizor: este un plugin pentru a interacționa cu API-urile de serviciu și pentru a accesa resursele aferente acestuia.
  • Modul: Este un folder cu șabloane Terraform în care sunt definite toate configurațiile
  • Stare: Constă din informații stocate în cache despre infrastructura gestionată de Terraform și configurațiile aferente.
  • Resurse: se referă la un bloc de unul sau mai multe obiecte de infrastructură (instanțe de calcul, rețele virtuale etc.), care sunt utilizate în configurarea și gestionarea infrastructurii.
  • Sursa datelor: este implementat de furnizori pentru a returna informații despre obiectele externe la terraform.
  • Valori de ieșire: Acestea sunt valorile returnate ale unui modul terraform care pot fi utilizate de alte configurații.
  • Plan: Este una dintre etapele în care se determină ce trebuie creat, actualizat sau distrus pentru a trece de la starea reală/actuală a infrastructurii la starea dorită.
  • Aplicare: Este una dintre etapele în care se aplică modificările stării reale/actuale ale infrastructurii pentru a trece la starea dorită.

Ciclul de viață Terraform

Ciclul de viață Terraform constă în – inițializare, planificare, aplicare și distrugere.

  • Terraform init inițializează directorul de lucru care constă din toate fișierele de configurare
  • Planul Terraform este utilizat pentru a crea un plan de execuție pentru a ajunge la starea dorită a infrastructurii. Modificările în fișierele de configurare se fac pentru a atinge starea dorită.
  • Aplicarea Terraform face apoi modificările în infrastructură așa cum sunt definite în plan, iar infrastructura ajunge la starea dorită.
  • Distrugerea Terraform este folosită pentru a șterge toate resursele vechi de infrastructură, care sunt marcate contaminate după faza de aplicare.

Cum funcționează Terraform?

Terraform are două componente principale care alcătuiesc arhitectura sa:

Miez Terraform

Nucleul Terraform folosește două surse de intrare pentru a-și face treaba.

Prima sursă de intrare este o configurație Terraform pe care, în calitate de utilizator, o configurați. Aici, definiți ceea ce trebuie creat sau furnizat. Iar a doua sursă de intrare este o stare în care terraform păstrează starea actualizată a modului în care arată configurația actuală a infrastructurii.

  Generați un arbore comun cu aceste 4 Cladogram Maker

Deci, ceea ce face miezul terraform este că preia intrarea și își dă seama de planul a ceea ce trebuie făcut. Acesta compară starea, care este starea curentă și care este configurația pe care o doriți în rezultatul final. Își dă seama ce trebuie făcut pentru a ajunge la starea dorită în fișierul de configurare. Se calculează ce trebuie creat, ce trebuie actualizat, ce trebuie șters pentru a crea și furniza infrastructura.

Furnizorii

A doua componentă a arhitecturii sunt furnizorii de tehnologii specifice. Acesta ar putea fi furnizori de cloud precum AWS, Azure, GCP sau altă infrastructură ca platformă de servicii. De asemenea, este un furnizor pentru mai multe componente de nivel înalt, cum ar fi Kubernetes sau alte instrumente platform-as-a-service, chiar și unele software ca instrument de autoservire.

Vă oferă posibilitatea de a crea infrastructură la diferite niveluri.

De exemplu, creați o infrastructură AWS, apoi implementați Kubernetes deasupra acesteia și apoi creați servicii/componente în acel cluster Kubernetes.

Terraform are peste o sută de furnizori pentru diferite tehnologii, iar fiecare furnizor oferă apoi acces utilizatorului terraform la resursele sale. Prin intermediul furnizorului AWS, de exemplu, aveți acces la sute de resurse AWS, cum ar fi instanțe EC2, utilizatorii AWS etc. Cu furnizorul Kubernetes, aveți acces la mărfuri, resurse precum servicii și implementări și spații de nume etc.

Deci, așa funcționează Terraform și în acest fel încearcă să vă ajute să furnizați și să acoperiți configurarea completă a aplicației, de la infrastructură până la aplicație.

Hai să facem niște lucruri practice. 👨‍💻

Vom instala Terraform pe Ubuntu și vom furniza o infrastructură de bază.

Instalați Terraform

Descărcați cel mai recent pachet terraform.

Consultați pagina oficială de descărcare pentru a obține cea mai recentă versiune pentru sistemul de operare respectiv.

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

Extrageți pachetul descărcat.

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

Mutați fișierul executabil terraform în calea prezentată mai jos. Verificați versiunea terraform.

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

Puteți vedea că acestea sunt comenzile disponibile în terraform pentru execuție.

[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

Furnizați o instanță AWS EC2 utilizând Terraform

În această demonstrație, voi lansa o nouă instanță AWS EC2 folosind Terraform.

Creați un director de lucru pentru această demonstrație Terraform.

[email protected]:~$ mkdir terraform_demo

Accesați directorul și creați un fișier de configurare terraform unde definiți furnizorul și resursele pentru a lansa o instanță AWS EC2.

[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"
}

Notă: am schimbat cheile de acces și secrete 😛, trebuie să le folosiți pe ale dvs.

  7 cele mai bune instrumente de urmărire a stării de spirit pentru a vă îmbunătăți calitatea vieții

Din configurația menționată mai sus, puteți vedea că menționez furnizorul ca AWS. În interiorul furnizorului, ofer acreditările utilizatorului AWS și regiunile în care trebuie lansată instanța.

În resurse, dau detalii AMI despre Ubuntu (ami-0a634ae95e11c6f91) și menționez că tipul instanței ar trebui să fie t2.micro

Puteți vedea cât de ușor și de lizibil este fișierul de configurare, chiar dacă nu sunteți un codificator profund.

terraform init

Acum, primul pas este să inițializați 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.

plan de terraformă

Urmează etapa de plan; va crea graficul de execuție pentru crearea și furnizarea infrastructurii.

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

se aplică terraform

Etapa de aplicare va executa fișierul de configurare și va lansa o instanță AWS EC2. Când executați comanda de aplicare, vă va întreba „Doriți să efectuați aceste acțiuni?”, trebuie să tastați da și să apăsați 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.

Accesați tabloul de bord AWS EC2 și veți vedea că a fost creată o nouă instanță cu ID-ul instanței menționat la sfârșitul comenzii de aplicare.

  Cum să adăugați spațiu între text și chenarele celulelor în Excel

Ați lansat cu succes o instanță AWS EC2 folosind Terraform.

terraform distruge

În cele din urmă, dacă doriți să ștergeți infrastructura, trebuie să rulați comanda de distrugere.

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

Dacă verificați din nou tabloul de bord EC2, veți vedea că instanța a fost terminată.

Concluzie

Cred că cele de mai sus vă oferă o idee pentru a începe cu Terraform. Continuați și încercați exemplul pe care tocmai l-am arătat.

Ar trebui să consultați și aceste software de automatizare a infrastructurii.

Dacă sunteți interesat să aflați mai multe, vă sugerez să verificați Învățarea DevOps cu cursul Terraform.