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.
-
Ein Ubuntu 16.04-Server, der von folgendenthe Ubuntu 16.04 initial server setup guide eingerichtet wurde, einschließlich eines Sudo-Nicht-Root-Benutzers und einer Firewall.
-
Ein DigitalOcean-API-Token mit den Berechtigungenread undwrite. Überprüfen SieHow to Use the DigitalOcean API v2, um ein Token zu erhalten.
[[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 Dienstprogrammunzip
und 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 Builderdigitalocean
weisen 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 Builderdigitalocean
hinzu, indem Sie diesen Code in die Datei einfügen:
~/packerProject/template.json
{
"builders": [
{
"type": "digitalocean"
}]
}
Der Schlüsseltype
definiert, mit welchem Builder Packer Ihr Image erstellt wird. Der Builder vondigitalocean
erstellt 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_username
eine 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 |
---|---|---|---|
|
String |
Yes |
Das API-Token, mit dem Sie auf Ihr Konto zugreifen können. Sie kann auch über die Umgebungsvariable |
|
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. |
|
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. |
|
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. |
|
String |
No |
Die URL eines nicht standardmäßigen API-Endpunkts. Stellen Sie dies ein, wenn Sie einen DigitalOcean API-kompatiblen Dienst verwenden. |
|
String |
No |
Der dem Droplet zugewiesene Name. DigitalOcean setzt den Hostnamen des Computers auf diesen Wert. |
|
Boolescher Wert |
No |
Stellen Sie |
|
String |
No |
Der Name des resultierenden Schnappschusses, der in Ihrem Konto angezeigt wird. Dies muss eindeutig sein. |
|
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". |
|
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_token
und setzen Sie ihren Standardwert auf eine leere Zeichenfolge:
~/packerProject/template.json
{
"variables": {
"my_token":""
},
"builders": [
...
}
Im Abschnittvariables
definierte 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 Abschnittprovisioners
hinzu, 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 vonfile
können Sie Dateien und Verzeichnisse von und zu einem laufenden Computer verschieben, bevor er in ein Image umgewandelt wird. Mit dem Provisioner vonshell
kö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 vonfile
an 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/tmp
hoch.
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 Ordnerconfigs
auf unserem lokalen Computer. Bevor wir dies tun, beenden wir die Bearbeitung der Konfigurationsdatei, indem wir den Provisioner vonshell
einrichten.
Der Provisioner vonshell
verwendet 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 Tastectrl
gedrü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-data
ausgefü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 Unterbefehlvalidate
von 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:
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_LOG
auf 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_PATH
festlegen.
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ürdigitalocean
hinzu und verwenden Sie den Schlüssel füronly
in 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.