Úvod do Terraformu pro začátečníky – Kurz Terraform

Ptáte se, co je Terraform? Pojďme se o tom dozvědět.

Infrastructure as Code (IaC) je rozšířená terminologie mezi profesionály DevOps. Jde o proces správy a poskytování kompletní IT infrastruktury (zahrnuje fyzické i virtuální stroje) pomocí strojově čitelných definičních souborů. Je to přístup softwarového inženýrství k operacím. Pomáhá při automatizaci celého datového centra pomocí programovacích skriptů.

Se všemi funkcemi, které Infrastructure as Code poskytuje, má několik výzev:

  • Je potřeba se naučit kódovat
  • Neznám dopad změny.
  • Je třeba vrátit změnu
  • Nelze sledovat změny
  • Zdroj nelze automatizovat
  • Více prostředí pro infrastrukturu

Terraform byl vytvořen k vyřešení těchto problémů.

Co je Terraform?

Terraform je open-source infrastruktura jako kódový nástroj vyvinutý společností HashiCorp. Používá se k definování a poskytování kompletní infrastruktury pomocí snadno naučitelného deklarativního jazyka.

Jedná se o nástroj pro poskytování infrastruktury, kde můžete uložit nastavení cloudové infrastruktury jako kódy. Je to velmi podobné nástrojům jako např CloudFormation, kterou byste použili k automatizaci infrastruktury AWS, ale můžete ji použít pouze na AWS. S Terraformem jej můžete použít i na jiných cloudových platformách.

Níže jsou uvedeny některé z výhod používání Terraform.

  • Provádí orchestraci, nejen správu konfigurace
  • Podporuje více poskytovatelů, jako je AWS, Azure, GCP, DigitalOcean a mnoho dalších
  • Poskytujte neměnnou infrastrukturu, kde se konfigurace hladce mění
  • Používá snadno srozumitelný jazyk, HCL (konfigurační jazyk HashiCorp)
  • Snadno přenosné k jakémukoli jinému poskytovateli
  • Podporuje pouze klientskou architekturu, takže není potřeba další správa konfigurace na serveru

Koncepty Terraform Core

Níže jsou uvedeny základní pojmy/terminologie používané v Terraformu:

  • Proměnné: Používá se také jako vstupní-proměnné, jedná se o pár klíč-hodnota používaný moduly Terraform k umožnění přizpůsobení.
  • Poskytovatel: Je to plugin pro interakci s rozhraními API služby a přístup k souvisejícím zdrojům.
  • Modul: Je to složka se šablonami Terraform, kde jsou definovány všechny konfigurace
  • Stav: Skládá se z uložených informací o infrastruktuře spravované Terraformem a souvisejících konfiguracích.
  • Zdroje: Odkazuje na blok jednoho nebo více objektů infrastruktury (výpočetní instance, virtuální sítě atd.), které se používají při konfiguraci a správě infrastruktury.
  • Zdroj dat: Je implementován poskytovateli pro vrácení informací o externích objektech do terraformu.
  • Výstupní hodnoty: Toto jsou návratové hodnoty modulu terraform, které mohou být použity jinými konfiguracemi.
  • Plán: Je to jedna z fází, kde se určuje, co je třeba vytvořit, aktualizovat nebo zničit, aby se infrastruktura přesunula z reálného/aktuálního stavu do požadovaného stavu.
  • Použít: Je to jedna z fází, kdy se aplikuje změny skutečného/aktuálního stavu infrastruktury za účelem přechodu do požadovaného stavu.

Životní cyklus Terraformu

Životní cyklus Terraformu se skládá z – iniciovat, plánovat, aplikovat a zničit.

  • Terraform init inicializuje pracovní adresář, který se skládá ze všech konfiguračních souborů
  • Plán Terraform se používá k vytvoření plánu provádění pro dosažení požadovaného stavu infrastruktury. Změny v konfiguračních souborech se provádějí za účelem dosažení požadovaného stavu.
  • Aplikace Terraform poté provede změny v infrastruktuře, jak je definováno v plánu, a infrastruktura se dostane do požadovaného stavu.
  • Teraformní ničení se používá k odstranění všech zdrojů staré infrastruktury, které jsou po fázi použití označeny jako poškozené.

Jak funguje Terraform?

Terraform má dvě hlavní součásti, které tvoří jeho architekturu:

Terraform Core

Jádro Terraform využívá ke své práci dva vstupní zdroje.

První vstupní zdroj je konfigurace Terraform, kterou jako uživatel konfigurujete. Zde definujete, co je třeba vytvořit nebo zajistit. A druhým vstupním zdrojem je stav, kdy terraform udržuje aktuální stav toho, jak vypadá aktuální nastavení infrastruktury.

