Terraform-Vorlagen erstellen

In diesem Abschnitt erfahren Sie, wie Sie Terraform-Vorlagen erstellen, die klar strukturiert, wiederverwendbar und umfassend sind.

Eine Terraform-Vorlage besteht aus mindestens einer Terraform-Konfigurationsdatei, in der der Status angegeben ist, der für die IBM Cloud®-Ressourcen erreicht werden soll. Um erfolgreich mit Ihren Ressourcen arbeiten zu können, müssen Sie IBM als Ihren Cloud-Provider konfigurieren und Ressourcen zu Ihrer Terraform-Konfigurationsdatei hinzufügen. Optional können Sie Eingabevariablen verwenden, um die Ressourcen anzupassen.

Sie können die Terraform-Konfigurationsdatei mithilfe der Sprache HCL (HashiCorp Configuration Language) oder im JSON-Format schreiben. Sie können auch Terraform IBM Module(TIM) verwenden, die vorgefertigte Infrastrukturkomponenten bieten, die den Bereitstellungsprozess standardisieren und vereinfachen.

Vor der Erstellung Ihrer Terraform-Vorlage müssen Sie sicherstellen, dass Sie die IBM Cloud Schematics-Einschränkungen berücksichtigt haben.

Block provider konfigurieren

Geben Sie den Cloud-Provider an, den Sie im Block provider der Terraform-Konfigurationsdatei verwenden möchten. Der Block provider enthält alle Eingabevariablen, die für das Plug-in des IBM Cloud®-Providers für Terraform zum Bereitstellen der Ressourcen erforderlich sind.

IBM Cloud-API-Schlüssel

Der IBM Cloud API-Schlüssel ist für die Authentifizierung bei der IBM Cloud Plattform unerlässlich. Außerdem das IAM-Token und das IAM-Refresh-Token, die Schematics benötigt, um mit der API der Ressource zu arbeiten und die Ihnen gewährten Berechtigungen zu ermitteln. Wenn Sie die native Version von Terraform verwenden, müssen Sie den IBM Cloud-API-Schlüssel immer angeben. Bei Schematics wird das IAM-Token für alle IAM-fähigen Ressourcen abgerufen, einschließlich der IBM Cloud Kubernetes Service-Cluster und VPC-Infrastrukturressourcen. Bei Ressourcen der klassischen Infrastruktur wird der IAM-Token jedoch nicht abgerufen, und der API-Schlüssel muss im Block „ provider “ angegeben werden.

Unterschiedlicher IBM Cloud API-Schlüssel im provider Block

Wenn Sie einen anderen als den Ihrem IBM Cloud-Konto zugeordneten API-Schlüssel verwenden möchten, können Sie diesen API-Schlüssel im Block provider angeben. Wenn ein API-Schlüssel im Block provider konfiguriert ist, hat dieser Schlüssel vor dem API-Schlüssel Vorrang, der in IBM Cloud gespeichert ist.

IBM Cloud API-Schlüssel für eine Dienst-ID

Sie können für alle IAM-fähigen Services einen API-Schlüssel für eine Service-ID angeben, einschließlich der VPC-Infrastrukturressourcen. Für Ressourcen der klassischen Infrastruktur können Sie keine Service-ID verwenden.

