Ú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
Table of Contents
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.
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.
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.
Ú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.