Tutorial

So installieren und richten Sie LAMP auf Ubuntu 18.04 mit Ansible ein

ApachePHPLAMP StackAnsibleAutomated Setups

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:

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:

  1. Installieren Sie aptitude, das von Ansible als Alternative zum Paketmanager apt bevorzugt wird.
  2. Installieren Sie die erforderlichen LAMP-Pakete.
  3. Erstellen Sie einen neuen Apache VirtualHost und richten Sie einen dedizierten Dokumentstamm dafür ein.
  4. Aktivieren Sie den neuen VirtualHost.
  5. Deaktivieren Sie die Apache-Standard-Website, wenn die Variable disable_default auf true gesetzt ist.
  6. Legen Sie das Passwort für den MySQL-Benutzer root fest.
  7. Entfernen Sie anonyme MySQL-Konten und die Testdatenbank.
  8. Richten Sie UFW ein, um HTTP-Verkehr auf dem konfigurierten Port (standardmäßig 80) zuzulassen.
  9. 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:

  • 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:

  • 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:

  • cd lamp_ubuntu1804
  • nano vars/default.yml

Diese Datei enthält einige Variablen, die Ihrer Aufmerksamkeit bedürfen:

vars/default.yml
---
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 dem 80 die 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:

  • ansible-playbook playbook.yml -l server1 -u sammy

Sie erhalten eine Ausgabe, die der folgenden ähnelt:

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:

phpinfo page

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 DigitalOcean 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.

vars/default.yml
---
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.

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.

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.

playbook.yml

---
- 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.

Creative Commons License