Befolgen Sie die Anweisungen zur Konfiguration des provider Blocks.

  1. Wählen Sie aus, wie der Block provider konfiguriert werden soll.

    • Option 1: Erstellen Sie eine separate Datei „ provider.tf “. Die Informationen in dieser Datei werden von Terraform und IBM Cloud Schematics geladen und auf alle Terraform-Konfigurationsdateien angewendet, die sich im selben GitHub-Verzeichnis oder in derselben .tar-Bandarchivdatei befinden. Diese Methode ist sinnvoll, wenn Sie den Infrastrukturcode auf mehrere Dateien verteilt haben.
    • Option 2: Fügen Sie Ihrer Terraform-Konfigurationsdatei einen „ provider “-Block hinzu. Die Auswahl dieser Option kann vorteilhaft sein, wenn Sie den Provider zusammen mit den Variablen und Ressourcen in einer einzigen Terraform-Konfigurationsdatei angeben wollen.
  2. Prüfen Sie, welche Anmeldedaten und Informationen Sie im Block provider angeben müssen, um mit Ihren Ressourcen zu arbeiten. Schematics ruft automatisch Ihren IBM Cloud API-Schlüssel ab, so dass Sie diese Informationen nicht in Ihrem Block provider angeben müssen.

  3. Erstellen Sie die Datei provider.tf oder fügen Sie den folgenden Code zur Terraform-Konfigurationsdatei hinzu. Eine vollständige Liste der unterstützten Parameter, die Sie im Block provider festlegen können, finden Sie in der IBM Cloud-Providerreferenz.

    Beispiel für VPC-Infrastrukturressourcen

    provider "ibm" {
        generation = 1
        region = "<region_name>"
    }
    

    Beispiel für Ressourcen der klassischen Infrastruktur

    variable "iaas_classic_username" {
        type = "string"
    }
    variable "iaas_classic_api_key" {
        type = "string"
    }
    provider "ibm" {
        region = "<region_name>"
        iaas_classic_username = var.iaas_classic_username
        iaas_classic_api_key  = var.iaas_classic_api_key
    }
    

    Beispiel für alle Ressourcen unter IBM Cloud Kubernetes Service

    provider "ibm" {
    }
    

    Beispiel für alle anderen Ressourcen

    provider "ibm" {
        region = "<region_name>"
    }
    

Hinzufügen von Cloud-Ressourcen zum Block „ resource

Verwenden Sie „ resource “-Blöcke, um die Cloud-Ressourcen zu definieren, die Sie mit „ IBM Cloud Schematics “ verwalten möchten.

Zur Unterstützung eines Multi-Cloud-Konzepts arbeitet Terraform mit mehreren Cloud-Providern. Ein Cloud-Provider ist verantwortlich dafür, die Ressourcen, die Sie einrichten können, sowie zugehörige APIs und die Methoden zum Verfügbarmachen dieser Ressourcen in der Cloud zu kennen. Um diese Kenntnisse Benutzern zur Verfügung zu stellen, muss jeder unterstützte Cloud-Provider ein Befehlszeilen-Plug-in für Terraform bereitstellen, das Benutzer zum Arbeiten mit den Ressourcen verwenden können. Eine Übersicht über die Ressourcen, die Sie in IBM Cloud bereitstellen können, finden Sie in der IBM Cloud Provider Plug-in for Terraform-Referenz.

Beispiel für Infrastrukturcode zur Bereitstellung einer VPC

resource ibm_is_vpc "vpc" {
    name = "myvpc"
}

Referenzieren von Ressourcen in anderen Ressourcenblöcken

Überprüfen Sie die Optionen, über die Sie zum Referenzieren vorhandener Ressourcen in anderen Ressourcenblöcken der Terraform-Konfigurationsdatei verfügen.