Takže terraform jádro dělá to, že vezme vstup a zjistí plán toho, co je třeba udělat. Porovnává stav, jaký je aktuální stav a jaká je konfigurace, kterou si přejete v konečném výsledku. Zjistí, co je třeba udělat, aby se v konfiguračním souboru dostal do požadovaného stavu. Uvádí, co je třeba vytvořit, co je třeba aktualizovat, co je třeba odstranit, aby se vytvořila a zprovoznila infrastruktura.

  Jak vyhledávat své vlastní tweety

Poskytovatelé

Druhou složkou architektury jsou poskytovatelé pro konkrétní technologie. Mohou to být poskytovatelé cloudu jako AWS, Azure, GCP nebo jiná infrastruktura jako platforma služeb. Je také poskytovatelem komponent na vyšší úrovni, jako je Kubernetes nebo jiné nástroje typu platforma jako služba, dokonce i nějaký software jako samoobslužný nástroj.

Dává vám možnost vytvářet infrastrukturu na různých úrovních.

Například – vytvořte infrastrukturu AWS, poté na ni nasaďte Kubernetes a poté vytvořte služby/komponenty uvnitř tohoto clusteru Kubernetes.

Terraform má přes sto poskytovatelů pro různé technologie a každý poskytovatel pak dává uživateli terraform přístup ke svým zdrojům. Takže například prostřednictvím poskytovatele AWS máte přístup ke stovkám zdrojů AWS, jako jsou instance EC2, uživatelé AWS atd. S poskytovatelem Kubernetes máte přístup ke komoditám, zdrojům, jako jsou služby a nasazení a jmenné prostory atd.

Terraform tedy funguje takto a tímto způsobem se vám snaží pomoci zajistit a pokrýt kompletní nastavení aplikace od infrastruktury až po aplikaci.

Pojďme udělat pár praktických věcí. 👨‍💻

Nainstalujeme Terraform na Ubuntu a poskytneme velmi základní infrastrukturu.

Nainstalujte Terraform

Stáhněte si nejnovější balíček Terraform.

Odkazovat na oficiální stránka ke stažení získat nejnovější verzi pro příslušný 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]

Rozbalte stažený balíček.

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

Přesuňte spustitelný soubor terraform na cestu uvedenou níže. Zkontrolujte verzi Terraform.

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

Můžete vidět, že tyto příkazy jsou dostupné v terraformu k provedení.

[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

Poskytování instance AWS EC2 pomocí Terraformu

V tomto demu spustím novou instanci AWS EC2 pomocí Terraform.

Vytvořte pracovní adresář pro toto demo Terraform.

[email protected]:~$ mkdir terraform_demo

Přejděte do adresáře a vytvořte konfigurační soubor terraform, kde definujete poskytovatele a prostředky pro spuštění instance 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"
}

Poznámka: Změnil jsem přístupové a tajné klíče 😛, musíte použít vlastní.

Z výše uvedené konfigurace můžete vidět, že zmiňuji poskytovatele jako AWS. Uvnitř poskytovatele dávám přihlašovací údaje uživatele AWS a oblasti, kde musí být instance spuštěna.

  Vytvářejte poutavá videa značky pomocí propagace

Ve zdrojích uvádím podrobnosti AMI o Ubuntu (ami-0a634ae95e11c6f91) a uvádím typ instance by měl být t2.micro

Můžete vidět, jak snadný a čitelný je konfigurační soubor, i když nejste zarytý kodér.

terraform init

Nyní je prvním krokem inicializace terraformu.

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

terraformní plán

Další je fáze plánu; vytvoří graf provádění pro vytvoření a zřízení infrastruktury.

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

platí terraform

Fáze aplikace spustí konfigurační soubor a spustí instanci AWS EC2. Když spustíte příkaz Apply, zeptá se vás: „Chcete provést tyto akce?“, musíte zadat ano a stisknout 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.

Přejděte na svůj řídicí panel AWS EC2 a uvidíte, že byla vytvořena nová instance s ID instance uvedeným na konci příkazu Apply.

  Jak naskenovat Snapcode uložený do role fotoaparátu

Úspěšně jste spustili instanci AWS EC2 pomocí Terraform.

terraform zničit

Nakonec, pokud chcete odstranit infrastrukturu, musíte spustit příkaz zničit.

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

Pokud znovu zkontrolujete řídicí panel EC2, uvidíte, že instance byla ukončena.

Závěr

Věřím, že výše uvedené vám dává nápad, jak začít s Terraformem. Pokračujte a vyzkoušejte příklad, který jsem právě ukázal.

Měli byste se také podívat na tento software pro automatizaci infrastruktury.

Pokud máte zájem dozvědět se více, doporučuji zkontrolovat Výuka DevOps s Terraformem.