In dieser Anleitung wird erläutert, wie Sie mit der gängigen GitOps-Methode die Infrastruktur als Code in Terraform und Cloud Build verwalten. Der Begriff GitOps wurde zuerst von Weaveworks geprägt und sein Schlüsselkonzept ist die Verwendung eines Git-Repositorys zum Speichern des gewünschten Umgebungsstatus. Terraform ist ein Open-Source-Tool von HashiCorp, mit dem die Cloud-Infrastruktur mithilfe von Code vorhersehbar erstellt, geändert und verbessert werden kann. In dieser Anleitung verwenden Sie Cloud Build, einen Google Cloud Dienst für die kontinuierliche Einbindung, um Terraform-Manifestdateien automatisch auf Ihre Umgebung anzuwenden.
Die Anleitung richtet sich an Entwickler und Operatoren, die nach einer eleganten Strategie suchen, um vorhersehbare Änderungen an der Infrastruktur vorzunehmen. In diesem Artikel wird davon ausgegangen, dass Sie mit Google Cloudund Linux vertraut sind.
Die State of DevOps-Berichte haben Faktoren aufgezeigt, die die Leistung bei der Softwarebereitstellung beeinflussen. Diese Anleitung hilft Ihnen bei den folgenden Faktoren:
Architektur
In dieser Anleitung werden GitOps-Methoden zum Verwalten von Terraform-Ausführungen angewendet. Dabei werden die Secure Source Manager-Branches dev
und prod
zur Darstellung der tatsächlichen Umgebungen verwendet. Diese Umgebungen werden durch die VPC-Netzwerke (Virtual Private Cloud) dev
bzw. prod
in einemGoogle Cloud -Projekt definiert.
Der Prozess beginnt, wenn Sie Terraform-Code an den dev
- oder prod
-Branch per Push übertragen. In diesem Szenario wird Cloud Build ausgelöst und wendet anschließend Terraform-Manifeste an, um den gewünschten Status in der jeweiligen Umgebung zu erreichen.
Wenn Sie Terraform-Code dagegen in einen anderen Branch per Push übertragen, z. B. in einen Feature-Branch, wird mit Cloud Build terraform plan
ausgeführt. Es wird aber nichts auf eine Umgebung angewendet.
Im Idealfall müssen Entwickler oder Operatoren Infrastrukturvorschläge an Entwicklungs- oder Feature-Branches richten und diese dann über Pull-Anfragen senden. So können Sie mögliche Änderungen mit Mitarbeitern diskutieren und überprüfen und Folge-Commits hinzufügen, bevor die Änderungen im Basis-Branch zusammengeführt werden.
Wenn es keine Bedenken gibt, müssen Sie zuerst die Änderungen im dev
-Branch zusammenführen. Diese Zusammenführung löst eine Infrastrukturbereitstellung in der dev
-Umgebung aus, sodass Sie diese Umgebung testen können. Nachdem Sie die Bereitstellung zufriedenstellend getestet haben, müssen Sie den dev
-Branch mit dem prod
-Branch zusammenführen, um die Installation der Infrastruktur in der Produktionsumgebung auszulösen.
Ziele
- Secure Source Manager-Instanz und -Repository einrichten
- Terraform so konfigurieren, dass der Status in einem Cloud Storage-Bucket gespeichert wird
- Berechtigungen für Cloud Build-Dienstkonto erteilen
- Verbinden Sie Cloud Build mit Ihrem Secure Source Manager-Repository.
- Umgebungskonfiguration in einem Feature-Branch ändern
- Änderungen an der Entwicklungsumgebung übernehmen
- Änderungen an der Produktionsumgebung übernehmen
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.
Hinweise
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
- Rufen Sie in Cloud Shell die ID des soeben ausgewählten Projekts ab:
Wenn dieser Befehl keine Projekt-ID zurückgibt, konfigurieren Sie Cloud Shell so, dass Ihr Projekt verwendet wird. Ersetzen Siegcloud config get-value project
PROJECT_ID
durch Ihre Projekt-ID.gcloud config set project PROJECT_ID
- Aktivieren Sie die erforderlichen APIs:
Dieser Schritt kann einige Minuten dauern.gcloud services enable cloudbuild.googleapis.com compute.googleapis.com securesourcemanager.googleapis.com
- Wenn Sie Git noch nie über Cloud Shell verwendet haben, konfigurieren Sie es mit Ihrem Namen und Ihrer E-Mail-Adresse:
Git verwendet diese Informationen, um Sie als Ersteller der Commits zu identifizieren, die Sie in Cloud Shell erstellen:git config --global user.email "YOUR_EMAIL_ADDRESS" git config --global user.name "YOUR_NAME"
- Der
dev
-Branch enthält die neuesten Änderungen, die auf die Entwicklungsumgebung angewendet werden. - Der
prod
-Branch enthält die neuesten Änderungen, die auf die Produktionsumgebung angewendet werden. - Funktionszweige wie
feature_x
werden verwendet, um Änderungen vorzunehmen, bevor sie in die Zweigedev
oderprod
übertragen werden. - Leeres Secure Source Manager-Repository erstellen – das Repository darf nicht initialisiert werden.
Fügen Sie den Authentifizierungshelfer für Secure Source Manager zu Ihrem globalen
git config
hinzu, indem Sie den folgenden Befehl ausführen:git config --global credential.'https://*.*.sourcemanager.dev'.helper gcloud.sh
Der Authentifizierungs-Helper verwendet die gcloud CLI, um IhreGoogle Cloud -Anmeldedaten abzurufen, wenn Sie Git-Befehle mit Secure Source Manager verwenden.
Führen Sie den folgenden gcloud CLI-Befehl aus, um sich nach der Ersteinrichtung der Anmeldedaten noch einmal zu authentifizieren:
gcloud auth login
Klonen Sie das Repository solutions-terraform-cloudbuild-gitops in Ihre lokale Shell oder Arbeitsumgebung:
git clone https://github.com/GoogleCloudPlatform/solutions-terraform-cloudbuild-gitops.git
Fügen Sie Ihr Secure Source Manager-Repository als Upstream-Repository hinzu.
git remote add google HTTPS_REPO_URL
Dabei ist
HTTPS_REP_URL
die HTTPS-URL für Ihr Secure Source Manager-Repository. Sie finden die URL oben auf der Repository-Seite in der Secure Source Manager-Weboberfläche.Erstellen Sie den
dev
-Branch und wechseln Sie zu ihm.git checkout dev
Übertragen Sie das geklonte Repository mit dem folgenden Befehl per Push in Ihr Repository:
git push -u google --all
Wiederholen Sie die beiden vorherigen Schritte für Ihren
prod
-Branch.Der
environments/
-Ordner enthält Unterordner, die Umgebungen wiedev
undprod
darstellen. Diese bieten eine logische Trennung zwischen Arbeitslasten in verschiedenen Reife-, Entwicklungs- bzw. Produktionsphasen. Obwohl es sich empfiehlt, diese Umgebungen möglichst ähnlich zu gestalten, verfügt jeder Unterordner über eine eigene Terraform-Konfiguration, um sicherzustellen, dass sie bei Bedarf eindeutige Einstellungen haben.Der Ordner
modules/
enthält Inline-Terraform-Module. Diese Module stellen logische Gruppierungen verwandter Ressourcen dar und werden zur gemeinsamen Nutzung von Code in verschiedenen Umgebungen verwendet.Die Datei
cloudbuild.yaml
ist eine Build-Konfigurationsdatei, die Anweisungen für Cloud Build enthält, z. B. zum Ausführen von Aufgaben basierend auf einer Reihe von Schritten. Diese Datei gibt eine bedingte Ausführung abhängig von dem Branch an, von dem Cloud Build den Code abruft. Beispiel:Für die
dev
- undprod
-Branches werden folgende Schritte ausgeführt:terraform init
terraform plan
terraform apply
Für alle anderen Branches werden folgende Schritte ausgeführt:
terraform init
für alleenvironments
-Unterordnerterraform plan
für alleenvironments
-Unterordner
- Fügen Sie einen Schritt zum Klonen Ihres Repositorys hinzu.
- Fügen Sie einen Schritt hinzu, um den Zweignamen abzurufen und einer Variablen zuzuweisen.
Wechseln Sie zum Branch
dev
:git checkout dev
Öffnen Sie die Datei
cloudbuild.yaml
und ersetzen Sie den Inhalt durch Folgendes:# Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. steps: - id: 'clone repository' name: 'gcr.io/cloud-builders/git' args: - clone - '${_REPO_URL}' - . - id: 'branch name' name: gcr.io/cloud-builders/git entrypoint: 'sh' args: - '-c' - | branch=$(basename "$_REF") git checkout ${branch} echo "***********************" git branch --show-current echo "***********************" - id: 'tf init' name: 'hashicorp/terraform:1.0.0' entrypoint: 'sh' args: - '-c' - | branch=$(basename "$_REF") if [ -d "environments/${branch}/" ]; then cd environments/${branch} terraform init else for dir in environments/*/ do cd ${dir} env=${dir%*/} env=${env#*/} echo "" echo "*************** TERRAFORM INIT ******************" echo "******* At environment: ${env} ********" echo "*************************************************" terraform init || exit 1 cd ../../ done fi - id: 'tf plan' name: 'hashicorp/terraform:1.0.0' entrypoint: 'sh' args: - '-c' - | branch=$(basename "$_REF") if [ -d "environments/${branch}/" ]; then cd environments/${branch} terraform plan else for dir in environments/*/ do cd ${dir} env=${dir%*/} env=${env#*/} echo "" echo "*************** TERRAFOM PLAN ******************" echo "******* At environment: ${env} ********" echo "*************************************************" terraform plan || exit 1 cd ../../ done fi - id: 'tf apply' name: 'hashicorp/terraform:1.0.0' entrypoint: 'sh' args: - '-c' - | branch=$(basename "$_REF") if [ -d "environments/${branch}/" ]; then cd environments/${branch} terraform apply -auto-approve else echo "***************************** SKIPPING APPLYING *******************************" echo "Branch '${branch}' does not represent an official environment." echo "*******************************************************************************" fi
Prüfen Sie, ob die Datei geändert wurde.
git status
Führen Sie einen Commit durch und übertragen Sie die Änderungen:
git add --all git commit -m "Modify build config file." git push google dev
Öffnen Sie eine Pull-Anfrage, um Ihre Änderungen schnell in den
prod
-Branch zu übertragen.- Rufen Sie in der Secure Source Manager-Weboberfläche Ihr Repository auf.
- Klicken Sie auf den Tab Pull requests (Pull-Anfragen).
- Klicken Sie auf New pull request (Neue Pull-Anfrage).
- Wählen Sie im Feld Zusammenführen in den Zweig
prod
aus. - Wählen Sie im Feld pull from: den Zweig
dev
aus. - Sehen Sie sich die Änderungen an und klicken Sie dann auf New pull request (Neuer Pull-Request).
- Klicken Sie auf Pull-Anfrage erstellen.
- Klicken Sie auf Merge pull request (Pull-Anfrage zusammenführen).
Klicken Sie noch einmal auf Merge pull request (Pull-Anfrage zusammenführen).
Die Änderungen werden in Ihren
prod
-Zweig zusammengeführt.
Erstellen Sie in Cloud Shell den Cloud Storage-Bucket:
PROJECT_ID=$(gcloud config get-value project) gcloud storage buckets create gs://${PROJECT_ID}-tfstate
Aktivieren Sie die Objektversionsverwaltung, um den Verlauf Ihrer Bereitstellungen zu speichern:
gcloud storage buckets update gs://${PROJECT_ID}-tfstate --versioning
Durch das Aktivieren der Objektversionsverwaltung werden die Speicherkosten erhöht. Dies können Sie umgehen, indem Sie die Verwaltung des Objektlebenszyklus so konfigurieren, dass frühere Statusversionen gelöscht werden.
Erstellen Sie einen neuen
cloud-storage-bucket
-Branch, in dem Sie die Änderungen vornehmen können:cd ~/solutions-terraform-cloudbuild-gitops git checkout -b cloud-storage-bucket
Ersetzen Sie den Platzhalter
PROJECT_ID
durch die Projekt-ID in den Dateienterraform.tfvars
undbackend.tf
:sed -i s/PROJECT_ID/$PROJECT_ID/g environments/*/terraform.tfvars sed -i s/PROJECT_ID/$PROJECT_ID/g environments/*/backend.tf
Unter OS X oder macOS müssen Sie möglicherweise nach
sed -i
so zwei Anführungszeichen hinzufügen (""
):sed -i "" s/PROJECT_ID/$PROJECT_ID/g environments/*/terraform.tfvars sed -i "" s/PROJECT_ID/$PROJECT_ID/g environments/*/backend.tf
Prüfen Sie, ob alle Dateien aktualisiert wurden:
git status
Sie erhalten folgende Ausgabe:
On branch cloud-storage-bucket Changes not staged for commit: (use "git add
..." to update what will be committed) (use "git restore ..." to discard changes in working directory) modified: environments/dev/backend.tf modified: environments/dev/terraform.tfvars modified: environments/prod/backend.tf modified: environments/prod/terraform.tfvars no changes added to commit (use "git add" and/or "git commit -a") Führen Sie einen Commit durch und übertragen Sie die Änderungen:
git add --all git commit -m "Update project IDs and buckets" git push google -u cloud-storage-bucket
Der neue Branch
cloud-storage-bucket
wird in Ihr Repository übertragen.Führen Sie Ihre
cloud-storage-bucket
-Änderungen in Ihredev
- undprod
-Zweige zusammen, indem Sie für jeden Zweig Merge-Anfragen öffnen und senden.Die E-Mail-Adresse des Cloud Build-Dienstkontos finden Sie auf der Cloud Build-Seite unter Einstellungen.
Kopieren Sie den Wert der E-Mail-Adresse des Dienstkontos.
Gewähren Sie den erforderlichen Zugriff auf Ihr Cloud Build-Dienstkonto:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:CLOUDBUILD_SA --role roles/editor
Ersetzen Sie Folgendes:
- PROJECT_ID durch Ihre Projekt-ID,
- CLOUDBUILD_SA durch die E-Mail-Adresse des Cloud Build-Dienstkontos.
Öffnen Sie die Seite Trigger in der Google Cloud Console.
Wählen Sie oben auf der Seite im Drop-down-Menü zur Projektauswahl Ihr Projekt aus.
Klicken Sie auf Öffnen.
Klicken Sie auf Trigger erstellen.
Geben Sie die folgenden Triggereinstellungen ein:
Name:
trigger-on-push
Region: Wählen Sie die Region für Ihren Trigger aus. Wenn in der mit Ihrem Trigger verknüpften Build-Konfigurationsdatei ein privater Pool angegeben ist, muss die für den Trigger ausgewählte Region mit der Region des privaten Pools übereinstimmen.
Wenn Sie
global
als Region auswählen, verwendet Cloud Build die in Ihrer Build-Konfigurationsdatei angegebene Region, um den Build auszuführen. Dies kann entweder die Region des privaten Pools sein, wenn Sie einen privaten Pool in Ihrer Build-Konfigurationsdatei angeben, oder der globale Standardpool, wenn Sie keinen privaten Pool angeben.Beschreibung (optional): Geben Sie eine Beschreibung für den Trigger ein.
Ereignis: Wählen Sie Webhook-Ereignis als das Repository-Ereignis aus, das den Trigger auslösen soll.
Wenn Secret Manager nicht installiert ist, werden Sie aufgefordert, Secret Manager zu aktivieren.
Webhook-URL: Wählen Sie eine der folgenden Optionen aus:
- Wählen Sie Neues Secret verwenden aus, wenn Sie ein neues Secret mit Cloud Build generieren möchten. Klicken Sie auf Secret erstellen, um Ihr Secret zu erstellen.
- Vorhandenes Secret verwenden oder eigenes erstellen, wenn Sie ein vorhandenes Secret verwenden möchten. Geben Sie das Secret und die Version in die Drop-down-Auswahlfelder ein.
Wenn Sie ein vorhandenes Secret verwenden, müssen Sie dem Cloud Build-Dienst-Agenten
service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com
möglicherweise die Rolle Zugriffsperson für Secret Manager-Secret manuell zuweisen.Weitere Informationen finden Sie unter Cloud Build-Dienst-Agent eine Rolle zuweisen.
Klicken Sie auf URL-Vorschau anzeigen und notieren Sie sich die URL. Sie benötigen diese URL, um den Webhook in Secure Source Manager einzurichten.
- Konfiguration: Wählen Sie für Typ die Option Cloud Build-Konfigurationsdatei (YAML oder JSON) und für Speicherort die Option Inline aus.
Klicken Sie auf die Schaltfläche Editor öffnen, um die Build-Konfigurationsdatei zu bearbeiten.
Kopieren Sie den Inhalt Ihrer Datei
cloudbuild.yaml
in den Editor.Wie bereits erwähnt, weist diese Pipeline abhängig vom abgerufenen Branch unterschiedliches Verhalten auf. Der Build prüft, ob die Variable
${branch}
mit einem Umgebungsordner übereinstimmt. Wenn ja, führt Cloud Build denterraform plan
für diese Umgebung aus. Andernfalls führt Cloud Buildterraform plan
für alle Umgebungen aus, damit die vorgeschlagene Änderung auf jeden Fall für alle Umgebungen geeignet ist. Wenn einer dieser Pläne nicht ausgeführt werden kann, schlägt der Build fehl.- id: 'tf plan' name: 'hashicorp/terraform:1.0.0' entrypoint: 'sh' args: - '-c' - | branch=$(basename "$_REF") if [ -d "environments/${branch}/" ]; then cd environments/${branch} terraform plan else for dir in environments/*/ do cd ${dir} env=${dir%*/} env=${env#*/} echo "" echo "*************** TERRAFOM PLAN ******************" echo "******* At environment: ${env} ********" echo "*************************************************" terraform plan || exit 1 cd ../../ done fi
Der Befehl
terraform apply
wird für Umgebungs-Branches ausgeführt. In allen anderen Fällen wird er jedoch vollständig ignoriert.Klicken Sie auf + Variable hinzufügen und fügen Sie die folgenden zwei Substitutionsvariablen hinzu:
- Variable:
_REPO_URL
, Wert:$(body.repository.clone_url)
- Variable:
_REF
, Wert:$(body.ref)
- Variable:
Klicken Sie auf Erstellen.
- Rufen Sie in der Secure Source Manager-Weboberfläche das Repository auf, für das Sie einen Webhook erstellen möchten.
- Klicken Sie auf Einstellungen.
- Klicken Sie auf Webhooks und dann auf Webhook hinzufügen.
Geben Sie im Feld Hook-ID eine ID für den Webhook ein.
Geben Sie im Feld Target URL (Ziel-URL) die Webhook-URL ein, die Sie beim Einrichten eines Webhook-Triggers in Cloud Build kopiert haben.
So finden Sie die Webhook-URL:
Öffnen Sie die Seite Trigger in der Google Cloud Console.
Klicken Sie auf den Trigger.
Klicken Sie im Bereich Webhook URL (Webhook-URL) auf Show URL preview (URL-Vorschau anzeigen) und kopieren Sie die URL.
Die Webhook-URL enthält die Schlüssel- und Secret-Werte, die Sie beim Erstellen des Cloud Build-Triggers eingegeben haben. Um zu verhindern, dass diese Werte weitergegeben werden, entfernen Sie sie vom Ende der Ziel-URL und kopieren Sie sie in das Feld Sensibler Abfragestring.
Wenn Sie Ihren Schlüssel und Ihr Secret in Ihrer Webhook-URL finden möchten, suchen Sie nach dem Text, der mit
key=
beginnt.Beispiel: Bei der folgenden URL:
https://cloudbuild.googleapis.com/v1/projects/my-project/triggers/test-trigger:webhook?key=eitIfKhYnv0LrkdsyHqIros8fbsheKRIslfsdngf&secret=Hello%20Secret%20Manager
Kopieren Sie den Teil ab dem Fragezeichen
?key=...
aus dem Feld Ziel-URL und entfernen Sie ihn. Entfernen Sie dann das ursprüngliche Fragezeichen und verschieben Sie den verbleibenden Teilkey=...
in das Feld Sensibler Abfragestring.Klicken Sie auf Add webhook (Webhook hinzufügen).
Der Webhook wird auf der Seite Webhooks angezeigt.
Prüfen Sie, ob Sie sich im
dev
-Branch befinden:cd ~/solutions-terraform-cloudbuild-gitops git checkout dev
Laden Sie die letzten Änderungen herunter:
git pull
Erstellen Sie einen
bug-fix
-Zweig, um die Umgebungskonfiguration zu ändern.git checkout -b bug-fix
Öffnen Sie
modules/firewall/main.tf
zum Bearbeiten.Korrigieren Sie in Zeile 30 den Tippfehler
"http-server2"
im Feldtarget_tags
.Der Wert muss
"http-server"
betragen.Führen Sie einen Commit durch und übertragen Sie die Änderungen:
git add --all git commit -m "Fix typo." git push google -u bug-fix
Öffnen Sie in der Google Cloud Console die Cloud Build-Seite Verlauf:
Klicken Sie auf Build, um weitere Informationen aufzurufen, einschließlich der Ausgabe von
terraform plan
.- Rufen Sie in der Secure Source Manager-Weboberfläche Ihr Repository auf.
- Klicken Sie auf New pull request (Neue Pull-Anfrage).
- Wählen Sie im Feld Zusammenführen in: Ihren
dev
-Zweig aus. - Wählen Sie im Feld pull from: (ziehen von:) den
bug-fix
-Zweig aus. - Klicken Sie auf New pull request (Neue Pull-Anfrage).
- Klicken Sie auf Pull-Anfrage erstellen.
- Klicken Sie auf Pull-Anfrage zusammenführen und dann noch einmal auf Pull-Anfrage zusammenführen.
Prüfen Sie, ob ein neuer Cloud Build ausgelöst wurde:
Öffnen Sie den Build und überprüfen Sie die Protokolle.
Wenn der Build abgeschlossen ist, sehen Sie in etwa Folgendes:
Step #3 - "tf apply": external_ip = EXTERNAL_IP_VALUE Step #3 - "tf apply": firewall_rule = dev-allow-http Step #3 - "tf apply": instance_name = dev-apache2-instance Step #3 - "tf apply": network = dev Step #3 - "tf apply": subnet = dev-subnet-01
Kopieren Sie
EXTERNAL_IP_VALUE
und öffnen Sie die Adresse in einem Webbrowser.http://EXTERNAL_IP_VALUE
Bei dieser Bereitstellung kann es einige Sekunden dauern, die VM zu starten und die Firewallregel zu übernehmen. Schließlich wird Umgebung: dev im Webbrowser angezeigt.
Rufen Sie Cloud Storage auf:
Wählen Sie Ihr Projekt aus.
Klicken Sie auf den Bucket für den Terraform-Zustandsspeicher. Der Bucket-Name sieht so aus:
PROJECT_ID-tfstate
Klicken Sie auf env und dann auf dev, um die Terraform-Zustandsdatei aufzurufen.
- Rufen Sie in der Secure Source Manager-Weboberfläche Ihr Repository auf.
- Klicken Sie auf den Tab Pull requests (Pull-Anfragen).
- Klicken Sie auf New pull request (Neue Pull-Anfrage).
- Wählen Sie für merge into: (zusammenführen in:) den
prod
-Zweig Ihres Repositorys aus. - Wählen Sie für pull from (ziehen von) den
dev
-Zweig Ihres Repositorys aus. - Klicken Sie auf New pull request (Neue Pull-Anfrage).
- Geben Sie für title (Titel) einen Titel ein, z. B. „Promoting networking changes“. Klicken Sie dann auf Create pull request (Pull-Anfrage erstellen).
Prüfen Sie die vorgeschlagenen Änderungen und klicken Sie dann auf Merge pull request (Pull-Anfrage zusammenführen).
Das Datum und die Repository-URL werden dem Kommentarfeld hinzugefügt.
Klicken Sie zur Bestätigung noch einmal auf Pull-Anfrage zusammenführen.
Öffnen Sie in der Google Cloud Console die Seite Build-Verlauf, um zu sehen, wie Ihre Änderungen in der Produktionsumgebung angewendet werden:
Warten Sie, bis der Build fertig ist, und überprüfen Sie dann die Protokolle.
Am Ende der Logs sehen Sie in etwa Folgendes
Step #3 - "tf apply": external_ip = EXTERNAL_IP_VALUE Step #3 - "tf apply": firewall_rule = prod-allow-http Step #3 - "tf apply": instance_name = prod-apache2-instance Step #3 - "tf apply": network = prod Step #3 - "tf apply": subnet = prod-subnet-01
Kopieren Sie
EXTERNAL_IP_VALUE
und öffnen Sie die Adresse in einem Webbrowser.http://EXTERNAL_IP_VALUE
Bei dieser Bereitstellung kann es einige Sekunden dauern, die VM zu starten und die Firewallregel zu übernehmen. Schließlich wird Umgebung: prod im Webbrowser angezeigt.
Rufen Sie Cloud Storage auf:
Wählen Sie Ihr Projekt aus.
Klicken Sie auf den Bucket für den Terraform-Zustandsspeicher. Der Bucket-Name sieht so aus:
PROJECT_ID-tfstate
Klicken Sie auf env und dann auf prod, um die Terraform-Zustandsdatei aufzurufen.
- Bereitstellungen für separate Anwendungsfälle hinzufügen
- Zusätzliche Umgebungen erstellen, um Ihren Anforderungen gerecht zu werden
- Ein Projekt pro Umgebung anstelle einer VPC pro Umgebung verwenden
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
- Mit den Vorlagen für das Cloud Foundation Toolkit können Sie inGoogle Cloudschnell eine für Unternehmen geeignete wiederholbare Grundlage erstellen.
- Video Repeatable Google Cloud Environments at Scale With Cloud Build Infra-As-Code Pipelines von der Next'19 über den in dieser Anleitung beschriebenen GitOps-Workflow
- Anleitung Kontinuierliche Bereitstellung gemäß GitOps mit Cloud Build
- Erweiterte Cloud Build-Features: Reihenfolge von Build-Schritten konfigurieren, Artefakte erstellen, testen und bereitstellen, Benutzerdefinierte Build-Schritte erstellen
- Blog Ensuring scale and compliance of your Terraform Deployment with Cloud Build lesen
- Ressourcen zu DevOps
- Mehr über die DevOps-Ressourcen aus dieser Anleitung erfahren:
- Über den DevOps Quick Check erfahren, wo Sie im Vergleich zum Rest der Branche stehen
Secure Source Manager-Repository einrichten
In dieser Anleitung verwenden Sie ein einzelnes Secure Source Manager-Repository, um Ihre Cloud-Infrastruktur zu definieren. Sie orchestrieren diese Infrastruktur, indem Sie unterschiedliche Branches haben, die unterschiedlichen Umgebungen entsprechen:
Mit dieser Infrastruktur können Sie jederzeit auf das Repository verweisen, um zu erfahren, welche Konfiguration in den einzelnen Umgebungen erwartet wird, und um neue Änderungen vorzuschlagen, die zuerst in der dev
-Umgebung zusammengeführt werden. Anschließend übernehmen Sie die Änderungen. Dazu führen Sie den dev
-Branch mit dem nachfolgenden prod
-Branch zusammen.
Der Code in diesem Repository ist folgendermaßen aufgebaut:
Um sicherzustellen, dass die vorgeschlagenen Änderungen für jede Umgebung geeignet sind, werden terraform init
und terraform plan
für alle environments
-Unterordner ausgeführt. Bevor Sie die Pull-Anfrage zusammenführen, können Sie die Pläne prüfen, um beispielsweise zu vermeiden, dass einer nicht autorisierten Entität Zugriff gewährt wird.
Build-Konfigurationsdatei ändern
Damit die Beispielkonfigurationsdatei für die Erstellung mit Secure Source Manager funktioniert, müssen Sie die folgenden Änderungen vornehmen:
Bearbeiten Sie die Build-Konfigurationsdatei im Branch dev
:
Terraform so konfigurieren, dass der Status in einem Cloud Storage-Bucket gespeichert wird
Standardmäßig speichert Terraform den Status lokal in einer Datei mit dem Namen terraform.tfstate
. Diese Standardkonfiguration kann die Verwendung von Terraform für Teams erschweren, insbesondere wenn viele Nutzer Terraform gleichzeitig ausführen und jeder Computer ein eigenes Verständnis der aktuellen Infrastruktur hat.
Zur Vermeidung solcher Probleme wird in diesem Bereich ein Remotestatus konfiguriert, der auf einen Cloud Storage-Bucket verweist. Der Remote-Status ist ein Feature der Back-Ends und wird in dieser Anleitung in den backend.tf
-Dateien konfiguriert. Beispiel:
In den folgenden Schritten erstellen Sie einen Cloud Storage-Bucket und ändern einige Dateien so, dass sie auf Ihren neuen Bucket und Ihr Google Cloud -Projekt verweisen.
Berechtigungen für Cloud Build-Dienstkonto erteilen
Damit das Cloud Build-Dienstkonto Terraform-Skripts zur Verwaltung von Google Cloud Ressourcen ausführen darf, müssen Sie ihm den entsprechenden Zugriff auf Ihr Projekt gewähren. Der Einfachheit halber wird in dieser Anleitung der Zugriff für den Projektbearbeiter gewährt. In Produktionsumgebungen sollten Sie die Best Practices für die IT-Sicherheit Ihres Unternehmens befolgen. Das bedeutet normalerweise, den Zugriff mit den geringsten Berechtigungen zu gewähren.
Mit Cloud Build verbinden
Wenn Sie Cloud Build bei einem Push in einen beliebigen Zweig auslösen möchten, richten Sie einen Secure Source Manager-Webhook ein. In der Build-Konfigurationsdatei wird der Branchname geprüft, um festzustellen, ob Änderungen an den Umgebungen dev
oder prod
vorgenommen werden müssen.
Webhook in Secure Source Manager einrichten
Erstellen Sie einen Webhook, um Builds bei Push-Vorgängen in Ihre dev
- oder prod
-Branches auszulösen.
Umgebungskonfiguration in einem neuen Feature-Branch ändern
Der Cloud Build-Job hat die in der cloudbuild.yaml
-Datei definierte Pipeline ausgeführt. Wie bereits erwähnt, weist diese Pipeline abhängig vom abgerufenen Branch unterschiedliches Verhalten auf. Der Build prüft, ob die Variable ${branch}
mit einem Umgebungsordner übereinstimmt. Wenn ja, führt Cloud Build den terraform plan
für diese Umgebung aus.
Andernfalls führt Cloud Build terraform plan
für alle Umgebungen aus, damit die vorgeschlagene Änderung auf jeden Fall für alle Umgebungen geeignet ist. Wenn einer dieser Pläne nicht ausgeführt werden kann, schlägt der Build fehl.
- id: 'tf plan' name: 'hashicorp/terraform:1.0.0' entrypoint: 'sh' args: - '-c' - | branch=$(basename "$_REF") if [ -d "environments/${branch}/" ]; then cd environments/${branch} terraform plan else for dir in environments/*/ do cd ${dir} env=${dir%*/} env=${env#*/} echo "" echo "*************** TERRAFOM PLAN ******************" echo "******* At environment: ${env} ********" echo "*************************************************" terraform plan || exit 1 cd ../../ done fi
Ebenso wird der Befehl terraform apply
für Umgebungs-Branches ausgeführt. In allen anderen Fällen wird er jedoch vollständig ignoriert. In diesem Abschnitt haben Sie eine Codeänderung an einen neuen Branch gesendet, sodass keine Infrastrukturbereitstellungen auf Ihr Google Cloud -Projekt angewendet wurden.
Änderungen an der Entwicklungsumgebung übernehmen
Jetzt wird der gewünschte Status auf Ihre dev
-Umgebung angewandt.
Änderungen an der Produktionsumgebung übernehmen
Nachdem Sie Ihre Entwicklungsumgebung vollständig getestet haben, können Sie den Code der Infrastruktur für die Produktion übernehmen.
Sie haben jetzt eine serverlose Infrastruktur-als-Code-Pipeline in Cloud Build konfiguriert. In Zukunft möchten Sie möglicherweise Folgendes ausprobieren:
Bereinigen
Bereinigen Sie nach Abschluss der Anleitung die aufGoogle Cloud erstellten Ressourcen, damit Ihnen diese nicht weiter in Rechnung gestellt werden.