Die Referenz zum Plug-in des IBM Cloud-Providers umfasst zwei Objekttypen: Datenquellen und Ressourcen. Sie können beide Objekte verwenden, um auf Ressourcen in anderen Ressourcenblöcken zu verweisen.

  • Ressourcen: Zum Erstellen einer Ressource verwenden Sie die Ressourcendefinition in der Referenz zum Plug-in des IBM Cloud-Providers. Eine Ressourcendefinition enthält die Syntax zur Konfiguration Ihrer Cloud-Ressourcen sowie eine Attributübersicht, in der die Eigenschaften aufgeführt sind, auf die Sie in anderen Ressourcenblöcken als Eingabeparameter verweisen können. Wenn Sie zum Beispiel eine VPC-Instanz erstellen, wird die VPC-ID nach der Erstellung verfügbar gemacht. Sie können die ID als Eingabeparameter verwenden, wenn Sie ein Teilnetz für Ihre VPC-Instanz erstellen. Verwenden Sie diese Option, wenn Sie mehrere Ressourcen in einer Terraform-Konfigurationsdatei kombinieren.

    Beispiel für einen Infrastrukturcode

    resource ibm_is_vpc "vpc" {
        name = "myvpc"
    }
    resource ibm_is_security_group "sg1" {
        name = "mysecuritygroup"
    vpc  = ibm_is_vpc.vpc.id
    }
    
  • Datenquellen: Sie können auch die Datenquellen aus der Referenz zum „ IBM Cloud “-Provider-Plug-in verwenden, um Informationen zu einer vorhandenen Cloud-Ressource abzurufen. Überprüfen Sie den Abschnitt Argumentationsreferenz in der Referenz zum Plug-in des IBM Cloud-Providers, um festzustellen, welche Eingabeparameter Sie angeben müssen, um eine vorhandene Ressource abzurufen. Suchen Sie anschließend im Abschnitt Attributreferenz eine Übersicht der Ihnen zur Verfügung stehenden Parameter, auf die Sie in den Blöcken des Typs resource verweisen können. Verwenden Sie diese Option, wenn Sie auf die Details einer Ressource zugreifen möchten, die in einer anderen Terraform-Konfigurationsdatei konfiguriert ist.

    Beispiel für einen Infrastrukturcode

    data ibm_is_image "ubuntu" {
        name = "ubuntu-18.04-amd64"
    }
    resource ibm_is_instance "vsi1" {
        name    = "$mysi"
    vpc     = ibm_is_vpc.vpc.id
    zone    = "us-south1"
    keys    = [data.ibm_is_ssh_key.ssh_key_id.id]
    image   = data.ibm_is_image.ubuntu.id
    profile = "cc1-2x4"
    primary_network_interface {
        subnet          = ibm_is_subnet.subnet1.id
        security_groups = [ibm_is_security_group.sg1.id]
    }
    }
    

Ressourcen in einem anderem Konto verwalten

Sie können Arbeitsbereiche im IBM Cloud Quellkonto verwenden, um Terraform-Aufträge zur Erstellung von Ressourcen in einem Zielkonto auszuführen. Um Ressourcen in einem Zielkonto bereitzustellen, müssen die Identität und die Zugriffsberechtigungen des Zielkontos angegeben werden. Dies kann durch die Verwendung der Identität eines Benutzers geschehen, der über Berechtigungen für das Zielkonto verfügt. Oder eine Service-ID mit Authentifizierung und entsprechender kontoübergreifender Autorisierung für das Zielkonto unter Verwendung eines API-Schlüssels.

Bei der Ausführung von Aufträgen über die Benutzeroberfläche ohne Übergabe von API-Schlüsseln wird für die Ausführung von Vorgängen die Identität des angemeldeten Benutzers angenommen.

Blöcke des Typs variable zum Anpassen von Ressourcen verwenden

Sie können variable-Blöcke verwenden, um eine Vorlage für Ihren Infrastrukturcode zu erstellen. Anstatt beispielsweise mehrere Terraform-Konfigurationsdateien für eine Ressource zu erstellen, die Sie in mehreren Rechenzentren bereitstellen möchten. Sie verwenden einfach dieselbe Konfiguration mit einer Eingangsvariablen, um das Rechenzentrum zu definieren.

Speichern der Variablen

Sie können die Variablen innerhalb derselben Terraform-Konfigurationsdatei deklarieren, in der Sie die Ressourcen angeben, die Sie bereitstellen möchten; alternativ können Sie eine separate variables.tf-Datei erstellen, die alle Variablendeklarationen enthält. Wenn Sie einen Arbeitsbereich erstellen, werden von IBM Cloud Schematics automatisch die Terraform-Konfigurationsdateien analysiert und nach den Variablendeklarationen gesucht.

Variable deklarieren

