Übung: Ansible
Hello Ansible
Ziel der Übung ist es, eine neue virtuelle Maschine zu erstellen, in der das Programm htop installiert ist. Statt manuell zu installieren, können Sie ein einfaches Ansible Playbook verwenden. Als Infrastruktur-Management nutzen Sie wieder Vagrant. Einer der von Vagrant unterstützten Provisioner ist Ansible, so dass Sie sich in der Übung ganz auf das Ansible Playbook konzentrieren können.
Source Code
Vagrant.configure('2') do |config|
config.vm.box = "gyptazy/ubuntu22.04-arm64"
# Install Ansible on the guest
config.vm.provision 'shell', inline: 'apt update && apt -y install ansible'
config.vm.provision 'ansible_local' do |ansible|
ansible.playbook = 'playbook.yml'
end
end
Anmerkung:
Die folgende Zeile ist nötig, weil die VM (Vagrant Box), mit der wir diese Übung absolvieren, kein Python installiert hat:
config.vm.provision 'shell', inline: '...'Dieses Bootstrap-Problem lässt sich nicht mit Ansible lösen, weil dafür ja zunächst Python nötig wäre. Vagrant ermöglicht aber auch Provisionierung mit anderen Techniken. Hier benutzen wir den
shell-Provisioner, um vor dem Provisionieren mit Ansible den notwendigen Python-Interpreter zu deployen.
Das dazugehörige Playbook sieht so aus:
---
- hosts: all
become: true
tasks:
- name: tree ist installiert
apt:
name: tree
update_cache: yes
Anleitung
- Erstellen Sie ein neues Verzeichnis für dieses Lab, z.B. mit
mkdir -p ~/workspace/webservices/ansible - Starten Sie eine Shell und wechseln Sie in das eben erstellte Verzeichnis, z.B. mit
cd ~/workspace/webservices/ansible - Legen Sie eine neue Datei
Vagrantfilean und kopieren Sie den obigen Inhalt hinein. - Legen Sie eine neue Datei
playbook.ymlan und kopieren Sie den entsprechenden Inhalt hinein. -
Starten Sie die VM mit
vagrant up. Das Playbook und die darin enthaltenen Anweisung werden ausgeführt.Prüfen Sie die Ausgabe. Eine der letzten Zeilen der Ausgabe zeigt eine kurze Rückschau auf den Ablauf (play recap). Hier ist insbesondere die Anzahl der Tasks, die zu Veränderungen geführt haben (
changed=1), interessant:PLAY RECAP ********************************************************************* default : ok=2 changed=1 unreachable=0 failed=0 -
Überprüfen Sie den Status mit
vagrant status. Sie sollten in etwa folgende Ausgabe sehen:Current machine states: default running (virtualbox) -
Führen Sie das Playbook erneut mit
vagrant provisionaus und beobachten Sie, dass Rückschau auf den Ablauf (play recap) die Anzahl der Tasks, die zu Veränderungen geführt haben, jetzt mitchanged=0anzeigt, d.h. die VM war bereits in exakt dem Zustand, den das Playbook beschreibt. dass das Programmtreenicht erneut installiert wurde, ist eine entscheidende Folge der Idempotenz von Playbooks.PLAY RECAP ********************************************************************* default : ok=2 changed=0 unreachable=0 failed=0 - Prüfen Sie, ob die Installation erfolgreich war, indem Sie sich per
vagrant sshin die VM einloggen und danntreeausführen.
Fragen zur Kontrolle
-
Wie viele Tasks kann ein Playbook enthalten?
-
Woran erkennen Sie, ob ein Task eine Änderung des Zustandes der VM ausgelöst hat?
Fehlermeldungen
-
fatal: [default]: FAILED! => {"changed": false, "failed": true, "module_stderr": "Shared connection to 127.0.0.1 closed.\\r\\n", "module_stdout": "/bin/sh: /usr/bin/python: not found\\r\\n", "msg": "MODULE FAILURE", "rc": 0}Diese Fehlermeldung erscheint, wenn Ansible auf der Zielmaschine keinen Python-Interpreter finden konnte. Stellen Sie sicher, dass beim ersten Start der VM folgende Zeile im
Vagrantfileaktiv ist (nicht auskommentiert):config.vm.provision 'shell', inline: '...' -
Dateien in
/vagrantnicht aktuell? Rufen Sievagrant rsyncauf, um eine Synchronisation zu erzwingen.
Statische Website
In dieser Übung bauen Sie das Playbook aus, um eine statische Website auf einer VM zu deployen. Dafür sind die folgenden Schritte nötig:
- Web Server installieren
- HTML-Dateien kopieren
Da die VM aus dem vorigen Beispiel bereits existiert, müssen Sie nach einer Änderung am Playbook lediglich vagrant provision aufrufen, um das Playbook erneut auszuführen.
Source Code
Vagrantfile:
Vagrant.configure('2') do |config|
config.vm.box = "gyptazy/ubuntu22.04-arm64"
# Install Ansible on the guest
config.vm.provision 'shell', inline: 'apt update && apt -y install ansible'
config.vm.network 'forwarded_port', guest: 80, host: 8080
config.vm.provision 'ansible_local' do |ansible|
ansible.playbook = 'playbook.yml'
end
end
Beachten Sie, dass wir eine neue Zeile in der Konfiguration eingefügt haben, um den Port 80 (Web Server) von der VM auf den Host weiterzuleiten. Außerhalb dieser Übung ist das nicht nötig, da die VM meist eine eigene IP-Adresse erhält und darüber erreichbar ist.
nginx Konfiguration default (Datei neben playbook.yml):
server {
listen 80 default_server;
listen [::]:80 default_server;
root /usr/share/nginx/html;
}
Das dazugehörige Playbook sieht so aus:
---
- hosts: all
become: true
tasks:
- name: Web Server ist installiert
apt:
name: nginx
- name: Konfiguration ist aktuell
copy:
src: default
dest: /etc/nginx/sites-available/
notify:
- Webserver-Konfiguration geändert
- name: Web Server läuft und wird beim Booten gestartet
service:
name: nginx
state: started
enabled: yes
- name: Document root ist vorhanden
copy:
src: html
dest: /usr/share/nginx/
handlers:
- name: Webserver-Konfiguration geändert
service:
name: nginx
state: restarted
Überlegen Sie, woher die HTML-Datei im obigen Beispiel kommt und legen sie den entsprechenden lokalen Ordner an.
Anleitung
- Modifizieren Sie
Vagrantfileundplaybook.ymlwie oben angegeben. - Legen Sie die HTML-Datei an.
- Führen Sie das Deployment mit
vagrant provisionaus. - Gehen Sie in einem Web Browser zur Adresse http://localhost:8080/. Es sollte eine Website gezeigt werden.
- Überprüfen Sie das
access.logdes Web Servers:- Melden Sie sich mit
vagrant sshan der VM an - Zeigen Sie das Logfile an:
tail -f /var/log/nginx/. Neue Requests im Web Browser sollen jeweils zu einem neuen Eintrag führen. - Verlassen Sie
tailmit Control-C und die VM mitexitoderControl-D.
- Melden Sie sich mit
Fragen zur Kontrolle
-
Welche Datei muss geändert werden, um
apachestattnginxals Web Server zu verwenden? -
Was muss am Playbook verändert werden, damit ein zusätzliches Bild mit in die VM kopiert wird?
Templating
Auf Basis der vorherigen Beispiele können Sie das Playbook jetzt so verändern, dass die HTML-Datei nicht nur kopiert, sondern auch der Inhalt angepasst wird. In der Vorlesung haben wir dazu das Konzept von Variablen und Templates kennengelernt.
Source Code
Vagrantfile:
Vagrant.configure('2') do |config|
config.vm.box = "gyptazy/ubuntu22.04-arm64"
# Install Ansible on the guest
config.vm.provision 'shell', inline: 'apt update && apt -y install ansible'
config.vm.network 'forwarded_port', guest: 80, host: 8080
config.vm.provision 'ansible_local' do |ansible|
ansible.playbook = 'playbook.yml'
end
end
playbook.yml:
---
- hosts: all
become: true
tasks:
- name: Web Server ist installiert
apt:
name: nginx
update_cache: yes
- name: Konfiguration ist aktuell
copy:
src: default
dest: /etc/nginx/sites-available/
notify:
- Webserver-Konfiguration geändert
- name: Web Server läuft und wird beim Booten gestartet
service:
name: nginx
state: started
enabled: yes
- name: Document root ist vorhanden
copy:
src: html
dest: /usr/share/nginx/
- name: index.html gerendert
template:
src: html/index.html.j2
dest: /usr/share/nginx/html/index.html
handlers:
- name: Webserver-Konfiguration geändert
service:
name: nginx
state: restarted
Anleitung
- Modifizieren Sie das vorherige Beispiel so, dass die HTML-Datei nicht kopiert, sondern durch Templating erstellt wird.
- Ändern Sie die
index.htmlso, dass in der Fußzeile das Datum des Deployments erscheint. Sie können dazu die Ansible-Variableansible_date_time.iso8601verwenden. - Ändern Sie das Playbook, so dass zusätzlich zum Kopieren des HTML-Ordners auch die
index.htmlals Template interpretiert wird. - Führen Sie das Deployment mit
vagrant provisionaus. - Gehen Sie in einem Web Browser zur Adresse http://localhost:8080/. Der Footer der Website sollte jetzt einen Text analog zu dem folgenden enthalten:
Statische Website gebaut mit Pure.css am 2017-10-07T21:37:02Z
Fragen zur Kontrolle
-
Wie heißt die Templating-Sprache, die Ansible verwendet?
-
Welche Schritte sind notwendig, um eine Variable im CSS-File zu verwenden?
Literatur
Aufräumen
-
Löschen Sie die erstellten VMs und deren virtuelle Festplatten mit dem folgenden Kommando:
$ vagrant destroy -f -
Überprüfen Sie, dass keine VM mehr existiert:
$ vagrant status Current machine states: default not created (virtualbox)
Sie können die Überprüfung auch in der GUI ausführen; virtualbox sollte keine VMs anzeigen.
Hinweise Linux-Labor
- Nur dieser Kurs darf VirtualBox im Rahmen der Vorlesung “Web Services” benutzen. Ihre Quota wurde dafür angehoben und wird nach Abschluss des Kurses wieder auf den Standard-Wert zurückfallen.
- Die virtuellen Festplatten werden sehr groß und sind jederzeit durch Ihren Quellcode reproduzierbar, so dass sie nicht im Backup enthalten sind. Stellen Sie sicher, dass Sie ihren Quellcode (
Vagrantfileetc.) auf Ihrem persönlichen Laufwerk halten, wo es dem Backup unterliegt. - Die virtuellen Festplatten müssen nach Abschluss des Kurses gelöscht werden.
- In VirtualBox dürfen nur NAT-Netzwerkkarten benutzt werden.
Vagrantmacht das von sich aus; diese Einstellung darf nicht verändert werden.