Datenquelle und Ausgaben / Sudo Null IT News

[*]

Inhaltsverzeichnis

  1. Tag 1: Einführung

  2. Tag 2: Erhöhen Sie die Server

  3. Tag 3: Datenquellen und Ergebnisse

Verknüpfungen

Einige Links erfordern VPN

aws CLI-Befehlsreferenz

CLI-Befehlsreferenz yc

Terraform-Anbieter aws

Terraform-Anbieter Yandex

Heute werden wir uns mit den Konzepten der Datenquelle und -ausgabe vertraut machen; Lassen Sie uns sehen, wie die Änderungen auf die bereits vorhandene Infrastruktur angewendet werden.

Datenquelle

Beim letzten Mal mussten wir zum Hochfahren des Servers einen Teil der Parameter mithilfe der CLI (oder Konsole) durchsuchen, insbesondere die subnet_id und die ID des Betriebssystem-Images. Um dies nicht jedes Mal tun zu müssen und um aktuelle Informationen (z. B. die neueste Version des Betriebssystems) zu haben, gibt es eine Datenquelle. Diese Entität ermöglicht es, Informationen vom Anbieter zu erhalten, die in keiner Weise mit der aktuellen Infrastruktur (der in unserer Datei beschriebenen) zusammenhängen.

Die Syntax ist für alle Anbieter gleich, genauso wie für die Ressource:

data “” “” { = = { = } }

Stellen Sie sich vor, dass die Ressource und das Datum gleich sind, aber wir selbst initiieren die Ressource, und das Datum ist etwas, das bereits existiert.

Jandex

Um die ID für Ubuntu 22.04 zu erhalten, müssen Sie den Familienparameter angeben – ubuntu-2204-lts; Subnetzname, um seine ID zu erhalten – default-ru-central1-a

yandex/main.tf

… data “yandex_compute_image” “last_ubuntu” { family = “ubuntu-2204-lts” # OS (Ubuntu, 22.04 LTS) } data “yandex_vpc_subnet” “default_a” { name = “default-ru-central1-a” # one aus Standardsubnetzen } … aws

Mit aws ist es etwas komplizierter: Um die ID der neuesten Version von Ubuntu zu erhalten, müssen Sie die ID des Eigentümers des Bildes und seinen Namen angeben (wir haben dies im letzten Teil über cli erhalten):

Das Sternchen ersetzt die Versionsnummer, die wir nicht angeben, weil wir immer die neueste Version wollen: Dafür ist der Parameter most_recent = true zuständig

Um die Subnetz-ID zu erhalten, geben Sie die gewünschte Zone an (lassen Sie es wie in Yandex sein – „a“)

Das Sternchen ersetzt die Versionsnummer, die wir nicht angeben, weil wir immer die neueste Version wollen: Dafür ist der Parameter most_recent = true zuständig

Um die Subnetz-ID zu erhalten, geben Sie die gewünschte Zone an (lassen Sie es wie in Yandex sein – „a“)

aws/main.tf

… data “aws_ami” “last_ubuntu” { most_recent = true # nur Besitzer der neusten Version = [“099720109477”] # Bildbesitzer-ID-Filter { Name = “Name” # Filtername – Welcher Parameter soll nach Werten gesucht werden = [“ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server*”] # was zu suchen ist } } data “aws_subnet” “default_a” { filter { name = “availability-zone” values ​​= [“eu-north-1a”]
} } …

Ausgaben und Wertsubstitution

Jetzt müssen Sie diese empfangenen Daten anstelle von Hardcode verwenden. Aber zusätzlich zum Ersetzen in den Ressourcenparametern werden wir sie mit output an das Terminal ausgeben.

Schlussfolgerungen (nennen wir sie so) werden nicht nur verwendet, um Informationen auf dem Bildschirm anzuzeigen, aber lassen Sie uns vorerst damit aufhören. Fügen wir der Ausgabe die ID des Betriebssystem-Images und die ID des Subnetzes sowie die IP-Adresse des ausgelösten Servers hinzu.

Um die gewünschten Werte von Objekten zu erhalten, müssen Sie sie nur namentlich durch einen Punkt ansprechen.

Wichtig: terraform liest alle Dateien mit der Erweiterung .tf im Verzeichnis als Ganzes – Sie können alles in einer Datei oder in mehreren beschreiben, wie Sie möchten (aus dem gleichen Grund ist die Reihenfolge, in der Entitäten in der Datei selbst angegeben sind, nicht wichtig).

Touch-Ausgänge.tfYandex

yandex/outputs.tf

Ausgabe “default_instance_public_ip” { value = yandex_compute_instance.default.network_interface[0].nat_ip_address } Ausgabe “subnet_id” { Wert = data.yandex_vpc_subnet.default_a.subnet_id } Ausgabe “last_ubuntu” { Wert = data.yandex_compute_image.last_ubuntu.id }

yandex/main.tf

