Table of Contents
Einführung
Server-Automatisierung spielt aufgrund der Löschbarkeit von modernen Anwendungsumgebungen eine wesentliche Rolle bei der Systemverwaltung. Konfigurationsverwaltungs-Tools wie Ansible werden üblicherweise verwendet, um den Prozess der automatischen Servereinrichtung zu optimieren, indem Standardverfahren für neue Server festgelegt und menschliche Fehler in Zusammenhang mit manueller Einrichtung reduziert werden.
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.
Dieser Leitfaden erklärt, wie Sie die Schritte in unserem Leitfaden So installieren Sie Linux, Apache, MySQL und PHP (LAMP) auf Ubuntu 18.04 mit Ansible automatisieren können. Ein „LAMP“-Stack ist eine aus Open-Source-Software bestehende Gruppe, die normalerweise zusammen installiert wird, damit ein Server dynamische Websites und Web-Apps hosten kann. Dieser Begriff ist ein Acronym, das für das Linux Betriebssystem mit dem Apache Webserver steht. Die Daten dieser Site werden in einer MySQL-Datenbank gespeichert, und der dynamische Inhalt wird von PHP verarbeitet.
Voraussetzungen
Für die automatisierte Einrichtung anhand des Playbooks, das wir in diesem Leitfaden besprechen, benötigen Sie Folgendes:
- Einen Ansible-Steuerknoten: einen Ubuntu-18.04-Rechner, auf dem Ansible installiert und für die Verbindung mit Ihren Ansible-Hosts mittels SSH-Schlüsseln konfiguriert ist. Stellen Sie sicher, dass der Steuerknoten einen regelmäßigen Benutzer mit sudo-Berechtigungen und einer aktivierten Firewall hat, wie in unserem Leitfaden Ersteinrichtung des Servers ausgeführt ist. Um Ansible einzurichten, folgen Sie unserem Leitfaden So installieren und konfigurieren Sie Ansible auf Ubuntu 18.04.
- Einen oder mehrere Ansible-Hosts: einen oder mehrere Remote-Ubuntu-18.04-Server, die zuvor gemäß dem Leitfaden So verwenden Sie Ansible zur Automatisierung der Ersteinrichtung des Servers auf Ubuntu 18.04 eingerichtet wurden.
Gehen Sie zunächst sicher, dass Ihr Ansible-Steuerknoten sich verbinden und Befehle auf Ihrem/Ihren Ansible-Host(s) ausführen kann. Infos zu einem Verbindungstest finden Sie in Schritt 3 unter So installieren und konfigurieren Sie Ansible auf Ubuntu 18.04.
Welchen Zweck hat dieses Playbook?
Dieses Ansible-Playbook bietet eine Alternative zur manuellen Ausführung des Verfahrens, das in unserem Leitfaden So installieren Sie Linux, Apache, MySQL und PHP (LAMP) auf Ubuntu 18.04 beschrieben ist.
Eine Ausführung dieses Playbooks führt die folgenden Aktionen auf Ihren Ansible-Hosts durch:
- Installieren Sie
aptitude, das von Ansible als Alternative zum Paketmanageraptbevorzugt wird.
- Installieren Sie die erforderlichen LAMP-Pakete.
- Erstellen Sie einen neuen Apache
VirtualHostund richten Sie einen dedizierten Dokumentstamm dafür ein.
- Aktivieren Sie den neuen
VirtualHost.
- Deaktivieren Sie die Apache-Standard-Website, wenn die Variable disable_default auf
truegesetzt ist.
- Legen Sie das Passwort für den MySQL-Benutzer root fest.
- Entfernen Sie anonyme MySQL-Konten und die Testdatenbank.
- Richten Sie UFW ein, um HTTP-Verkehr auf dem konfigurierten Port (standardmäßig
80) zuzulassen.
- Richten Sie ein PHP-Testskript mithilfe der bereitgestellten Vorlage ein.
Wenn die Ausführung des Playbooks abgeschlossen ist, wird eine Web-PHP-Umgebung basierend auf den Optionen, die Sie in Ihren Konfigurationsvariablen definiert haben, auf Apache ausgeführt.
So verwenden Sie dieses Playbook
Als Erstes müssen Sie das LAMP-Playbook und seine Abhängigkeiten aus dem Repository do-community/ansible-playbooks abrufen. Klonen Sie dieses Repository in einen lokalen Ordner im Ansible-Steuerknoten.
Falls Sie dieses Repository bereits anhand eines anderen Leitfadens geklont haben, greifen Sie auf Ihre bestehende Kopie von ansible-playbooks zu und führen Sie den Befehl git pull aus, um sicherzustellen, dass Sie aktualisierten Inhalt haben:
[environment local]
cd ~/ansible-playbooks
git pull
Wenn Sie das Repository do-community/ansible-playbooks zum ersten Mal verwenden, klonen Sie zuerst das Repository in Ihren Basisordner mit:
[environment local]
cd ~
git clone https://github.com/do-community/ansible-playbooks.git
cd ansible-playbooks
Die Dateien, die wir brauchen, befinden sich im Ordner lamp_ubuntu1804, der die folgende Struktur hat:
lamp_ubuntu1804
├── files
│ ├── apache.conf.j2
│ └── info.php.j2
├── vars
│ └── default.yml
├── playbook.yml
└── readme.md
Hier ist eine Beschreibung jeder dieser Dateien:
files/info.php.j2: Vorlagendatei zur Einrichtung einer PHP-Testseite auf dem Stamm des Webservers
files/apache.conf.j2: Vorlagendatei zur Einrichtung des Apache VirtualHost.
vars/default.yml: Variablendatei zur Anpassung der Playbook-Einstellungen.
playbook.yml: Die Playbook-Datei mit Aufgaben zur Ausführung auf dem/den Remoteserver(n).
readme.md: Eine Textdatei mit Informationen über dieses Playbook.
Bearbeiten Sie die Variablendatei des Playbooks zur Anpassung der Konfigurationen sowohl von MySQL als auch von Apache. Greifen Sie auf das Verzeichnis lamp_ubuntu1804 zu und öffnen Sie die Datei vars/default.yml mit dem Befehlszeilen-Editor Ihrer Wahl:
[environment local]
cd lamp_ubuntu1804
nano vars/default.yml
Diese Datei enthält einige Variablen, die Ihrer Aufmerksamkeit bedürfen:
[label vars/default.yml]
[environment local]
---
mysql_root_password: "<^>mysql_root_password<^>"
app_user: "<^>sammy<^>"
http_host: "<^>your_domain<^>"
http_conf: "<^>your_domain<^>.conf"
http_port: "<^>80<^>"
disable_default: <^>true<^>
Die folgende Liste enthält eine kurze Erklärung jeder dieser Variablen und wie Sie diese ändern könnten:
mysql_root_password: Das gewünschte Passwort für das MySQL-Konto root.
app_user: Ein Remotebenutzer ohne Rootberechtigung auf dem Ansible-Host, der als Besitzer der Anwendungsdateien festgelegt wird.
http_host: Ihr Domänenname.
http_conf: Der Name der Konfigurationsdatei, die in Apache erstellt wird.
http://_port: HTTP-Port für diesen virtuellen Host, bei dem80die Standardeinstellung ist.
disable_default: Ob die Standard-Website von Apache deaktiviert werden soll oder nicht.
Sobald Sie mit der Aktualisierung der Variablen in vars/default.yml fertig sind, speichern und schließen Sie diese Datei. Wenn Sie nano verwendet haben, drücken Sie STRG+X, Y, dann die EINGABETASTE.
Sie können dieses Playbook jetzt auf einem oder mehreren Servern ausführen. Die meisten Playbooks werden standardmäßig auf jedem Server in Ihrem Inventar ausgeführt. Sie können die Markierung -l verwenden, um sicherzustellen, dass nur eine Teilmenge von Servern oder ein einzelner Server von dem Playbook betroffen ist. Sie können auch die Markierung -u verwenden, um anzugeben, welchen Benutzer Sie auf dem Remoteserver für die Verbindung und Ausführung der Playbook-Befehle auf den Remote-Hosts verwenden.
Um das Playbook nur auf <^>server1<^> mit Verbindung als <^>sammy<^> auszuführen, können Sie folgenden Befehl verwenden:
[environment local]
ansible-playbook playbook.yml -l <^>server1<^> -u <^>sammy<^>
Sie erhalten eine Ausgabe, die der folgenden ähnelt:
[secondary_label Output]
PLAY [all] *********************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************ok: [server1]
TASK [Install prerequisites] *********************************************************************************************************ok: [server1] => (item=aptitude)
...
TASK [UFW - Allow HTTP on port 80] *********************************************************************************************************
changed: [server1]
TASK [Sets Up PHP Info Page] *********************************************************************************************************
changed: [server1]
RUNNING HANDLER [Reload Apache] *********************************************************************************************************
changed: [server1]
RUNNING HANDLER [Restart Apache] *********************************************************************************************************
changed: [server1]
PLAY RECAP *********************************************************************************************************
server1 : ok=15 changed=11 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Anmerkung: Weitere Informationen zur Ausführung von Ansible-Playbooks finden Sie in unserem Leitfaden Ansible-Schummelzettel.
Wenn die Ausführung des Playbooks abgeschlossen ist, gehen Sie zu Ihrem Webbrowser und greifen Sie auf die Host- oder IP-Adresse des Servers zu, die in den Playbook-Variablen konfiguriert ist, gefolgt von /info.php:
http://<^>server_host_or_IP<^>/info.php
Sie sehen eine Seite wie diese:
Da diese Seite sensible Informationen über Ihre PHP-Umgebung enthält, wird empfohlen, diese vom Server zu entfernen, indem Sie den Befehl rm -f /var/www/info.php ausführen, sobald Sie mit der Einrichtung fertig sind.
Der Inhalt des Playbooks
Sie finden die LAMP-Server-Einrichtung in diesem Tutorial im Ordner lamp_ubuntu1804 im Repository the cloud provider Community Playbooks. Klicken Sie zum direkten Kopieren oder Herunterladen des Skript-Inhalts auf die Schaltfläche Raw im oberen Bereich jedes Skripts.
Der vollständige Inhalt des Playbooks sowie seine zugehörigen Dateien finden Sie ebenfalls hier.
vars/default.yml
Die Variablendatei default.yml enthält Werte, die in den Playbook-Aufgaben verwendet werden, wie z. B. das Passwort für das MySQL-Konto root und den Domänennamen für die Konfiguration mit Apache.
[label vars/default.yml]
[environment local]
---
mysql_root_password: "<^>mysql_root_password<^>"
app_user: "<^>sammy<^>"
http_host: "<^>your_domain<^>"
http_conf: "<^>your_domain<^>.conf"
http_port: "<^>80<^>"
disable_default: <^>true<^>
files/apache.conf.j2
Die Datei apache.conf.j2 ist eine Jinja 2-Vorlagendatei, die einen neuen Apache VirtualHost konfiguriert. Die in dieser Vorlage verwendeten Variablen sind in der Variablendatei vars/default.yml definiert.
[environment local]
[label files/apache.conf.j2]
<VirtualHost *:{{ http_port }}>
ServerAdmin webmaster@localhost
ServerName {{ http_host }}
ServerAlias www.{{ http_host }}
DocumentRoot /var/www/{{ http_host }}
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/{{ http_host }}>
Options -Indexes
</Directory>
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>
</VirtualHost>
files/info.php.j2
Die Datei info.php.j2 ist eine weitere Jinja-Vorlage, die für die Einrichtung eines Test-PHP-Skripts im Dokumentstamm des neu konfigurierten LAMP-Servers verwendet wird.
[environment local]
[label files/info.php.j2]
<?php
phpinfo();
playbook.yml
Alle Aufgaben dieser Einrichtung sind in der Datei playbook.yml definiert. Am Anfang werden die Gruppen von Servern definiert, die das Ziel dieser Einrichtung (all) sein sollen. Anschließend wird mit become: true definiert, dass Aufgaben standardmäßig mit Rechteausweitung (sudo) ausgeführt werden sollen. Dann enthält es die Variablendatei vars/default.yml, um Konfigurationsoptionen zu laden.
[label playbook.yml]
[environment local]
---
- hosts: all
become: true
vars_files:
- vars/default.yml
tasks:
- name: Install prerequisites
apt: name={{ item }} update_cache=yes state=latest force_apt_get=yes
loop: [ 'aptitude' ]
#Apache Configuration
- name: Install LAMP Packages
apt: name={{ item }} update_cache=yes state=latest
loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ]
- name: Create document root
file:
path: "/var/www/{{ http_host }}"
state: directory
owner: "{{ app_user }}"
mode: '0755'
- name: Set up Apache virtualhost
template:
src: "files/apache.conf.j2"
dest: "/etc/apache2/sites-available/{{ http_conf }}"
notify: Reload Apache
- name: Enable new site
shell: /usr/sbin/a2ensite {{ http_conf }}
notify: Reload Apache
- name: Disable default Apache site
shell: /usr/sbin/a2dissite 000-default.conf
when: disable_default
notify: Reload Apache
# MySQL Configuration
- name: Sets the root password
mysql_user:
name: root
password: "{{ mysql_root_password }}"
login_unix_socket: /var/run/mysqld/mysqld.sock
- name: Removes all anonymous user accounts
mysql_user:
name: ''
host_all: yes
state: absent
login_user: root
login_password: "{{ mysql_root_password }}"
- name: Removes the MySQL test database
mysql_db:
name: test
state: absent
login_user: root
login_password: "{{ mysql_root_password }}"
# UFW Configuration
- name: "UFW - Allow HTTP on port {{ http_port }}"
ufw:
rule: allow
port: "{{ http_port }}"
proto: tcp
# PHP Info Page
- name: Sets Up PHP Info Page
template:
src: "files/info.php.j2"
dest: "/var/www/{{ http_host }}/info.php"
handlers:
- name: Reload Apache
service:
name: apache2
state: reloaded
- name: Restart Apache
service:
name: apache2
state: restarted
Sie können diese Dateien an Ihre individuellen Bedürfnisse in Ihrem Workflow anpassen.
Zusammenfassung
In diesem Leitfaden haben wir den Prozess der Installation und Einrichtung einer LAMP-Umgebung auf einem Remoteserver mithilfe von Ansible automatisiert. Da jeder bei der Arbeit mit MySQL-Datenbanken und -benutzern in der Regel unterschiedliche Bedürfnisse hat, raten wir Ihnen, sich die offizielle Ansible-Dokumentation für weitere Informationen und Anwendungsfälle des Ansible-Moduls mysql_user anzusehen.
Wenn Sie weitere Aufgaben in dieses Playbook aufnehmen möchten, um Ihre Servereinrichtung weiter anzupassen, finden Sie diesbezügliche Informationen in unserer Ansible-Einführung Grundlagen des Konfigurationsmanagements: Ansible-Playbooks schreiben.