So erstellen Sie DigitalOcean-Snapshots mit Packer unter Ubuntu 16.04

Einführung

Packer von Hashicorp ist ein Befehlszeilentool zum schnellen Erstellen identischer Maschinenabbilder für mehrere Plattformen und Umgebungen. Mit Packer verwenden Sie eine Konfigurationsdatei mit dem Namentemplate, um ein Maschinenabbild mit einem vorkonfigurierten Betriebssystem und einer vorkonfigurierten Software zu erstellen. Sie können dieses Image dann verwenden, um neue Computer zu erstellen. Sie können sogar eine einzige Vorlage verwenden, um die gleichzeitige Erstellung Ihrer Produktions-, Staging- und Entwicklungsumgebungen zu koordinieren.

In diesem Tutorial verwenden Sie Packer, um einen Nginx-Webserver unter Ubuntu 16.04 zu konfigurieren. Anschließend erstellen Sie mit Packer einen Snapshot dieses Droplets und stellen ihn sofort in Ihrem DigitalOcean-Dashboard zur Verfügung, damit Sie neue Droplets erstellen können.

Voraussetzungen

Bevor Sie mit Packer arbeiten können, benötigen Sie einige Dinge.

[[Schritt-1 - Herunterladen und Installieren des Packers]] == Schritt 1 - Herunterladen und Installieren des Packers

Nachdem Sie sich bei Ihrem Server angemeldet haben, laden Sie das Packer-Binärpaket herunter, installieren Packer für den aktuellen Benutzer und überprüfen, ob Ihre Installation erfolgreich war.

Der einfachste Weg, Packer auf Ihrem System zum Laufen zu bringen, besteht darin, das neueste Binärpaket von den offiziellen Hashicorp-Versionenwebsite herunterzuladen. Zum Zeitpunkt des Schreibens ist die neueste Version 0.12.2.

Verwenden Sie das Dienstprogrammcurl, um das Binärpaket von der Hashicorp-Website herunterzuladen.

curl -O https://releases.hashicorp.com/packer/0.12.2/packer_0.12.2_linux_amd64.zip

Installieren Sie nach dem Herunterladen das Dienstprogrammunzipund entpacken Sie damit den Paketinhalt in das Verzeichnis/usr/local/bin, um Packer für alle Benutzer verfügbar zu machen:

sudo apt install -y unzip
sudo unzip -d /usr/local/bin packer_0.12.2_linux_amd64.zip

Stellen Sie sicher, dass die Installation erfolgreich war, indem Sie überprüfen, obpacker in der Befehlszeile verfügbar ist:

packer

Bei einer erfolgreichen Installation wird Folgendes ausgegeben:

Outputusage: packer [--version] [--help]  []

Available commands are:
    build       build image(s) from template
    fix         fixes templates from old versions of packer
    inspect     see components of a template
    push        push a template and supporting files to a Packer build service
    validate    check that a template is valid
    version     Prints the Packer version

Der Packer ist jetzt installiert und funktioniert auf Ihrem Computer. Im nächsten Schritt richten Sie ein Projektverzeichnis ein und konfigurieren die Vorlage, um einen grundlegenden Ubuntu-Snapshot zu erstellen.

[[Schritt-2 - Konfigurieren des Digitalocean-Builders]] == Schritt 2 - Konfigurieren des DigitalOcean Builder

Wir möchten, dass Packer ein Droplet erstellt, einige Software- und Konfigurationsdateien installiert und dieses Droplet dann in ein Image verwandelt, mit dem wir neue Maschinen erstellen können. Packer verwendet eine Konfigurationsdatei mit dem Namentemplate, die alle Details enthält, die Packer mitteilen, wie ein Image erstellt werden soll. Wir schreiben diese Konfiguration mitJSON, einem gängigen Format für Konfigurationsdateien.

In Packer-speak ist abuilder ein JSON-Objekt, das den Entwurf für das Bild enthält, das Packer erstellen soll. Mit dem Builderdigitaloceanweisen Sie Packer an, ein 512 MB großes Ubuntu 16.04-Droplet zu erstellen, das in der Region NYC1 gestartet wird.

