Server

So stellen Sie eine statische HTML-Website mit Ansible unter Ubuntu 20.04 (Nginx) bereit

In diesem Teil der Serie werden Sie das bisher Gesehene verwenden, um ein Playbook zu erstellen, das die Einrichtung eines Remote-Nginx-Servers zum Hosten einer statischen HTML-Website unter Ubuntu 20.04 automatisiert.

Beginnen Sie damit, ein neues Verzeichnis auf Ihrem Ansible-Kontrollknoten zu erstellen, in dem Sie die Ansible-Dateien und eine statische HTML-Demo-Website einrichten, die auf Ihrem Remote-Server bereitgestellt werden soll. Dies kann an einem beliebigen Ort innerhalb Ihres Home-Ordners sein. In diesem Beispiel verwenden wir ~/ansible-nginx-demo.

mkdir ~/ansible-nginx-demo
 cd ~/ansible-nginx-demo

Kopieren Sie als nächstes Ihre vorhandene Inventardatei in das neue Verzeichnis. In diesem Beispiel verwenden wir das gleiche Inventar, das Sie zu Beginn dieser Serie eingerichtet haben:

cp ~/ansible-practice/inventory .

Dies kopiert eine Datei namens inventory aus einem Ordner namens ansible-practice in Ihrem Home-Verzeichnis und speichert sie im aktuellen Verzeichnis.

Beschaffung der Demo-Website

Für diese Demonstration verwenden wir eine statische HTML-Website, die Gegenstand unserer Reihe How To Code in HTML ist. Laden Sie zunächst die Dateien der Demo-Website herunter, indem Sie den folgenden Befehl ausführen:

curl -L https://github.com/do-community/html_demo_site/archive/refs/heads/main.zip -o html_demo.zip

Sie benötigen unzip, um den Inhalt dieses Downloads zu entpacken. Um sicherzustellen, dass Sie dieses Tool installiert haben, führen Sie aus:

sudo apt install unzip

Entpacken Sie dann die Dateien der Demo-Website mit:

unzip html_demo.zip

Dadurch wird ein neues Verzeichnis namens html_demo_site-main in Ihrem aktuellen Arbeitsverzeichnis erstellt. Sie können den Inhalt des Verzeichnisses mit einem ls -la-Befehl überprüfen:

ls -la html_demo_site-main

Erstellen einer Vorlage für die Konfiguration von Nginx

Sie werden nun die Nginx-Vorlage einrichten, die für die Konfiguration des Remote-Webservers erforderlich ist. Erstellen Sie einen neuen Ordner in Ihrem ansible-demo-Verzeichnis, um Nicht-Playbook-Dateien zu speichern:

mkdir files

Öffnen Sie dann eine neue Datei namens nginx.conf.j2:

nano files/nginx.conf.j2

Diese Vorlagendatei enthält eine Nginx-Server-Blockkonfiguration für eine statische HTML-Website. Sie verwendet drei Variablen: document_root, app_root und server_name. Wir werden diese Variablen später beim Erstellen des Playbooks definieren. Kopieren Sie den folgenden Inhalt in Ihre Vorlagendatei:

~/ansible-nginx-demo/files/nginx.conf.j2

server {
   listen 80;
 root {{ document_root }}/{{ app_root }};
   index index.html index.htm;
 server_name {{ server_name }};
 location / {
    default_type "text/html";
    try_files $uri.html $uri $uri/ =404;
   }
 }

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Erstellen eines neuen Ansible-Playbooks

Als Nächstes erstellen wir ein neues Ansible-Playbook und richten die Variablen ein, die wir im vorherigen Abschnitt dieses Handbuchs verwendet haben. Öffnen Sie eine neue Datei namens playbook.yml:

nano playbook.yml

Dieses Playbook beginnt mit der Hosts-Definition, die auf all gesetzt ist, und einer become-Direktive, die Ansible anweist, alle Aufgaben standardmäßig als Root-Benutzer auszuführen (wie bei der manuellen Ausführung von Befehlen mit sudo). Im var-Abschnitt dieses Playbooks werden wir drei Variablen erstellen: server_name, document_root und app_root.

Diese Variablen werden in der Nginx-Konfigurationsvorlage verwendet, um den Domain-Namen oder die IP-Adresse einzurichten, auf die dieser Webserver antwortet, sowie den vollständigen Pfad, unter dem sich die Website-Dateien auf dem Server befinden.

Für diese Demo verwenden wir die Faktvariable ansible_default_ipv4.address, da sie die öffentliche IP-Adresse des Remote-Servers enthält. Sie können diesen Wert jedoch durch den Hostnamen Ihres Servers ersetzen, falls dieser über einen Domain-Namen verfügt, der in einem DNS-Dienst ordnungsgemäß konfiguriert ist und auf diesen Server verweist:

~/ansible-nginx-demo/playbook.yml

---
- hosts: all
    become: yes
    vars:
      server_name: "{{ ansible_default_ipv4.address }}"
      document_root: /var/www/html
      app_root: html_demo_site-main
    tasks: 

Sie können diese Datei vorerst geöffnet lassen. In den nächsten Abschnitten werden Sie durch alle Aufgaben geführt, die Sie in dieses Playbook aufnehmen müssen, damit es voll funktionsfähig ist.

Installieren der erforderlichen Pakete
Die folgende Aufgabe aktualisiert den apt-Cache und installiert dann das nginx-Paket auf den Remote-Knoten:

~/ansible-nginx-demo/playbook.yml

. . .
     - name: Update apt cache and install Nginx
       apt:
         name: nginx
         state: latest
         update_cache: yes

Hochladen von Website-Dateien auf entfernte Knoten

In der nächsten Aufgabe wird das eingebaute Modul copy verwendet, um die Website-Dateien in den entfernten Dokumentstamm hochzuladen. Wir verwenden die Variable document_root, um das Ziel auf dem Server festzulegen, wo der Anwendungsordner erstellt werden soll.

~/ansible-nginx-demo/playbook.yml

. . .
     - name: Copy website files to the server's document root
       copy:
         src: "{{ app_root }}"
         dest: "{{ document_root }}"
         mode: preserve

Anwenden und Aktivieren der benutzerdefinierten Nginx-Konfiguration

Jetzt wenden wir die Nginx-Vorlage an, die den Webserver für das Hosten Ihrer statischen HTML-Datei konfiguriert. Nachdem die Konfigurationsdatei unter /etc/nginx/sites-available gesetzt wurde, erstellen wir einen symbolischen Link zu dieser Datei in /etc/nginx-sites-enabled und benachrichtigen den Nginx-Dienst für einen späteren Neustart. Der gesamte Prozess erfordert zwei separate Aufgaben:

~/ansible-nginx-demo/playbook.yml

. . .
     - name: Apply Nginx template
       template:
         src: files/nginx.conf.j2
         dest: /etc/nginx/sites-available/default
       notify: Restart Nginx
 - name: Enable new site
   file:
     src: /etc/nginx/sites-available/default
     dest: /etc/nginx/sites-enabled/default
     state: link
   notify: Restart Nginx 

Erlauben von Port 80 auf UFW

Fügen Sie als nächstes die Aufgabe ein, die den tcp-Zugriff auf Port 80 ermöglicht:

~/ansible-nginx-demo/playbook.yml

. . .
     - name: Allow all access to tcp port 80
       ufw:
         rule: allow
         port: '80'
         proto: tcp
 . . .

Erstellen eines Handlers für den Nginx-Dienst

Um dieses Playbook abzuschließen, muss nur noch der Handler “Restart Nginx” eingerichtet werden:

~/ansible-nginx-demo/playbook.yml

. . .
   handlers:
     - name: Restart Nginx
       service:
         name: nginx
         state: restarted

Ausführen des fertigen Playbooks

Wenn Sie alle erforderlichen Aufgaben in Ihre Wiedergabedatei aufgenommen haben, sieht sie wie folgt aus:

~/ansible-nginx-demo/playbook.yml


 hosts: all
 become: yes
 vars:
 server_name: "{{ ansible_default_ipv4.address }}"
 document_root: /var/www
 app_root: html_demo_site-main
 tasks:
 name: Update apt cache and install Nginx
 apt:
 name: nginx
 state: latest
 update_cache: yes
 name: Copy website files to the server's document root
 copy:
 src: "{{ app_root }}"
 dest: "{{ document_root }}"
 mode: preserve
 name: Apply Nginx template
 template:
 src: files/nginx.conf.j2
 dest: /etc/nginx/sites-available/default
 notify: Restart Nginx
 name: Enable new site
 file:
 src: /etc/nginx/sites-available/default
 dest: /etc/nginx/sites-enabled/default
 state: link
 notify: Restart Nginx
 name: Allow all access to tcp port 80
 ufw:
 rule: allow
 port: '80'
 proto: tcp
 handlers:
 name: Restart Nginx
 service:
 name: nginx
 state: restarted 

Um dieses Playbook auf dem/den Server(n) auszuführen, den/die Sie in Ihrer Inventardatei eingerichtet haben, führen Sie ansible-playbook mit denselben Verbindungsargumenten aus, die Sie beim Ausführen eines Verbindungstests in der Einführung dieser Serie verwendet haben.

Hier verwenden wir eine Inventardatei namens inventory und den Benutzer sammy, um eine Verbindung zum Remote-Server herzustellen. Da für die Ausführung des Playbooks sudo erforderlich ist, fügen wir auch das Argument -K ein, um das sudo-Passwort des Remote-Benutzers anzugeben, wenn Ansible dazu auffordert:

ansible-playbook -i inventory playbook.yml -u sammy -K

Sie erhalten dann eine Ausgabe wie diese:

Sobald das Playbook fertig ist, gehen Sie zu Ihrem Browser und rufen den Hostnamen oder die IP-Adresse Ihres Servers auf.

Herzlichen Glückwunsch, Sie haben die Bereitstellung einer statischen HTML-Website auf einem entfernten Nginx-Server mit Ansible erfolgreich automatisiert.

Wenn Sie Änderungen an einer der Dateien in der Demo-Website vornehmen, können Sie das Playbook erneut ausführen und die Kopieraufgabe stellt sicher, dass alle Datei-Änderungen auf dem Remote-Host berücksichtigt werden. Da Ansible ein idempotentes Verhalten hat, werden durch das mehrmalige Ausführen des Playbooks keine Änderungen ausgelöst, die bereits am System vorgenommen wurden.