Wenn Sie eine Eingabevariable deklarieren, müssen Sie einen Namen für Ihre Variable und den Datentyp entsprechend der Terraform-Version angeben. Sie können optional einen Standardwert für Ihre Variable angeben. Wenn Eingabevariablen in „ Schematics “ importiert werden und ein Standardwert angegeben ist, können Sie den Standardwert überschreiben. \n IBM Cloud Schematics akzeptiert die Werte als Zeichenfolge für primitive Typen wie bool, number, string sowie im Format HCL für komplexe Variablen. - „ Terraform v1.5 “ unterstützt die Datentypen String, Liste, Map, „ bool “, Zahl sowie komplexe Datentypen wie Liste(Typ), Map(Typ), Objekt( {attribute name=type,.} ) und Menge(Typ) sowie Tupel( [Typ] ).

Begrenzende Eingangsgröße

Ja. Wenn Sie Eingabevariablen in Ihrer Terraform-Konfigurationsdatei definieren, denken Sie daran, dass der von Ihnen für diesen Variablen eingegeben Wert bis zu 2049 Zeichen lang sein kann. Wenn für Ihre Eingabevariable ein Wert erforderlich ist, der über diesem Grenzwert liegt, wird der Wert nach 2049 Zeichen abgeschnitten.

Beispiel für eine Variablendeklaration ohne Standardwert

variable "datacenter" {
    type        = "string"
    description = "The data center that you want to deploy your Kubernetes cluster in."
}

Beispiel für eine Variablendeklaration mit einem Standardwert

variable "datacenter" {
    type        = "string"
    description = "The data center that you want to deploy your Kubernetes cluster in."
    default = "dal10"
}

Variablen referenzieren

Sie können den Wert der Variablen mithilfe der Syntax "${var.<variable_name>}" in anderen Blöcken Ihrer Terraform-Konfigurationsdateien referenzieren.

Beispiel für den Verweis auf eine „ datacenter “-Variable

resource ibm_container_cluster "test_cluster" {
    name         = "test"
    datacenter   = var.datacenter
}

Nutzung von Terraform IBM Modulen für eine schnellere Entwicklung

Optional können Sie Terraform IBM Module(TIM) verwenden, um Ihre Vorlagen zu erstellen. Es hilft beim schnellen Aufbau komplexer Infrastrukturen, vereinfacht Ressourcenabhängigkeiten, wendet IBM Cloud Best Practices an und wird durch Beiträge der IBM Cloud Community weiterentwickelt.

Beispiel: Verwendung des VPC-Moduls von TIM

module "vpc" {
  source  = "terraform-ibm-modules/vpc/ibm"
  version = "1.1.0"
  
  vpc_name                    = "my-production-vpc"
  resource_group_id           = "Default"
  classic_access              = false
  default_address_prefix      = "auto"
  default_network_acl_name    = "my-default-acl"
  default_security_group_name = "my-default-sg"
  default_routing_table_name  = "my-default-rt"
}

Erkunden Sie die verfügbaren Module:

Werte für IBM Cloud Schematics für die deklarierten Variablen bereitstellen

Sie können die Werte für die Variablen, die in der Vorlage deklariert sind, nach der Erstellung des Arbeitsbereichs für die IBM Cloud Schematics zur Verwendung in Terraform-Aktionen bereitstellen.

  • Für „ UI “ können Sie die Werte auf der Seite „ IBM Cloud “ > „ Schematics “ > „Workspace“ > „Einstellungen“ angeben. Im Feld value ist der Wert im HCL-Format enthalten, wie in der Datei .tfvars angegeben.

  • Unter „ CLI “ können Sie die Werte für den Datentyp „Complex“ anlegen, anzeigen oder aktualisieren. Dann muss das Feld „ value “ eine mit Escape-Zeichen versehene Zeichenfolge für den Variablenspeicher enthalten, wie im Beispiel gezeigt.

  • Bei „ API “ wird im Feld „ template_data “ die Adresse „ die Werte anlegen oder aktualisieren “ angezeigt > variablestore. Das Feld „ value “ enthält den Wert im Format „ HCL “, wie er in der Datei „ .tfvars “ angegeben ist. Es handelt sich immer um eine JSON-Zeichenfolge für jeden Typ der Variablen.

    Beispiel

    "variablestore": [
                {
                    "value": "[\n    {\n      internal = 800\n      external = 83009\n      protocol = \"tcp\"\n    }\n  ]",
                    "description": "",
                    "name": "docker_ports",
                    "type": "list(object({\n    internal = number\n    external = number\n    protocol = string\n  }))"
                },
                {
                    "name": "worker_pool_labels",
                    "type": "map(string)",
                    "value": "{\n        \"label-name1\": \"label-value1\",\n        \"label-name2\": \"label-value2\"\n}"
                },
                {
                    "name": "docker_ports",
                    "type": "list(object({\n    internal = number\n    external = number\n    protocol = string\n  }))",
                    "value": "[\n    {\n      internal = 800\n      external = 83009\n      protocol = \"tcp\"\n    }\n  ]",
                    "description": ""
                }
        ]
    

Kann ich anzeigen, wie komplexe Variablen in einer Datei deklariert werden?

Ja, wenn Sie den Wert deklarieren und den Variablen zuordnen, können Sie die QuickInfo in der Benutzerschnittstelle anzeigen. Die Tabelle enthält einige Beispiele für den komplexen Datentyp, der im Variablenspeicher deklariert werden kann.

Komplexe Variablentypen mit Beispiel
Typ Beispiel
number 4.56
string Beispielwert
bool Falsch
map(string) {key1 = "value1", key2 = "value2"}
set(string) [„Hallo“, „er“]
map(number) {internal = 8080, external = 2020}
list(string) [„us-south“, „eu-gb“]
list ["Wert", 30]
list(list(string)) Siehe Liste der String-Beispiele.
list(object({internal = number external = number protocol = string})) Siehe Liste der Objektbeispiele.

Beispiel für eine Liste von Strings

[
        "test", "env:prod", "env:agent:test"
]

Beispiel für eine Liste von Objekten

[
    {
        internal = 8300
        external = 8300
        protocol = "tcp"
    },
    {
        internal = 8301
        external = 8301
        protocol = "ldp"
    }
]

Eigene Terraform-Vorlagen speichern

Die Terraform-Konfigurationsdateien enthalten Infrastrukturcode, den Sie als regulären Code behandeln müssen. Um die Zusammenarbeit sowie die Quell- und Versionskontrolle zu unterstützen, speichern Sie Ihre Dateien in einem Repository unter GitHub oder GitLab. Mithilfe der Versionssteuerung können Sie eine Version auf eine frühere zurücksetzen, Änderungen überprüfen und Code mit mehreren Teams gemeinsam nutzen. Wenn Sie Ihre Dateien nicht unter GitHub, speichern möchten, stellen Sie Ihre Vorlage stattdessen bereit, indem Sie eine Bandarchivdatei oder eine Datei unter .tar von Ihrem lokalen Rechner hochladen. Wenn Sie einen Klon erstellen möchten, sehen Sie sich die zulässigen und gesperrten Dateiendungen für das Klonen an.

Die Verzeichnisstruktur der Terraform-Vorlage im GitHub-Repository wird in der Tabelle mit der letzten Aktualisierungszeit aufgelistet.

Verzeichnisstruktur der Terraform-Vorlage
Datei Beschreibung
README.md README.md erstellen
main.tf main.tf erstellen
output.tf output.tf erstellen
provider.tf provider.tf erstellen
variables.tf variables.tf erstellen

Beispiele für Terraform-Lösungen

Verschiedene Lösungen zeigen die Stärke von IBM Cloud® Schematics- und IBM Cloud®-Services bei gemeinsamer Verwendung. Diese Lösungen verwenden eine einfache Terraform-Vorlage oder ein Modul zum Einrichten der Infrastruktur. Auch wenn jede Lösung durch die Linse eines bestimmten Anwendungsfalls dargestellt wird, sind diese Infrastrukturen typisch für verschiedene Branchen.

Verwenden Sie die veröffentlichten Terraform-Lösungsvorlagen mit IBM Cloud Schematics, um Ihre Infrastruktur zu erstellen, die Ressourcen zu verwalten und leistungsfähige Tools zum Sichern, Verwalten und Überwachen Ihres Arbeitsbereichs und Ihrer Aktionen einzusetzen.