Erstellen Sie ein neues Verzeichnis und wechseln Sie in ein anderes Verzeichnis, in dem sich die in diesem Lernprogramm erstellten Vorlagen- und Konfigurationsdateien befinden:

mkdir ~/packerProject
cd ~/packerProject

Nachdem Sie ein Projektverzeichnis haben, öffnen Sie eine neue Datei mit dem Namentemplate.json in Ihrem Texteditor:

nano ~/packerProject/template.json

Jeder Builder muss in den Abschnittbuilders vontemplate.json gehen. Fügen Sie diesen Abschnitt jetzt hinzu und fügen Sie den Builderdigitaloceanhinzu, indem Sie diesen Code in die Datei einfügen:

~/packerProject/template.json

{
  "builders": [
    {
      "type": "digitalocean"
    }]
}

Der Schlüsseltypedefiniert, mit welchem ​​Builder Packer Ihr Image erstellt wird. Der Builder vondigitaloceanerstellt DigitalOcean Droplets, aus denen Packer Snapshots erstellt.

Packer weiß jetzt, dass Sie ein Image für DigitalOcean erstellen möchten, es sind jedoch noch einige Schlüssel-Wert-Paare erforderlich, um den Build abzuschließen.

Beenden Sie die Konfiguration Ihres Droplets, indem Sie diese Schlüssel und Werte hinzufügen, um einen Schnappschuss von einem 512 MB großen Ubuntu 16.04-Droplet zu erstellen, das in der NYC1-Region gestartet wird. Ändern Sie Ihre Datei so, dass sie so aussieht:

~/packerProject/template.json

{
  "builders": [
    {
      "type": "digitalocean",
      "ssh_username": "root",
      "api_token": "YOUR_DIGITALOCEAN_API_TOKEN",
      "image": "ubuntu-16-04-x64",
      "region": "nyc1",
      "size": "512mb"
    }]
}

Der Packer stellt mit dem Wertssh_usernameeine Verbindung zu Droplets her. Dieser Wert muss auf "root" gesetzt werden, damit Packer ordnungsgemäß funktioniert.

Speichern Sietemplate.json und beenden Sie Ihren Texteditor.

Der vorstehende Codeblock enthält die Mindestkonfiguration, die zum Erstellen eines DigitalOcean-Droplets erforderlich ist. Es stehen jedoch zusätzliche Konfigurationsoptionen zur Verfügung (siehe folgende Tabelle):

Key Wert Erforderlich Beschreibung

api_token

String

Yes

Das API-Token, mit dem Sie auf Ihr Konto zugreifen können. Sie kann auch über die UmgebungsvariableDIGITALOCEAN_API_TOKEN angegeben werden, falls festgelegt.

image

String

Yes

Der Name (oder Slug) des zu verwendenden Basisbilds. Dies ist das Image, mit dem ein neues Droplet gestartet und bereitgestellt wird. Unterhttps://developers.digitalocean.com/documentation/v2/#list-all-images finden Sie Details dazu, wie Sie eine Liste der akzeptierten Bildnamen / Slugs erhalten.

region

String

Yes

Der Name (oder die Schnecke) der Region, in der das Droplet gestartet werden soll. Folglich ist dies der Bereich, in dem der Schnappschuss verfügbar sein wird. Siehehttps://developers.digitalocean.com/documentation/v2/#list-all-regions für die akzeptierten Regionsnamen / Slugs.

size

String

Yes

Der Name (oder Slug) der zu verwendenden Tröpfchengröße. Siehehttps://developers.digitalocean.com/documentation/v2/#list-all-sizes für die akzeptierten Größennamen / Slugs.

api_url

String

No

Die URL eines nicht standardmäßigen API-Endpunkts. Stellen Sie dies ein, wenn Sie einen DigitalOcean API-kompatiblen Dienst verwenden.

droplet_name

String

No

Der dem Droplet zugewiesene Name. DigitalOcean setzt den Hostnamen des Computers auf diesen Wert.

private_networking

Boolescher Wert

No

Stellen Sietrue ein, um das private Netzwerk für das zu erstellende Droplet zu aktivieren. Dies ist standardmäßigfalse oder nicht aktiviert.

snapshot_name

String

No

Der Name des resultierenden Schnappschusses, der in Ihrem Konto angezeigt wird. Dies muss eindeutig sein.

state_timeout

String

No

Die Zeit, die als Dauerzeichenfolge gewartet werden muss, bis ein Droplet in einen gewünschten Zustand (z. B. „aktiv“) wechselt, bevor eine Zeitüberschreitung auftritt. Das Standardzeitlimit für den Status ist "6 m".

user_data

String

No

Benutzerdaten, die mit dem Droplet gestartet werden sollen. Weitere Informationen finden Sie unterAn Introduction to Droplet Metadata.

Sie haben jetzt eine gültige Vorlage, aber Ihr API-Token ist in Ihrer Vorlage fest codiert. Dies ist eine schlechte Praxis und ein potenzielles Sicherheitsrisiko. Im nächsten Schritt erstellen Sie eine Variable für dieses Token und verschieben sie austemplate.json.

[[Schritt 3 - Erstellen und Speichern von Benutzervariablen]] == Schritt 3 - Erstellen und Speichern von Benutzervariablen

Mit Packer können Sie die Werte von Variablen in einer separaten Datei erstellen und speichern. Diese Datei kann dann über die Befehlszeile an Packer übergeben werden, wenn Sie bereit sind, Ihr Image zu erstellen.

Das Speichern von Variablen in einer separaten Datei ist eine ideale Methode, um vertrauliche Informationen oder umgebungsspezifische Daten aus Ihrer Vorlage herauszuhalten. Dies ist von entscheidender Bedeutung, wenn Sie es für Teammitglieder freigeben oder in einem öffentlich zugänglichen Repository wie GitHub speichern möchten.

Auch wenn Sie nur eine lokale Kopie speichern, ist es eine bewährte Methode von Packer, Variablen außerhalb einer Vorlage zu speichern.

Erstellen und öffnen Sie eine neue JSON-Datei im VerzeichnispackerProject, um diese Informationen zu speichern:

nano ~/packerProject/variables.json

Fügen Sie nun einemy_token-Variable hinzu und setzen Sie ihren Wert auf Ihr DigitalOcean-API-Token:

~/packerProject/variables.json

{
  "my_token": "YOUR_DIGITALOCEAN_API_TOKEN"
}

Speichern Sievariables.json und beenden Sie Ihren Editor.

Jetzt konfigurieren wir unsere Vorlage für die Verwendung von Variablen. Bevor Sie die Variablemy_token oder eine andere Variable verwenden, müssen Sie Packer zunächst mitteilen, dass die Variable vorhanden ist, indem Sie sie in einem Abschnittvariables am Anfang der Dateitemplate.json definieren.

Öffnen Sietemplate.json in Ihrem Editor:

nano template.json

Fügen Sie einen neuenvariables-Abschnitt über dem zuvor definiertenbuilders-Abschnitt hinzu. Deklarieren Sie in diesem neuen Abschnitt die Variablemy_tokenund setzen Sie ihren Standardwert auf eine leere Zeichenfolge:

~/packerProject/template.json

{
  "variables": {
    "my_token":""
  },
  "builders": [
  ...

}

Im Abschnittvariablesdefinierte Variablen sind global verfügbar.

Ersetzen Sie als Nächstes Ihr API-Token im Abschnittbuilders durch einen Aufruf vonmy_token:

~/packerProject/template.json

{
  ...
  "builders": [
    {
      "type": "digitalocean",
      "api_token": "{{ user `my_token` }}",
      ...
    }]
}

Wie Sie sehen können, müssen Aufrufe von Benutzervariablen ein bestimmtes Format verwenden:+"{{ user \`variable_name\}} + `. Die Anführungszeichen und die Backticks sind erforderlich, ebenso wie die doppelten geschweiften Klammern.

Speichern Sie die Datei und beenden Sie den Editor.

Sie haben jetzt eine Arbeitsvorlage, die einen Basis-Snapshot und eine separate Variablendatei zum Speichern Ihres API-Schlüssels erstellt. Bevor Sie Ihr Image validieren und erstellen, fügen Sie unserer Vorlage einen Abschnittprovisionershinzu, in dem Packer so konfiguriert wird, dass der Nginx-Webserver auf dem Computer installiert und eingerichtet wird, bevor das Image erstellt wird.

[[Schritt 4 - Konfigurieren von Provisionern]] == Schritt 4 - Konfigurieren von Provisionern

Im Abschnittprovisioners installiert und konfiguriert Packer Software auf dem ausgeführten Droplet, bevor es in ein Maschinenabbild umgewandelt wird. Wie bei Buildern gibt es verschiedene Arten von Provisionern, mit denen Sie ein Droplet konfigurieren können.

Um Nginx zu konfigurieren, verwenden Sie denfile-Versorger von Packer, um Konfigurationsdateien auf den Server hochzuladen, und verwenden Sie dann denshell-Versorger, um ein Installationsskript auszuführen, das diese Dateien verwendet. Mit dem Provisioner vonfilekönnen Sie Dateien und Verzeichnisse von und zu einem laufenden Computer verschieben, bevor er in ein Image umgewandelt wird. Mit dem Provisioner vonshellkönnen Sie Shell-Skripte auf diesem Computer remote ausführen.

Provisioner werden in derselben Reihenfolge ausgeführt, in der sie in der Vorlage angezeigt werden. Dies bedeutet, dass der Provisioner vonfilean erster Stelle steht, da Ihre Shell-Skripte die hochgeladenen Dateien benötigen.

Fügen Sie einenprovisioners-Abschnitt unmittelbar nach dembuilders-Abschnitt intemplate.json hinzu und legen Sie die beiden zu verwendenden Provisioner fest:

~/packerProject/template.json

{
  ...
  "builders": [
    {
      ...
  }],
  "provisioners": [
    {
      "type": "file"
    },
    {
      "type": "shell"
    }]
}

Derfile-Provisioner benötigt einsource, das auf einen lokalen Dateipfad verweist, und eindestination, das auf einen vorhandenen Dateipfad auf dem laufenden Computer verweist. Packer kann Dateien nur an bereits vorhandene Ziele verschieben. Aus diesem Grund laden wir in der Regel Dateien in das Verzeichnis/tmphoch.

Konfigurieren Sie den Provisioner vonfile, indem Sie die hervorgehobenen Zeilen zutemplate.json hinzufügen:

~/packerProject/template.json

{
  ...
  "provisioners": [
    {
      "type": "file",
      "source": "configs/",
      "destination": "/tmp"
    },
    ...
}

Im nächsten Schritt erstellen wir den Ordnerconfigsauf unserem lokalen Computer. Bevor wir dies tun, beenden wir die Bearbeitung der Konfigurationsdatei, indem wir den Provisioner vonshelleinrichten.

Der Provisioner vonshellverwendet einenscripts-Schlüssel, der ein Array von Skripten enthält, die an den laufenden Computer übergeben werden sollen. Jedes Skript wird in der in Ihrer Vorlage angegebenen Reihenfolge hochgeladen und ausgeführt.

Konfigurieren Sie nun den Provisioner vonshell, indem Sie den vollständigen Pfad zu Ihrem Skript angeben:

~/packerProject/template.json

{
  ...
  "provisioners": [
    {
      "type": "file",
      "source": "configs/",
      "destination": "/tmp"
    },
    {
      "type": "shell",
      "scripts": [
        "scripts/configureNginx.sh"
      ]
    }]
}

Skripte müssen einzeln aufgelistet werden, damit Sie die Ausführungsreihenfolge der Skripte steuern können.

Der Abschnittprovisioners Ihrer Vorlage ist vollständig. Wenn Sie Nano verwenden, halten Sie die Tastectrlgedrückt und drücken Siex, um die Datei zu beenden. Drücken Siey, wenn Sie aufgefordert werden, Ihre Änderungen zu speichern.

Jetzt erstellen wir die Shell-Skripte und Konfigurationsdateien, die Packer zum Erstellen Ihres Images verwendet.

[[Schritt-5 - Hinzufügen von Konfigurationsdateien und Installationsskripten]] == Schritt 5 - Hinzufügen von Konfigurationsdateien und Installationsskripten

Wir möchten, dass unser Image mit einer vollständig konfigurierten Nginx-Installation mit den richtigen Konfigurationsdateien und einer Standardwebseite geliefert wird. In diesem Abschnitt erstellen Sie diese Dateien aus einer vordefinierten Konfiguration basierend auf dem LernprogrammHow To Set Up Nginx Server Blocks (Virtual Hosts) on Ubuntu 16.04, da die Nginx-Konfiguration den Rahmen dieses Lernprogramms sprengt.

Wir stellen den Server mit Nginx bereit, indem wir drei separate Konfigurationsdateien erstellen und hochladen, die von einem einzigen Installationsskript verarbeitet werden.

Erstellen Sie zunächst ein neues Verzeichnis im Projektordner, um die Konfigurationsdateien zu speichern.

mkdir ~/packerProject/configs

Wechseln Sie zu/configs, um Ihre Nginx-Konfigurationsdateien zu erstellen:

cd ~/packerProject/configs

Zunächst benötigen Sie eine Standardwebseite, die von Ihrer neuen Domain bereitgestellt wird. Erstellen Sie die Dateiindex.html.new:

nano index.html.new

Fügen Sie in diese neue Datei Folgendes ein:

~/packerProject/configs/index.html.new

HELLO FROM YOUR TEST PAGE

Als Nächstes benötigen Sie eine Nginx-Konfigurationsdatei, die den Serverblock für Ihre Domain definiert, der wiederum den Überwachungsport und den Speicherort Ihrer Webseiten für die Domain definiert. Erstellen Sie eine Datei mit dem NamennewDomain.conf:

nano newDomain.conf

Fügen Sie die folgende Konfiguration in diese Datei ein:

~/packerProject/configs/newDomain.conf

server {
        listen 80;
        listen [::]:80;

        server_name example.com;

        location / {
                root /var/www/html/newDomain;
                index index.html index.htm;
        }
}

[.note] # In diesem Beispiel verwenden wirexample.com als Platzhalterwert. Wenn Sie aus Ihrem Image einen neuen Computer erstellen, müssen Sie sich bei dem neuen Computer anmelden und diese Datei so ändern, dass sie die tatsächliche Domäne oder IP-Adresse widerspiegelt, die auf den Computer verweist.
#

Schließlich möchten Sie, dass Nginx die Konfiguration Ihrer Domain aus einem neuen Verzeichnis,/etc/nginx/vhost.d/, lädt. Dies bedeutet, dass Sie die Hauptkonfigurationsdatei von Nginx bearbeiten müssen.

nginx.conf.new erstellen:

nano nginx.conf.new

Wir verwenden eine Standard-Nginx-Konfigurationsdatei, ändern sie jedoch so, dass sie unsere spezifische Site-Konfiguration enthält, und stellen sicher, dass Nginx als Benutzer vonwww-dataausgeführt wird. Fügen Sie den folgenden Inhalt in diese Datei ein:

~/packerProject/configs/nginx.conf.new

user www-data;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/vhost.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

}

Speichern und schließen Sie die Datei.

Definieren Sie anhand der vorhandenen Konfigurationsdateien die Skripte, mit denen Packer die benötigte Software installiert. Erstellen Sie einen neuen Ordner zum Speichern Ihrer Skripte:

mkdir ~/packerProject/scripts

Wechseln Sie nun in dieses neue Verzeichnis und erstellen Sie das InstallationsskriptconfigureNginx.sh, mit dem der Nginx-Webserver installiert, konfiguriert, aktiviert und gestartet wird:

cd ~/packerProject/scripts
nano configureNginx.sh

Fügen Sie Folgendes in die Datei ein, die Nginx mithilfe der soeben erstellten Konfigurationsdateien installiert, konfiguriert und startet:

~/packerProject/scripts/configureNginx.sh

#!/bin/bash
# Script to install Nginx and enable on boot.

# Update your system:
apt-get update -y
apt-get upgrade -y

# Install Nginx:
apt-get install -y nginx

#Start Nginx service and enable to start on boot:
systemctl enable nginx
systemctl start nginx

# Create new 'vhost' directory for domain configuration:
mkdir /etc/nginx/vhost.d

# Create a new directory to serve new content.
mkdir -p /var/www/html/newDomain

# Create a copy of original configuration files and import configuration:
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.original
cp /tmp/nginx.conf.new /etc/nginx/nginx.conf

# Copy over the server block configuration:
cp /tmp/newDomain.conf /etc/nginx/vhost.d/newDomain.conf

# Copy over the html test page:
cp /tmp/index.html.new /var/www/html/newDomain/index.html

# Restart Nginx:
systemctl restart nginx

Ihre Vorlage ist fertig und Sie können jetzt Ihren Schnappschuss validieren und erstellen.

Schritt 6 - Überprüfen und Erstellen des Tropfens

Es ist Zeit, Ihre Vorlage mit dem Unterbefehlvalidatevon Packer zu testen. Sobald Ihre Vorlage erfolgreich validiert wurde, erstellen Sie Ihr Droplet und erstellen den Snapshot.

Wechseln Sie in das Stammverzeichnis Ihres Projekts:

cd ~/packerProject

Der Unterbefehlvalidateüberprüft Ihre Vorlage auf gültige Syntax- und Konfigurationsoptionen:

packer validate -var-file=variables.json template.json

Das-var-file-Flag liestvariables.json und setzt den Wert fürmy_token innerhalb vontemplate.json.

Sie sehen die folgende Ausgabe:

OutputTemplate validated successfully.

Wenn mittemplate.json etwas nicht stimmt, wird eine Fehlermeldung angezeigt. Diese Meldung variiert je nach Fehler, die meisten können jedoch durch nochmaliges Überprüfen der Syntax und Korrigieren von Tippfehlern behoben werden.

Der Unterbefehlbuild führt den Build aus, den Sie im Abschnittbuilders Ihrer Vorlage definiert haben. Mit anderen Worten, es weist Packer an, Ihr Droplet zu erstellen und anschließend einen Snapshot dieses Droplets in Ihrem DigitalOcean-Dashboard zu erstellen.

Rufen Siepacker build auf, um das Droplet zu erstellen und den Snapshot zu erstellen:

packer build -var-file=variables.json template.json

Beachten Sie, dass das Flag-var-file für die Unterbefehlebuild undvalidate genauso funktioniert.

Die Ausgabe eines erfolgreichen Builds sieht ungefähr so ​​aus:

Outputdigitalocean output will be in this color.

==> digitalocean: Creating temporary ssh key for Droplet...
==> digitalocean: Creating Droplet...
==> digitalocean: Waiting for Droplet to become active...
==> digitalocean: Waiting for SSH to become available...
==> digitalocean: Connected to SSH!
==> digitalocean: Gracefully shutting down Droplet...
==> digitalocean: Creating snapshot: packer-1488487459
==> digitalocean: Waiting for snapshot to complete...
==> digitalocean: Destroying Droplet...
==> digitalocean: Deleting temporary ssh key...
Build 'digitalocean' finished.

==> Builds finished. The artifacts of successful builds are:
--> digitalocean: A snapshot was created: 'packer-1488487459' (ID: 18252043) in region 'nyc1'

Nach einem erfolgreichen Build finden Sie einen neuen Snapshot in Ihrem DigitalOcean-Snapshot-Repository. Den Namen des Schnappschusses finden Sie in der Ausgabe. In diesem Beispiel sind espacker-1488487459.

Besuchen Sie von hier aus Ihr DigitalOcean-Dashboard, wählen SieImages aus, und der neue Snapshot wird in Ihrer Liste angezeigt:

Docker snapshot in DigitalOcean dashboard

Mit diesem neuen Snapshot können Sie jetzt neue Droplets erstellen. Wählen SieMore undCreate Droplet. Füllen Sie dann das Formular aus, um Ihren neuen Computer zu erstellen.

Sobald der Computer online ist, ermitteln Sie seine IP-Adresse in Ihrem Dashboard und melden Sie sich bei Ihrem neuen Computer an:

ssh root@your_new_server_ip_address

Bearbeiten Sie dann die Konfigurationsdatei des Nginx-Servers:

nano /etc/nginx/vhost.d/newDomain.conf

Ersetzen Sieexample.com entweder durch die IP-Adresse des Computers oder durch den Domänennamen, den Sie verwenden:

~/packerProject/configs/newDomain.conf

server {
        listen 80;
        listen [::]:80;

        server_name your_new_server_ip_address;

        location / {
                root /var/www/html/newDomain;
                index index.html index.htm;
        }
}

Alternativ können Sie den Befehlsed verwenden, um den Wert in der Datei wie folgt zu ersetzen:

sudo sed -i 's/^.*server_name example.com/server_name your_new_server_ip_address/' /etc/nginx/vhost.d/newDomain.conf

Sie können mehr übersed inthis tutorial erfahren.

Starten Sie dann den Nginx-Server neu, um die Änderungen zu übernehmen:

sudo systemctl restart nginx

Fehlerbehebung

Gelegentlich kann es vorkommen, dass Sie auf ein Problem stoßen, das in der Fehlermeldung nicht ausreichend erklärt wird. In diesen Szenarien können Sie mehr Details zu Ihrem Build extrahieren, indem Sie den Debug-Modus aktivieren, die Packer-Protokolle überprüfen oder beides.

Der Debug-Modus bietet Builder-spezifische Debug-Informationen für jeden Schritt in einem Remote-Build. Wenn Sie den Debug-Modus für ein DigitalOcean-Build aktivieren, wird auch ein temporärer privater Schlüssel in Ihrem Projektordner erstellt, mit dem Sie eine Verbindung zu einem laufenden Droplet herstellen und dieses prüfen können, bevor es in einen Snapshot umgewandelt wird.

Sie können in den Debug-Modus wechseln, indem Sie das Flag-debug anpacker build in der Befehlszeile übergeben:

packer build -debug --var-file=variables.json template.json

Wenn Sie das Problem im Debug-Modus nicht diagnostizieren können, können Sie versuchen, die Packer-Protokolle zu aktivieren. Diese Protokolle werden in erster Linie zum Debuggen lokaler Builder verwendet, bieten jedoch möglicherweise auch hilfreiche Informationen zu Remote-Builds.

Um die Packer-Protokolle zu aktivieren, setzen Sie die UmgebungsvariablePACKER_LOGauf einen beliebigen Wert außer "0" oder eine leere Zeichenfolge:

PACKER_LOG=1 packer build --var-file=variables.json template.json

Protokolle werden auf der Konsole gedruckt, sofern Sie nicht auch die UmgebungsvariablePACKER_LOG_PATHfestlegen.

Wenn Sie immer noch Probleme haben, können Sie versuchen, jemanden inPacker communityzu erreichen.

Fazit

Da Sie mit den Grundlagen von Packer vertraut sind, möchten Sie möglicherweise auf dieser Grundlage aufbauen.

Fügen Sie Ihrer Vorlage einen zweiten Builder hinzu, um eine lokale Testumgebung neben Ihrem DigitalOcean-Snapshot zu erstellen. Der Buildervirtualbox-iso erstellt beispielsweise Bilder fürVirtualBox, ein kostenloses Open-Source-Virtualisierungsprodukt, das sowohl von Unternehmen als auch von Hobbyisten verwendet wird. Sie können einpost-processor für das VirtualBox-Image definieren und Vagrant-Umgebungen erstellen, die Ihre DigitalOcean-Snapshots widerspiegeln. Auf diese Weise können Sie Website-Änderungen lokal testen, bevor Sie sie in ein Live-Droplet übertragen. Sie können mehr inVagrant post-processor documentation erfahren.

Oder Sie möchten Ihren Webserver mit einer Datenbank verbinden. Fügen Sie einen zweiten Builder fürdigitaloceanhinzu und verwenden Sie den Schlüssel füronlyin Ihrem Abschnitt fürprovisioners, um auf jeden Build eine andere Bereitstellung anzuwenden.

Wenn Sie mit der Verwendung von Konfigurationsverwaltungstools besser vertraut sind, bietet Packer sofort Unterstützung fürAnsible,Puppet,Chef und mehr. Versuchen Sie, mit einem dieser Provisioner Ihr Droplet so zu konfigurieren, dass es Ihrem Anwendungsfall entspricht. Wenn Sie das Konfigurationsmanagement noch nie ausprobiert haben, sehen Sie sichHow To Create Ansible Playbooks to Automate System Configuration on Ubuntu an.