terraform { required_providers { yandex = { source = “yandex-cloud/yandex” } } } provider “yandex” { token = “…” # Yandex OAuth-Token cloud_id = “b1gos1rh49bip4rnmrmg” folder_id = “b1gjju43i1pr11i5c4ic” zone = “ru – central1-a” } data “yandex_compute_image” “last_ubuntu” { family = “ubuntu-2204-lts” # OS (Ubuntu, 22.04 LTS) } data “yandex_vpc_subnet” “default_a” { name = “default-ru-central1-a ” # eines der Standardsubnetze } # Ressource “yandex_compute_instance”, d.h. server # Terraform kennt ihn unter dem Namen „yandex_compute_instance.default“ resource „yandex_compute_instance“ „default“ { name = „test-instance“ platform_id = „standard-v1“ # Prozessortyp (Intel Broadwell) Ressourcen { core_fraction = 5 # Garantierter Anteil vCPU-Kerne = 2 # vCPU-Speicher = 1 # RAM } boot_disk { initialize_params { image_id = data.yandex_compute_image.last_ubuntu.id } } network_interface { subnet_id = data.yandex_vpc_subnet.default_a.subnet_id nat = true # dynamische IP automatisch festlegen } } aws

aws/outputs.tf

Ausgabe “default_instance_public_ip” { Wert = aws_instance.default.public_ip } Ausgabe “subnet_id” { Wert = data.aws_subnet.default_a.id } Ausgabe “last_ubuntu” { Wert = data.aws_ami.last_ubuntu.id }

aws/main.tf

Anbieter “aws” { access_key = “AK…” secret_key = “2X…” region = “eu-north-1” } data “aws_ami” “last_ubuntu” { most_recent = true owner = [“099720109477”]

Filter { Name = “Name” Werte = [“ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server*”]
} } data “aws_subnet” “default_a” { filter { name = “availability-zone” values ​​= [“eu-north-1a”]
} } #resource “aws_instance” d.h. Der #terraform-Server kennt ihn unter dem Namen „aws_instance.default“ resource „aws_instance“ „default“ { ami = data.aws_ami.last_ubuntu.id # OS (Ubuntu, 22.04 LTS) instance_type = „t3.micro“ # Prozessortyp und Ressource Maschinen (CPU und RAM) subnet_id = data.aws_subnet.default_a.id # eines der Standard-Subnetze Associate_public_ip_address = true # automatisch gesetzte dynamische IP-Tags = { Name = “test-instance” } }

Applikation und Datenausgabe an das Terminal

Nach der Anwendung von Terraform sehen wir so etwas:

Ausgaben: # yandex default_instance_public_ip = “51.250.95.35” last_ubuntu = “fd8v0s6adqu3ui3rsuap” subnet_id = “e9bdgo95ucmut6r7pioq”

Wenn wir uns die Ausgabe des plan-Befehls ansehen (dieselbe wird von apply before apply angezeigt), sehen wir Folgendes:

Änderungen an den Ausgaben: # yandex + default_instance_public_ip = (nach Anwendung bekannt) + last_ubuntu = “fd8v0s6adqu3ui3rsuap” + subnet_id = “e9bdgo95ucmut6r7pioq” # aws + default_instance_public_ip = (nach Anwendung bekannt) + last_ubuntu = “ami-0a2b8744b4fe77f92” + subnet_id = “subnet_id” 82b67deb”

Zurück zum Anfang dieses Artikels: Die Datenquelle ist etwas, das bereits existiert, also kennen wir diese Daten noch vor der Anwendung: last_ubuntu und subnet_id; im Gegensatz zur default_instance_public_ip, die wir vom erhobenen Server erhalten, was bedeutet, dass wir diese Daten erst nach Anwendung erfahren.

Infrastrukturänderungen

Davor haben wir Entitäten von Grund auf neu erstellt. Versuchen wir nun, die vorhandenen zu ändern. Lassen Sie uns beispielsweise einen Parameter mit einem SSH-Schlüssel zu unseren Servern hinzufügen und sehen, was Terraform bietet.

Um den öffentlichen Schlüssel nicht in eine Datei einzufügen (zu lang und wir können uns ändern), ist es besser, file () zu verwenden, um den gesamten Inhalt einer beliebigen Datei in einen String zu ersetzen.

Jandex

Um in Yandex einen SSH-Schlüssel hinzuzufügen, benötigen Sie Metadaten. Sie müssen auch den Benutzer angeben, dem der Schlüssel Zugriff gewährt: user Ubuntu standardmäßig erstellt.

yandex/main.tf

… Ressource “yandex_compute_instance” “default” { name = “test-instance” … metadata = { ssh-keys = “ubuntu:${file(“~/.ssh/id_rsa.pub”)}” } } aws

In aws sind die Dinge etwas komplizierter – hier ist der Schlüssel eine separate Entitätwas bedeutet, dass wir eine weitere Ressource hinzufügen müssen: aws_key_pair und geben Sie ihn als Parameterwert für aws_instance an.

aws/main.tf

… Ressource “aws_instance” “default” { … key_name = aws_key_pair.test_key.key_name } resource “aws_key_pair” “test_key” { key_name = “test-key” public_key = “${file(“~/.ssh/ id_rsa.pub”)}” }Änderungen übernehmen

terraform plan zeigt uns den terrafrom Aktionsplan:

Jandex

Das Verhalten von Yandex ist etwas nicht offensichtlich. Tatsache ist, dass Terraform durch das Erstellen einer virtuellen Maschine ohne SSH-Schlüssel (was wir ursprünglich hatten) und das spätere Hinzufügen nicht anbietet, die Maschine neu zu erstellen. ~ direkt aktualisieren bedeutet, dass die Ressource aktualisiert wird, ohne neu erstellt zu werden.

Terraform hat die ausgewählten Anbieter verwendet, um den folgenden Ausführungsplan zu generieren. Ressourcenaktionen sind mit den folgenden Symbolen gekennzeichnet: ~ direkt aktualisieren Terraform führt die folgenden Aktionen aus: # yandex_compute_instance.default wird direkt aktualisiert ~ resource “yandex_compute_instance” “default” { id = “fhm3kp62eahete5kofke” ~ metadata = { + “ssh-keys” = <<-EOT ...

Nach dem Hinzufügen des Schlüssels ist die Verbindung darüber jedoch nicht verfügbar. Es ist notwendig, die Maschine neu zu erstellen, damit ssh kein Passwort, sondern nur einen Schlüssel benötigt. Dazu fügen wir hinzu Parameter Ersetzen Sie den Befehl: apply -replace=yandex_compute_instance.default. Wir weisen ausdrücklich darauf hin, was neu erstellt werden muss. Terraform wird dies anzeigen – wir erhalten eine neue Adresse, die in Änderungen an den Ausgaben zu sehen ist.

… # yandex_compute_instance.default wird ersetzt, wie angefordert -/+ Ressource “yandex_compute_instance” “default” { … Änderungen an Outputs: ~ default_instance_public_ip = “51.250.95.35” -> (bekannt nach apply) …

Nachdem wir den Server bestätigt und neu erstellt haben, können wir uns über ssh mit ihm verbinden.

yc-Recheninstanzliste +———————+—————+—— ———+———+————–+————-+ | Ausweis | Name | ZONE-ID | STATUS | EXTERNE IP | INTERNE IP | +———————-+———-+———- —–+———+——+———————+ | fhmpng88a49dihen141a | Testinstanz | de-central1-a | LAUFEND | 62.84.117.26 | 10.128.0.17 | +———————-+———-+———- —–+———+—–+————+ aws

In aws funktioniert alles wie erwartet – terraform selbst bietet an, den Server neu zu erstellen. Er weist auch darauf hin: was genau ihn dazu bringt. In diesem Fall ist es key_name – # Erzwingen der Ersetzung bedeutet, dass dieser Parameter der Grund für die Neuerstellung ist.

Terraform führt die folgenden Aktionen aus: # aws_instance.default muss ersetzt werden -/+ Ressource “aws_instance” “default” { … + key_name = “test-key” # erzwingt Ersetzung … # aws_key_pair.test_key wird erstellt + resource “aws_key_pair” “test_key” { … Änderungen an Outputs: ~ default_instance_public_ip = “16.16.64.183” -> (bekannt nach apply) …

Leider können wir uns nicht einfach mit einem neuen aws-Server verbinden – wir müssen ihn konfigurieren Sicherheitsgruppe (Wir werden dies in einem der folgenden Artikel tun). Aber der Server läuft und ein neuer Schlüssel wurde erstellt.

aws ec2 describe-instances \ –region eu-north-1 \ –query “Reservations[*].Instanzen[*]. {Instanz: Instanz-ID, Schlüsselname: Schlüsselname, Adresse: öffentliche IP-Adresse, Name: Tags[?Key==’Name’]|[0].Wert}” \ –Ausgabetabelle —————————————– ———————————- | DescribeInstances | +———– – –+———————+————+—- — ———–+ | Adresse | Instanz | Schlüsselname | Name | +————–+———– — —————-+—————-+————— –+ | 13.49.23.154 | i-075afc37d4775ccb0 | Testschlüssel | Testinstanz | +————–+————- —- —–+—————–+—————-+ aws ec2 beschreiben- Schlüsselpaare \ –region eu-north-1 \ –query=”Schlüsselpaare[*]. {KeyName:KeyName,CreateTime:CreateTime}” \ –output table ———————————– ————– | DescribeKeyPairs | +————————————+— -++ | CreateTime | KeyName | +——————— +—— ————+ | 2022-08-28T11:07:42+00:00 | Testtaste | +———- ——- ———–+——————+

Zerstöre alles mit Terraform Destroye

Fazit

Die Datenquelle ist ein unverzichtbares Werkzeug für den Aufbau einer komplexen Infrastruktur. Ausgaben scheinen an dieser Stelle etwas nutzlos zu sein, aber wir werden später eine andere Verwendung für diese Funktion sehen.

Bei Fragen bitte mailen v.valentinvolkov@gmail.com. Ich helfe gerne!

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *