Sie fragen sich, was ist Terraform? Finden wir es heraus.

Infrastruktur als Code (IaC) ist eine weit verbreitete Terminologie unter DevOps Profis. Hierbei wird die gesamte IT-Infrastruktur (sowohl physische als auch virtuelle Maschinen) mithilfe von maschinenlesbaren Definitionsdateien verwaltet und bereitgestellt. Es ist ein Software-Engineering-Ansatz für den Betrieb. Es hilft bei der Automatisierung des gesamten Rechenzentrums mithilfe von Programmierskripten.

Mit all den Funktionen, die Infrastruktur als Code bietet, hat es mehrere Herausforderungen:

  • Müssen lernen, zu codieren
  • Ich kenne die Auswirkungen der Änderung nicht.
  • Die Änderung muss rückgängig gemacht werden
  • Änderungen können nicht verfolgt werden
  • Eine Ressource kann nicht automatisiert werden
  • Mehrere Umgebungen für die Infrastruktur

Terraform wurde entwickelt, um diese Herausforderungen zu lösen.

Was ist Terraform?

Terraform ist eine Open-Source-Infrastruktur als Code-Tool, die von HashiCorp entwickelt wurde. Es wird verwendet, um die gesamte Infrastruktur in einer leicht zu erlernenden deklarativen Sprache zu definieren und bereitzustellen.

Es ist ein Infrastrukturbereitstellungstool, in dem Sie Ihre Cloud-Infrastruktureinrichtung als Codes speichern können. Es ist sehr ähnlich zu Tools wie z Wolkenbildung, mit dem Sie Ihre AWS-Infrastruktur automatisieren würden, die Sie jedoch nur unter AWS verwenden können. Mit Terraform können Sie es auf anderen verwenden Cloud-Plattformen sowie.

Im Folgenden finden Sie einige Vorteile der Verwendung von Terraform.

  • Führt Orchestrierung durch, nicht nur Konfigurationsmanagement
  • Unterstützt mehrere Anbieter wie AWS, Azure, GCP, DigitalOcean und viele mehr
  • Stellen Sie eine unveränderliche Infrastruktur bereit, in der sich die Konfiguration reibungslos ändert
  • Verwendet leicht verständliche Sprache, HCL (HashiCorp Konfigurationssprache)
  • Leicht zu jedem anderen Anbieter tragbar
  • Unterstützt nur die Client-Architektur, sodass keine zusätzliche Konfigurationsverwaltung auf einem Server erforderlich ist

Terraform Core concepts

Nachfolgend sind die in Terraform verwendeten Kernkonzepte / Terminologien aufgeführt:

  • Variablen: Wird auch als Eingabevariable verwendet und ist ein Schlüssel-Wert-Paar, das von Terraform-Modulen verwendet wird, um die Anpassung zu ermöglichen.
  • Provider: Es ist ein Plugin, um mit Service-APIs zu interagieren und auf die zugehörigen Ressourcen zuzugreifen.
  • Modul: Es ist ein Ordner mit Terraform-Vorlagen, in dem alle Konfigurationen definiert sind
  • Bundesland: Es besteht aus zwischengespeicherten Informationen über die von Terraform verwaltete Infrastruktur und die zugehörigen Konfigurationen.
  • Ressourcen : Es bezieht sich auf einen Block eines oder mehrerer Infrastrukturobjekte (Recheninstanzen, virtuelle Netzwerke usw.), die zum Konfigurieren und Verwalten der Infrastruktur verwendet werden.
  • Datenquelle: Es wird von Anbietern implementiert, um Informationen zu externen Objekten an terraform zurückzugeben.
  • Ausgabewerte: Dies sind Rückgabewerte eines Terraform-Moduls, die von anderen Konfigurationen verwendet werden können.
  • Plan: Dies ist eine der Phasen, in denen festgelegt wird, was erstellt, aktualisiert oder zerstört werden muss, um vom tatsächlichen / aktuellen Status der Infrastruktur in den gewünschten Status zu gelangen.
  • Hinzufügen: Dies ist eine der Phasen, in denen der tatsächliche / aktuelle Status der Infrastruktur der Änderungen angewendet wird, um in den gewünschten Status zu wechseln.

Terraform Lifecycle

Der Terraform-Lebenszyklus besteht aus - init, Plan, sich bewerbenund zerstören.

Terraform-Lebenszyklus - Geekflare
  • Terraform init initialisiert das Arbeitsverzeichnis, das aus allen Konfigurationsdateien besteht
  • Der Terraform-Plan wird verwendet, um einen Ausführungsplan zu erstellen, um einen gewünschten Zustand der Infrastruktur zu erreichen. Änderungen in den Konfigurationsdateien werden vorgenommen, um den gewünschten Status zu erreichen.
  • Terraform Apply nimmt dann die Änderungen in der Infrastruktur vor, wie im Plan definiert, und die Infrastruktur wird in den gewünschten Zustand versetzt.
  • Terraform Destroy wird verwendet, um alle alten Infrastrukturressourcen zu löschen, die nach der Anwendungsphase als fehlerhaft markiert sind.

How Terraform Works?

Terraform besteht aus zwei Hauptkomponenten seiner Architektur:

  • Terraform-Kern
  • Anbieter
Terraform-Architektur - Geekflare

Terraform-Kern

Der Terraform-Kern verwendet zwei Eingabequellen, um seine Arbeit zu erledigen.

Der zuerst Die Eingabequelle ist eine Terraform-Konfiguration, die Sie als Benutzer konfigurieren. Hier definieren Sie, was erstellt oder bereitgestellt werden muss. Und das zweite Die Eingabequelle ist ein Zustand, in dem Terraform den aktuellen Stand der aktuellen Einrichtung der Infrastruktur beibehält.

Der Terraform-Kern nimmt also die Eingabe auf und ermittelt den Plan, was getan werden muss. Es vergleicht den Status, den aktuellen Status und die gewünschte Konfiguration für das Endergebnis. In der Konfigurationsdatei wird herausgefunden, was getan werden muss, um den gewünschten Status zu erreichen. Es zeigt, was erstellt werden muss, was aktualisiert werden muss, was gelöscht werden muss, um die Infrastruktur zu erstellen und bereitzustellen.

Anbieter

Die zweite Komponente der Architektur sind Anbieter für bestimmte Technologien. Dies können Cloud-Anbieter wie AWS, Azure, GCP oder eine andere Infrastruktur als Serviceplattform sein. Es ist auch ein Anbieter für höherwertige Komponenten wie Kubernetes oder andere Platform-as-a-Service-Tools, sogar einige Software als Self-Service-Tool.

Es gibt Ihnen die Möglichkeit, Infrastruktur auf verschiedenen Ebenen zu erstellen.

Beispiel: Erstellen Sie eine AWS-Infrastruktur, stellen Sie Kubernetes darüber bereit und erstellen Sie dann Services / Komponenten in diesem Kubernetes-Cluster.

Terraform hat über hundert Anbieter für verschiedene Technologien, und jeder Anbieter gewährt Terraform-Benutzern Zugriff auf seine Ressourcen. Über den AWS-Anbieter haben Sie beispielsweise Zugriff auf Hunderte von AWS-Ressourcen wie EC2-Instanzen, AWS-Benutzer usw. Mit dem Kubernetes-Anbieter haben Sie Zugriff auf Waren, Ressourcen wie Dienste und Bereitstellungen sowie Namespaces usw.

So funktioniert Terraform und versucht Ihnen auf diese Weise dabei zu helfen, das gesamte Anwendungssetup von der Infrastruktur bis zur Anwendung bereitzustellen und abzudecken.

Lass uns ein paar praktische Sachen machen. 👨‍💻

Wir werden Terraform unter Ubuntu installieren und eine sehr einfache Infrastruktur bereitstellen.

Install Terraform

Laden Sie das neueste Terraform-Paket herunter.

Siehe die offizielle Download-Seite um die neueste Version für das jeweilige Betriebssystem zu erhalten.

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

Extrahieren Sie das heruntergeladene Paket.

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

Verschieben Sie die ausführbare Terraform-Datei in den unten gezeigten Pfad. Überprüfen Sie die Terraform-Version.

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

Sie können sehen, dass dies die verfügbaren Befehle in terraform zur Ausführung sind.

[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

Provision AWS EC2 Instance Using Terraform

In dieser Demo werde ich eine neue AWS EC2-Instanz mit Terraform starten.

Erstellen Sie ein Arbeitsverzeichnis für diese Terraform-Demo.

[email protected]:~$ mkdir terraform_demo

Wechseln Sie in das Verzeichnis und erstellen Sie eine Terraform-Konfigurationsdatei, in der Sie den Anbieter und die Ressourcen zum Starten einer AWS EC2-Instanz definieren.

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

Hinweis: Ich habe den Zugang und die geheimen Schlüssel geändert. Sie müssen Ihre eigenen verwenden.

Aus der oben genannten Konfiguration geht hervor, dass ich den Anbieter wie AWS erwähne. Innerhalb des Anbieters gebe ich AWS-Benutzeranmeldeinformationen und Regionen an, in denen die Instanz gestartet werden muss.

In den Ressourcen gebe ich AMI-Details zu Ubuntu (ami-0a634ae95e11c6f91) an und erwähne, dass der Instanztyp t2.micro sein sollte

Sie können sehen, wie einfach und lesbar die Konfigurationsdatei ist, auch wenn Sie kein eingefleischter Codierer sind.

Terraform-Initialisierung

Der erste Schritt besteht nun darin, die Terraform zu initialisieren.

[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

Als nächstes ist die Planphase; Es wird das Ausführungsdiagramm zum Erstellen und Bereitstellen der Infrastruktur erstellt.

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

In der Apply-Phase wird die Konfigurationsdatei ausgeführt und eine AWS EC2-Instanz gestartet. Wenn Sie den Befehl apply ausführen, werden Sie gefragt: "Möchten Sie diese Aktionen ausführen?". Geben Sie yes ein und drücken Sie die Eingabetaste.

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

Wechseln Sie zu Ihrem AWS EC2-Dashboard, und Sie sehen, dass eine neue Instanz mit der am Ende des Anwendungsbefehls angegebenen Instanz-ID erstellt wurde.

terraform aws ec2 - geekflare

Sie haben eine AWS EC2-Instanz erfolgreich mit Terraform gestartet.

Terraform zerstören

Wenn Sie die Infrastruktur löschen möchten, müssen Sie den Befehl destroy ausführen.

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

Wenn Sie das EC2-Dashboard erneut überprüfen, wird die Instanz beendet.

terraform aws ec2 zerstört - geekflare

Fazit

Ich glaube, das Obige gibt Ihnen eine Idee, wie Sie mit Terraform beginnen können. Probieren Sie das gerade gezeigte Beispiel aus.

Sie sollten auch diese überprüfen Software zur Infrastrukturautomatisierung.

Wenn Sie mehr erfahren möchten, würde ich empfehlen, dies zu überprüfen DevOps mit Terraform lernen.