Developer Advocate
Automatisieren der Servereinrichtung mit Ansible Workshop Kit-Materialien
Dieses Workshop Kit ist so konzipiert, dass es einem technischen Fachpublikum erlaubt, sich mit Konfigurationsmanagementkonzepten sowie der Verwendung von Ansible zur Automatisierung der Serverinfrastruktureinrichtung vertraut zu machen.
Das Ziel des Kits besteht darin, einem Redner einen kompletten Ressourcensatz zum Abhalten einer Veranstaltung und Halten einer Einführungsrede über Ansible bereitzustellen. Das Kit beinhaltet:
Dieses Tutorial ist als Ergänzung für die Vortrags-Demo inklusive zusätzlicher Details und Erläuterungen gedacht. Außerdem dient es als Referenz für Leser, die unter Einsatz von Ansible eine Laravel-Anwendung auf einem Ubuntu-Remoteserver bereitstellen möchten.
Server-Automatisierung spielt aufgrund der Löschbarkeit von modernen Anwendungsumgebungen eine wesentliche Rolle bei der Systemverwaltung. Üblicherweise werden zur Optimierung der automatisierten Einrichtung von Servern Tools für das Konfigurationsmanagement wie z. B. Ansible verwendet, um Standardverfahren für neue Server festzulegen. Das hat den Vorteil, dass sich mit manuellen Konfigurationen verbundene menschliche Fehler verringern lassen.
Ansible bietet eine einfache Architektur, die keiner speziellen Software für die Installation auf Knoten bedarf. Des Weiteren bietet es eine Reihe stabiler Funktionen und integrierter Module, die das Schreiben von Automatisierungsskripts erleichtern.
Dieses Tutorial, das als Begleitung zu den Folien und Redemanuskripten für die Automatisierung der Servereinrichtung mit Ansible Workshop Kit gedacht ist, zeigt Ihnen, wie Sie eine Inventurdatei einrichten und eine Reihe von Bereitstellungsskripten ausführen können, um das Verfahren der Einrichtung eines LEMP-Remoteservers (Linux, (E)Nginx, MariaDB und PHP-FPM) unter Ubuntu 18.04 vollständig zu automatisieren und in diesem System eine Laravel-Demoanwendung bereitzustellen.
Anmerkung: Dieses Material soll zeigen, wie Sie mit Ansible Playbooks zur Automatisierung der Servereinrichtung verwenden können. Unsere Demo besteht zwar aus einer Laravel-Anwendung, die auf einem LEMP-Server ausgeführt wird, doch werden Leser dazu ermutigt, die enthaltene Einrichtung ihren Anforderungen entsprechend zu ändern und anzupassen.
Um dieser Anleitung zu folgen, benötigen Sie:
authorized_keys
hinzugefügt werden, wie in Schritt 2 des Leitfadens Einrichten von SSH-Schlüsseln unter Ubuntu 18.04 beschrieben. Wenn Sie DigitalOcean-Droplets als Knoten verwenden, können Sie das Bedienfeld nutzen, um Ihren öffentlichen Schlüssel zu Ihren Ansible-Hosts hinzuzufügen.Als Erstes müssen wir das Repository, das die Ansible-Bereitstellungsskripte enthält, und die Laravel-Demoanwendung klonen, die wir auf den Remoteservern bereitstellen werden. Alle erforderlichen Dateien finden Sie im Github-Repository do-community/ansible-laravel-demo.
Nachdem Sie sich als sudo-Benutzer bei Ihrem Ansible-Steuerknoten angemeldet haben, klonen Sie das Repository und navigieren Sie zu dem Verzeichnis, das Sie mit dem Befehl git
erstellt haben:
- git clone https://github.com/do-community/ansible-laravel-demo.git
- cd ansible-laravel-demo
Nun können Sie einen ls
-Befehl ausführen, um den Inhalt des geklonten Repository zu inspizieren:
- ls -l --group-directories-first
Die Ausgabe sieht dann so aus:
drwxrwxr-x 3 sammy sammy 4096 Mar 24 15:24 application
drwxrwxr-x 2 sammy sammy 4096 Mar 24 15:24 group_vars
drwxrwxr-x 7 sammy sammy 4096 Mar 24 15:24 roles
-rw-rw-r-- 1 sammy sammy 102 Mar 24 15:24 inventory-example
-rw-rw-r-- 1 sammy sammy 1987 Mar 24 15:24 laravel-deploy.yml
-rw-rw-r-- 1 sammy sammy 794 Mar 24 15:24 laravel-env.j2
-rw-rw-r-- 1 sammy sammy 920 Mar 24 15:24 readme.md
-rw-rw-r-- 1 sammy sammy 318 Mar 24 15:24 server-setup.yml
Hier ist eine Übersicht über die einzelnen Ordner und Dateien sowie über deren Funktion:
application/
: Dieses Verzeichnis enthält die Laravel-Demoanwendung, die im Laufe des Workshops auf dem Remoteserver bereitgestellt wird.group_vars/
: Dieses Verzeichnis enthält Variablendateien, die benutzerdefinierte Optionen für die Anwendungseinrichtung enthalten, z. B. Datenbankanmeldeinformationen sowie Angaben zum Speicherort der Anwendungsdateien auf dem Remoteserver.roles/
: Dieses Verzeichnis enthält die verschiedenen Ansible-Rollen, die die Bereitstellung eines Ubuntu-LEMP-Servers handhaben.inventory-example
: Diese Datei kann als Basis zur Erstellung eines benutzerdefinierten Inventars für Ihre Infrastruktur verwendet werden.laravel-deploy.yml
: Dieses Playbook stellt die Laravel-Demoanwendung auf dem Remoteserver bereit.laravel-env.j2
: Diese Vorlage wird vom Playbook laravel-deploy.yml
zur Einrichtung der Anwendungsumgebungsdatei verwendet.readme.md
: Diese Datei enthält allgemeine Informationen über die in diesem Repository enthaltene Bereitstellung.server-setup.yml
: Dieses Playbook stellt unter Verwendung der im Verzeichnis roles/
definierten Rollen einen LEMP-Server bereit.Jetzt erstellen wir eine Inventardatei, um die Hosts aufzulisten, die wir mit Ansible verwalten möchten. Kopieren Sie zunächst die Datei inventory-example
in eine neue Datei namens hosts
:
- cp inventory-example hosts
Verwenden Sie nun einen Texteditor Ihrer Wahl zum Öffnen der neuen Inventardatei und zum Aktualisieren Ihrer eigenen Server. Wir verwenden hier nano
:
- nano hosts
Das Beispielinventar, das Teil des Workshop Kits ist, enthält zwei Ansible-Gruppen: dev
und production
. Dadurch soll gezeigt werden, wie sich Gruppenvariablen verwenden lassen, um die Bereitstellung in verschiedenen Umgebungen anzupassen. Wenn Sie diese Einrichtung mit einem einzigen Knoten testen möchten, können Sie entweder die Gruppe dev
oder production
verwenden und die andere aus der Inventardatei entfernen.
[dev]
203.0.113.0.101
[prod]
203.0.113.0.102
[all:vars]
ansible_python_interpreter=/usr/bin/python3
Anmerkung: Die Variable ansible_python_interpreter
definiert den Pfad zur ausführbaren Python-Datei auf dem Remotehost. Hier weisen wir Ansible an, diese Variable für alle Hosts in dieser Inventardatei festzulegen.
Speichern und schließen Sie die Datei, wenn Sie fertig sind. Wenn Sie nano
verwenden, können Sie Strg+X
drücken, dann Y
eingeben und zur Bestätigung ENTER
drücken.
Sobald Sie Ihre Inventardatei angepasst haben, können Sie das ping
-Ansible-Modul ausführen, um zu testen, ob der Steuerknoten eine Verbindung mit den Hosts herstellen kann:
- ansible all -i hosts -m ping -u root
Lassen Sie uns den Befehl aufschlüsseln:
all
: Diese Option weist Ansible an, den folgenden Befehl auf allen Hosts in der designierten Inventardatei auszuführen.-i hosts
: Gibt an, welches Inventar verwendet werden soll. Wenn diese Option nicht angegeben ist, wird Ansible versuchen, das standardmäßige Inventar zu verwenden, das sich typischerweise unter /etc/ansible/hosts
befindet.-m ping
: Damit wird das ping
-Ansible-Modul ausgeführt, das die Verbindung mit Knoten testen wird und prüft, ob sich die ausführbare Python-Datei auf den Remotesystemen finden lässt.-u root
: Diese Option gibt an, welcher Remotebenutzer zur Verbindung mit den Knoten verwendet werden soll. Wir verwenden hier das Root-Konto als Beispiel, da dies in der Regel das einzige Konto ist, das auf neu eingerichteten Servern verfügbar ist. Je nach Ihrem Infrastrukturanbieter und der SSH-Konfiguration können weitere Verbindungsoptionen erforderlich sein.Wenn Ihre SSH-Verbindung zu den Knoten richtig eingerichtet ist, erhalten Sie folgende Ausgabe:
Output203.0.113.0.101 | SUCCESS => {
"changed": false,
"ping": "pong"
}
203.0.113.0.102 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Die pong
-Antwort bedeutet, dass sich Ihr Steuerknoten mit den verwalteten Knoten verbinden kann und Ansible dazu in der Lage ist, Python-Befehle auf den Remotehosts auszuführen.
Bevor Sie die in diesem Workshop Kit enthaltenen Playbooks ausführen, müssen Sie zunächst die Variablendatei bearbeiten, die Einstellungen wie den Namen des zu erstellenden Remotebenutzers sowie die mit MariaDB einzurichtenden Datenbankanmeldeinformationen enthält.
Öffnen Sie mit Ihrem bevorzugten Texteditor die Datei group_vars/all
:
- nano group_vars/all.yml
---
# Initial Server Setup
remote_user: sammy
# MySQL Setup
mysql_root_password: MYSQL_ROOT_PASSWORD
mysql_app_db: travellist
mysql_app_user: travellist_user
mysql_app_pass: DB_PASSWORD
# Web Server Setup
http_host: "{{ ansible_facts.eth0.ipv4.address }}"
remote_www_root: /var/www
app_root_dir: travellist-demo
document_root: "{{ remote_www_root }}/{{ app_root_dir }}/public"
# Laravel Env Variables
app_name: Travellist
app_env: dev
app_debug: true
app_url: "http://{{ http_host }}"
db_host: localhost
db_port: 3306
db_database: "{{ mysql_app_db }}"
db_user: "{{ mysql_app_user }}"
db_pass: "{{ mysql_app_pass }}"
Die Variablen, die Ihre Aufmerksamkeit benötigen, sind:
remote_user
: Der angegebene Benutzer wird auf dem Remoteserver erstellt und erhält sudo
-Berechtigungen.mysql_root_password
: Diese Variable definiert das Datenbank-Rootpasswort für den MariaDB-Server. Beachten Sie, dass es sich dabei um ein sicheres Passwort Ihrer Wahl handeln sollte.mysql_app_db
: Der Name der Datenbank, die für die Laravel-Anwendung erstellt wird. Sie müssen diesen Wert nicht ändern, können es aber auf Wunsch tun. Dieser Wert wird zur Einrichtung der Laravel-Konfigurationsdatei .env
verwendet.mysql_app_user
: Der Name des Datenbankbenutzers für die Laravel-Anwendung. Auch hier müssen Sie den Wert nicht ändern, können es aber auf Wunsch tun.mysql_app_pass
: Das Datenbankpasswort für die Laravel-Anwendung. Das sollte ein sicheres Passwort Ihrer Wahl sein.http_host
: Der Domänenname oder die IP-Adresse des Remotehosts. Hier verwenden wir ein Ansible-Fakt, das die IPv4-Adresse für die Netzwerkschnittstelle eth0
enthält. Wenn Sie über Domänennamen verfügen, die auf Ihre Remotehosts verweisen, möchten Sie ggf. für jeden dieser Namen separate Variablendateien erstellen, um diesen Wert zu überschreiben, damit die Nginx-Konfiguration den richtigen Hostnamen für jeden Server enthält.Wenn Sie mit der Bearbeitung dieser Werte fertig sind, speichern und schließen Sie die Datei.
Wenn Sie Ihre Inventardatei mit mehreren Knoten eingerichtet haben, wollen Sie möglicherweise zusätzliche Variablendateien erstellen, um jeden Knoten entsprechend zu konfigurieren. In unserem Beispielinventar haben wir zwei verschiedene Gruppen erstellt: dev
und production
. Um zu vermeiden, dass in beiden Umgebungen dieselben Datenbank-Anmeldeinformationen und andere Einstellungen verwendet werden, müssen wir eine separate Variablendatei für die Produktionswerte erstellen.
Vielleicht möchten Sie die standardmäßige Variablendatei kopieren und sie als Basis für Ihre Produktionswerte nutzen:
- cp group_vars/all.yml group_vars/production.yml
- nano group_vars/production.yml
Da die Datei all.yml
die Standardwerte enthält, die für alle Umgebungen gültig sein sollen, können Sie alle Variablen entfernen, die in der neuen Datei production.yml
keine Änderung benötigen. Die Variablen, die Sie für die jeweilige Umgebung aktualisieren sollten, sind hier hervorgehoben:
---
# Initial Server Setup
remote_user: prod_user
# MySQL Setup
mysql_root_password: MYSQL_PROD_ROOT_PASSWORD
mysql_app_pass: MYSQL_PROD_APP_PASSWORD
# Laravel Env Variables
app_env: prod
app_debug: false
Beachten Sie, dass wir den Wert app_env
in prod
geändert haben und den Wert app_debug
auf false
gesetzt haben. Das sind die empfohlenen Laravel-Einstellungen für Produktionsumgebungen.
Wenn Sie die Anpassung Ihrer Produktionsvariablen abgeschlossen haben, speichern und schließen Sie die Datei.
Wenn Sie planen, Ihre Ansible-Einrichtung mit anderen Benutzern zu teilen, ist es wichtig, die Datenbank-Anmeldeinformationen und andere sensible Daten in Ihren Variablendateien sicher aufzubewahren. Das ist mit Ansible Vault möglich, einer Funktion, die standardmäßig in Ansible enthalten ist. Mit Ansible Vault können Sie Variablendateien verschlüsseln, damit nur Benutzer, die Zugriff auf das Vault-Passwort haben, die Dateien anzeigen, bearbeiten oder entschlüsseln können. Außerdem wird das Vault-Passwort für die Ausführung eines Playbooks oder Befehls benötigt, das bzw. der verschlüsselte Dateien nutzt.
Um Ihre Produktionsvariablendatei zu verschlüsseln, führen Sie Folgendes aus:
- ansible-vault encrypt group_vars/production.yml
Sie werden dazu aufgefordert, ein Vault-Passwort anzugeben und zu bestätigen. Wenn Sie damit fertig sind und die Inhalte dieser Datei überprüfen, sehen Sie, dass die Daten nun verschlüsselt sind.
Wenn Sie die Variablendatei anzeigen möchten, ohne ihren Inhalt zu ändern, können Sie den Befehl view
verwenden:
- ansible-vault view group_vars/production.yml
Sie werden dazu aufgefordert, das gleiche Passwort einzugeben, das Sie festgelegt haben, als Sie diese Datei mit ansible-vault
verschlüsselt haben. Nach Eingabe des Passworts wird der Inhalt der Datei in Ihrem Terminal angezeigt. Geben Sie q
ein, um die Dateiansicht zu beenden.
Um eine zuvor mit Ansible Vault verschlüsselte Datei zu bearbeiten, verwenden Sie den Vault-Befehl edit
:
- ansible-vault edit group_vars/production.yml
Bei diesem Befehl werden Sie dazu aufgefordert, das Vault-Passwort für diese Datei anzugeben. Dann wird Ihr standardmäßiger Terminal-Editor genutzt, um die Datei zur Bearbeitung zu öffnen. Speichern und schließen Sie die Datei nach dem Vornehmen der gewünschten Änderungen, woraufhin sie durch Ansible Vault automatisch verschlüsselt wird.
Jetzt haben Sie die Einrichtung Ihrer Variablendateien abgeschlossen. Im nächsten Schritt führen wir das Playbook aus, um Nginx, PHP-FPM und MariaDB (die zusammen mit einem Linux-basierten Betriebssystem wie Ubuntu den LEMP-Stack bilden) auf Ihrem bzw. Ihren Remoteservern einzurichten.
Bevor wir die Laravel-Demoanwendung auf den Remoteservern bereitstellen, müssen wir eine LEMP-Umgebung einrichten, die die Anwendung bereitstellen wird. Das Playbook server-setup.yml
enthält die zur Einrichtung erforderlichen Ansible-Rollen. Um dessen Inhalte zu inspizieren, führen Sie Folgendes aus:
- cat server-setup.yml
---
- hosts: all
become: true
roles:
- { role: setup, tags: ['setup'] }
- { role: mariadb, tags: ['mysql', 'mariadb', 'db', 'lemp'] }
- { role: php, tags: ['php', 'web', 'php-fpm', 'lemp'] }
- { role: nginx, tags: ['nginx', 'web', 'http', 'lemp'] }
- { role: composer, tags: ['composer'] }
Hier ist eine Übersicht über alle in diesem Playbook enthaltenen Rollen:
setup
: Enthält die Aufgaben, die zur Erstellung eines neuen Systembenutzers und Gewährung von sudo
-Berechtigungen sowie zur Aktivierung der ufw
-Firewall erforderlich sind.mariadb
: Installiert den MariaDB-Datenbankserver und erstellt die Anwendungsdatenbank sowie den Benutzer.php
: Installiert php-fpm
und PHP-Module, die zur Ausführung einer Laravel-Anwendung benötigt werden.nginx
: Installiert den Nginx-Webserver und ermöglicht Zugriff an Port 80
.composer
: Installiert Composer global.Beachten Sie, dass wir in jeder Rolle einige Tags eingerichtet haben. Dies soll es erlauben, bei Bedarf nur Teile dieses Playbooks neu auszuführen. Wenn Sie Änderungen an Ihrer Nginx-Vorlagendatei vornehmen, möchten Sie möglicherweise nur die Nginx-Rolle ausführen.
Der folgende Befehl führt dieses Playbook aus Ihrer Inventardatei auf allen Servern aus. --ask-vault-pass
ist nur erforderlich, falls Sie im vorherigen Schritt ansible-vault
verwendet haben, um verschiedene Variablendateien zu verschlüsseln:
- ansible-playbook -i hosts server-setup.yml -u root --ask-vault-pass
Sie werden eine Ausgabe sehen, die dieser ähnelt:
OutputPLAY [all] **********************************************************************************************
TASK [Gathering Facts] **********************************************************************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
TASK [setup : Install Prerequisites] ********************************************************************
changed: [203.0.113.0.101]
changed: [203.0.113.0.102]
...
RUNNING HANDLER [nginx : Reload Nginx] ******************************************************************
changed: [203.0.113.0.101]
changed: [203.0.113.0.102]
PLAY RECAP **********************************************************************************************
203.0.113.0.101 : ok=31 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
203.0.113.0.102 : ok=31 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
Ihre Knoten sind nun bereit, PHP-Anwendungen mit Nginx+PHP-FPM bereitzustellen, wobei MariaDB als Datenbankserver dient. Im nächsten Schritt werden wir die enthaltene Laravel-Demoanwendung mit dem Ansible-Playbook laravel-deploy.yml
bereitstellen.
Nachdem Sie auf Ihrem bzw. Ihren Remoteservern nun über eine funktionierende LEMP-Umgebung verfügen, können Sie das Playbook laravel-deploy.yml
ausführen. Dieses Playbook führt folgende Aufgaben aus:
sync
.acl
, um Berechtigungen für den Benutzer www-data für den Speicherordner festzulegen..env
auf Grundlage der Vorlage laravel-env.j2
ein.storage
ein.Dieses Playbook sollte von einem non-root user, aber mit sudo
-Berechtigungen ausgeführt werden. Dieser Benutzer sollte erstellt worden sein, als Sie im vorherigen Schritt das Playbook server-setup.yml
ausgeführt haben – unter Verwendung des Namens, der von der Variable remote_user
definiert wird.
Wenn Sie bereit sind, führen Sie das Playbook laravel-deploy.yml
aus mit:
- ansible-playbook -i hosts laravel-deploy.yml -u sammy --ask-vault-pass
--ask-vault-pass
ist nur erforderlich, falls Sie im vorherigen Schritt ansible-vault
verwendet haben, um Variablendateien zu verschlüsseln:
Sie werden eine Ausgabe sehen, die dieser ähnelt:
OutputPLAY [all] **********************************************************************************************
TASK [Gathering Facts] **********************************************************************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
TASK [Make sure the remote app root exists and has the right permissions] *******************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
TASK [Rsync application files to the remote server] *****************************************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
...
TASK [Run Migrations + Seeders] *************************************************************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
PLAY RECAP **********************************************************************************************
203.0.113.0.101 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
203.0.113.0.102 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Sobald die Ausführung abgeschlossen ist, können Sie auf die Demoanwendung zugreifen, indem Sie Ihren Browser auf den Domänennamen oder die IP-Adresse Ihres Knotens verweisen:
http://node_domain_or_IP
Sie sehen eine Seite wie diese:
Dieses Tutorial zeigt, wie Sie eine Ansible-Inventardatei einrichten, eine Verbindung mit Remoteknoten herstellen und Ansible-Playbooks ausführen, um einen LEMP-Server einzurichten und eine Laravel-Demoanwendung darauf bereitzustellen. Dieser Leitfaden ergänzt die Automatisierung der Servereinrichtung um Folien und Redemanuskripte des Ansible Workshop Kit und wird von einem beispielhaften GitHub-Repository begleitet, das alle erforderlichen Dateien zum Befolgen der Demokomponente des Workshops enthält.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.