Bevezetés a Terraformba kezdőknek – Terraform oktatóanyag

Kíváncsi vagy, mi az a Terraform? Tudjunk róla.

Az Infrastructure as Code (IaC) széles körben elterjedt terminológia a DevOps szakemberek körében. Ez a teljes IT-infrastruktúra (fizikai és virtuális gépeket egyaránt magában foglaló) kezelésének és kiépítésének folyamata géppel olvasható definíciós fájlok használatával. Ez egy szoftvermérnöki megközelítés a műveletekhez. Programozási szkriptek használatával segíti a teljes adatközpont automatizálását.

Az Infrastructure as Code által nyújtott összes szolgáltatásnak köszönhetően számos kihívással kell szembenéznie:

  • Meg kell tanulni kódolni
  • Nem ismeri a változás hatását.
  • Vissza kell állítani a változást
  • Nem lehet nyomon követni a változásokat
  • Nem automatizálható az erőforrás
  • Több környezet az infrastruktúrához

A Terraform ezen kihívások megoldására jött létre.

Mi az a Terraform?

Terraform egy nyílt forráskódú infrastruktúra kódeszközként, amelyet a HashiCorp fejlesztett ki. A teljes infrastruktúra meghatározására és biztosítására szolgál egy könnyen elsajátítható deklaratív nyelv használatával.

Ez egy infrastruktúra-kiépítési eszköz, amelyben kódokként tárolhatja felhőinfrastruktúra-beállításait. Nagyon hasonlít az olyan eszközökhöz, mint pl CloudFormation, amelyet az AWS-infrastruktúra automatizálására használna, de ezt csak az AWS-ben használhatja. A Terraform segítségével más felhőplatformokon is használhatja.

Az alábbiakban bemutatjuk a Terraform használatának néhány előnyeit.

  • Hangszerelést végez, nem csak konfigurációkezelést
  • Több szolgáltatót támogat, mint például az AWS, Azure, GCP, DigitalOcean és még sok más
  • Változatlan infrastruktúra biztosítása, ahol a konfiguráció zökkenőmentesen változik
  • Könnyen érthető nyelvet használ, a HCL (HashiCorp konfigurációs nyelv)
  • Könnyen hordozható bármely más szolgáltatóhoz
  • Csak a kliens architektúrát támogatja, így nincs szükség további konfigurációkezelésre a szerveren

Terraform alapfogalmak

Alább találhatók a Terraformban használt alapvető fogalmak/terminológiák:

  • Változók: Bemeneti változóként is használják, kulcs-érték pár, amelyet a Terraform modulok használnak a testreszabás érdekében.
  • Szolgáltató: Ez egy beépülő modul a szolgáltatás API-jaival való interakcióhoz és a kapcsolódó erőforrásokhoz való hozzáféréshez.
  • Modul: Terraform sablonokat tartalmazó mappa, ahol az összes konfiguráció definiálva van
  • Állapot: A Terraform által kezelt infrastruktúra és a kapcsolódó konfigurációk gyorsítótárazott információiból áll.
  • Erőforrások: Egy vagy több infrastruktúra objektum blokkjára utal (számítási példányok, virtuális hálózatok stb.), amelyeket az infrastruktúra konfigurálásához és kezeléséhez használnak.
  • Adatforrás: A szolgáltatók úgy valósítják meg, hogy a külső objektumokkal kapcsolatos információkat visszaadják a terraformba.
  • Kimeneti értékek: Ezek egy terraform modul visszatérési értékei, amelyeket más konfigurációk is használhatnak.
  • Terv: Ez az egyik szakasz, ahol meghatározza, hogy mit kell létrehozni, frissíteni vagy megsemmisíteni, hogy az infrastruktúra valós/jelenlegi állapotából a kívánt állapotba kerüljön.
  • Alkalmazás: Ez az egyik szakasz, ahol alkalmazza az infrastruktúra valós/aktuális állapotának változásait, hogy a kívánt állapotba kerüljön.

Terraform életciklus

A Terraform életciklusa a következőkből áll: elindítása, tervezése, alkalmazása és megsemmisítése.

  • A Terraform init inicializálja az összes konfigurációs fájlt tartalmazó munkakönyvtárat
  • A Terraform terv végrehajtási terv létrehozására szolgál az infrastruktúra kívánt állapotának eléréséhez. A konfigurációs fájlok módosítása a kívánt állapot elérése érdekében történik.
  • A Terraform application ezután elvégzi a tervben meghatározott változtatásokat az infrastruktúrában, és az infrastruktúra a kívánt állapotba kerül.
  • A Terraform rombolás az összes régi infrastruktúra-erőforrás törlésére szolgál, amelyek az alkalmazási fázis után szennyezettnek vannak jelölve.

Hogyan működik a Terraform?

A Terraform felépítését két fő összetevő alkotja:

Terraform Core

A Terraform core két bemeneti forrást használ a munkájához.

Az első bemeneti forrás egy Terraform konfiguráció, amelyet felhasználóként Ön konfigurálhat. Itt határozza meg, hogy mit kell létrehozni vagy kiépíteni. A második bemeneti forrás pedig egy olyan állapot, ahol a terraform naprakészen tartja az infrastruktúra jelenlegi felépítésének állapotát.

Tehát a terraform mag veszi a bemenetet, és kitalálja, hogy mit kell tenni. Összehasonlítja az állapotot, az aktuális állapotot és a végeredményben kívánt konfigurációt. Kideríti, mit kell tenni a konfigurációs fájl kívánt állapotának eléréséhez. Kiszámítja, mit kell létrehozni, mit kell frissíteni, mit kell törölni az infrastruktúra létrehozásához és biztosításához.

Szolgáltatók

Az architektúra második összetevője az egyes technológiák szolgáltatói. Ezek lehetnek felhőszolgáltatók, például AWS, Azure, GCP vagy más infrastruktúra szolgáltatási platformként. Magasabb szintű komponensek, például Kubernetes vagy más platform-as-a-service eszközök szolgáltatója is, sőt bizonyos szoftverek önkiszolgáló eszközként is szolgálnak.

  Az Rsync beállítása Linuxon

Lehetővé teszi az infrastruktúra létrehozását különböző szinteken.

Például – hozzon létre egy AWS-infrastruktúrát, majd telepítse a Kubernetes-t a tetejére, majd hozzon létre szolgáltatásokat/összetevőket a Kubernetes-fürtön belül.

A Terraformnak több mint száz szolgáltatója van a különböző technológiákhoz, és minden szolgáltató hozzáférést biztosít a terraform felhasználóinak erőforrásaihoz. Így például az AWS-szolgáltatón keresztül több száz AWS-erőforráshoz férhet hozzá, például EC2-példányokhoz, AWS-felhasználókhoz stb. A Kubernetes-szolgáltatóval hozzáférhet árukhoz, erőforrásokhoz, például szolgáltatásokhoz és telepítésekhez, névterekhez stb.

Tehát a Terraform így működik, és így igyekszik segíteni Önnek a teljes alkalmazás-beállítást az infrastruktúrától egészen az alkalmazásig.

Csináljunk néhány gyakorlati dolgot. 👨‍💻

Telepítjük a Terraformot az Ubuntu-ra, és egy nagyon alapvető infrastruktúrát biztosítunk.

Telepítse a Terraformot

Töltse le a legújabb terraform csomagot.

Utal hivatalos letöltési oldal az adott operációs rendszer legfrissebb verziójának beszerzéséhez.

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

Bontsa ki a letöltött csomagot.

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

Helyezze át a terraform végrehajtható fájlt az alábbi elérési útra. Ellenőrizze a terraform verziót.

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

Láthatja, hogy ezek a végrehajtható parancsok terraformában.

[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

AWS EC2 példány létrehozása Terraform használatával

Ebben a bemutatóban egy új AWS EC2 példányt fogok elindítani a Terraform használatával.

Hozzon létre egy munkakönyvtárat ehhez a Terraform bemutatóhoz.

[email protected]:~$ mkdir terraform_demo

Lépjen a könyvtárba, és hozzon létre egy terraform konfigurációs fájlt, amelyben megadja a szolgáltatót és az erőforrásokat az AWS EC2 példány elindításához.

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

Megjegyzés: Megváltoztattam a hozzáférési és titkos kulcsokat 😛, a sajátodat kell használnod.

A fent említett konfigurációból láthatja, hogy a szolgáltatót, például az AWS-t említem. A szolgáltatón belül megadom az AWS felhasználói hitelesítő adatokat és azokat a régiókat, ahol a példányt el kell indítani.

Az erőforrásokban megadom az Ubuntu AMI-részleteit (ami-0a634ae95e11c6f91), és megemlítem, hogy a példány típusa t2.micro

Láthatja, mennyire könnyű és olvasható a konfigurációs fájl, még akkor is, ha Ön nem egy megrögzött kódoló.

terraform init

Most az első lépés a terraform inicializálása.

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

Következő a terv szakasza; létrehozza a végrehajtási gráfot az infrastruktúra létrehozásához és kiépítéséhez.

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

Az alkalmazási szakasz végrehajtja a konfigurációs fájlt, és elindít egy AWS EC2 példányt. Amikor futtatja az Apply parancsot, a rendszer megkérdezi, hogy „akarja végrehajtani ezeket a műveleteket?”, be kell írnia, hogy igen, és meg kell nyomnia az Enter billentyűt.

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

Nyissa meg az AWS EC2 irányítópultját, és látni fogja, hogy létrejött egy új példány az apply parancs végén említett példányazonosítóval.

  Hogyan lehet távolról kijelentkezni az iCloudból

Sikeresen elindított egy AWS EC2 példányt a Terraform segítségével.

terraform elpusztítani

Végül, ha törölni szeretné az infrastruktúrát, futtassa a destrukciós parancsot.

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

Ha újra ellenőrzi az EC2 irányítópultját, látni fogja, hogy a példány leállt.

  A Bash Shell testreszabása a shopt segítségével

Következtetés

Úgy gondolom, hogy a fentiek ötletet adnak a Terraform használatához. Próbáld ki az imént bemutatott példát.

Érdemes megnézni ezeket az infrastruktúra-automatizálási szoftvereket is.

Ha többet szeretne megtudni, azt javaslom, nézze meg DevOps tanulás a Terraform tanfolyammal.