Ansible demo project
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
inventory
roles
.gitignore
Makefile
README.md
ansible.cfg
cluster.yml
security.yml

README.md

Ansible-Demo

Das ist eine kleine Ansible-Demonstration. Das Projekt richtet mit Ansible zunächst auf virtuellen Servern von DigitalOcean [1] eine beliebige Anzahl von identischen LAMP- bzw. Wordpress-Installationen auf der Basis von Debian 8 ein.

Die Maschinen werden dann mit Ansible zu einem Backup-System auf der Grundlage von Bacula [2] zusammenkonfiguriert: auf jedem Wordpress-Knoten wird automatisch ein Bacula-Agent (bacula-fd) installiert, auf dem dann von einem gleichzeitig eingerichteten eigenen Server mit Bacula-Director und Storage-Modul für regelmässige zentralisierte Backups zugegriffen wird. Per Voreinstellung wird von jedem Wordpress-Server jeweils um 23:50 ein Vollbackup gezogen, und jede volle Stunde ein inkrementelles Backup, bzw. beim ersten Backup jeweils zunächst auch ein Vollbackup.

Dafür gibt es im Projekt drei Rollen: wordpress-node, bacula-client und bacula-server.

Getestet mit Ansible 2.3.2.0.

Ausprobieren

  1. Ein DigitalOcean-Konto muss zur Verfügung stehen, und ein kleines Guthaben vorhanden sein (kann über Paypal in kleinen Schritten aufgeladen werden).

  2. Ein access token für DigitalOcean muss dann gewonnen werden, und zwar in der Web-Oberfläche unter API -> Generate New Token.

  3. Ihren Token tragen Sie dann unter access-token in inventory.cfg für das dynamische Inventory ein.

  4. Dann generieren Sie ein SSH-Schlüsselpaar mit dem Namen id_digitalocean:

$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_digitalocean
$ ls -1 ~/.ssh/id_digitalocean*
/home/aham/.ssh/id_digitalocean
/home/aham/.ssh/id_digitalocean.pub
  1. Der Kommandozeilen-Klient doctl eignet sich, um den öffentlichen Schlüssel bei DigitalOcean hochzuladen:
$ doctl compute ssh-key import id_digitalocean --public-key-file ~/.ssh/id_digitalocean.pub
ID        Name             FingerPrint
13265959  id_digitalocean  f3:4a:2c:1e:65:4b:c4:71:60:ca:e4:ee:86:0a:1f:c6

Das können Sie aber auch über die Web-Oberfläche erledigen. Der Klient muss erstmalig zunächst mit dem Token initialisiert werden mit: $ doctl auth init (das steht dann als access-token in ~/.config/doctl/config.yaml).

  1. Die zurückgegebene Schlüssel-ID tragen Sie dann einfach unter key-id in inventory.cfg für das dynamische Inventory ein.

Dynamisches Inventory

Dieses Projekt ist mit einem dynamischen Inventory für Ansible [3] in Python ausgestattet. Das Python-Skript lässt sich auch unabhängig ausführen. Es richtet bei Bedarf neue Hosts ein, und gibt immer ein JSON-Objekt mit dem aktuellen Maschineninventar zurück:

$ ./inventory.py
{"backup-node": {"hosts": ["165.227.174.37"]}, "wordpress-nodes": {"hosts": ["165.227.170.244", "165.227.166.4", "165.227.166.169"]}}
$ make purge
for i in $(doctl compute droplet list | awk '/ansible-demo/{print $(1)}'); do doctl compute droplet delete $i; done
$ /.inventory.py
{"backup-node": {"hosts": ["165.227.170.97"]}, "wordpress-nodes": {"hosts": ["165.227.158.64", "46.101.149.102", "138.68.76.109"]}}

Das Skript benötigt die Bibliothek koalalorenzo/python-digitalocean, wie sie jetzt auch als Debian-Paket verfügbar ist.

Die Anzahl der gewünschten Knoten für den Cluster ist in inventory.cfg angegeben, hier steht per Voreinstellung die Zahl 4 (drei Wordpress-Nodes und ein Backup-Server).

Bekanntes Problem: es kann eventuell zu einem SSH-Timeout mit Ansible und frisch eingerichteten (sich noch aufbauenden) Droplets kommen. Das timeout in ansible.cfg ist extra hoch eingestellt, um diesen Effekt abzufangen. In dem Fall kann ansible-playbook aber einfach neu ausgelöst werden.

Maschinen aufsetzen

Das Playbook cluster.yml setzt die Maschinen mit dem gewünschten Setup automatisch auf:

$ ansible-playbook cluster.yml --inventory=inventory.py --user=root --private-key=~/.ssh/id_digitalocean

Der gesamte Vorgang dauert einige Minuten. Jeder der Wordpress-Installationen kann nach Abschluss über einen Webbrowser angesteuert werden. Das beigefügte Makefile beinhaltet (neben verschiedenen Deployment-Abwandlungen) einige Ziele für den Umgang bzw. die Überprüfung des fertig installierten Clusters:

$ make <tab>
clean             deploy            deploy-security   login-wpnode      purge
debian-version    deploy-cluster    login-backupnode  ping              uname
$ make uname
ansible -i inventory.py all -m shell -a 'uname -a' -u root --private-key=~/.ssh/id_digitalocean
165.227.170.57 | SUCCESS | rc=0 >>
Linux backup-node 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 GNU/Linux

165.227.144.99 | SUCCESS | rc=0 >>
Linux wordpress-node2 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 GNU/Linux

207.154.201.243 | SUCCESS | rc=0 >>
Linux wordpress-node1 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 GNU/Linux

138.197.176.216 | SUCCESS | rc=0 >>
Linux wordpress-node3 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 GNU/Linux

Backup-Server

Auf dem Server mit dem Bacula-Director und der Storage kann mittels der bconsole der Status des Backup-Systems überprüft werden:

$ make login-backupnode 
ssh -i ~/.ssh/id_digitalocean root@`doctl compute droplet list | awk '/backup/{print $(3)}'`

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Sep 24 22:46:43 2017 from ipb218f4f4.dynamic.kabel-deutschland.de
root@backup-node:~# bconsole
Connecting to Director localhost:9101
1000 OK: director-66443 Version: 5.2.6 (21 February 2012)
Enter a period to cancel a command.
* status director
director-66443 Version: 5.2.6 (21 February 2012) x86_64-pc-linux-gnu debian jessie/sid
Daemon started 24-Sep-17 22:46. Jobs: run=0, running=0 mode=0,0
 Heap: heap=397,312 smbytes=38,677 max_bytes=42,838 bufs=161 max_bufs=162

Scheduled Jobs:
Level          Type     Pri  Scheduled          Name               Volume
===================================================================================
Incremental    Backup    10  24-Sep-17 23:00    wordpress-node1-defaultbackup *unknown*
Incremental    Backup    10  24-Sep-17 23:00    wordpress-node3-defaultbackup *unknown*
Incremental    Backup    10  24-Sep-17 23:00    wordpress-node2-defaultbackup *unknown*
Full           Backup    10  24-Sep-17 23:50    wordpress-node1-defaultbackup *unknown*
Full           Backup    10  24-Sep-17 23:50    wordpress-node2-defaultbackup *unknown*
Full           Backup    10  24-Sep-17 23:50    wordpress-node3-defaultbackup *unknown*

Ein Backup-Job kann auch manuell ausgelöst werden:

*run
Automatically selected Catalog: default
Using Catalog "default"
A job name must be specified.
The defined Job resources are:
     1: wordpress-node1-defaultbackup
     2: wordpress-node2-defaultbackup
     3: wordpress-node3-defaultbackup
Select Job resource (1-3): 1
Run Backup job
JobName:  wordpress-node1-defaultbackup
Level:    Incremental
Client:   wordpress-node1-fd
FileSet:  linux full
Pool:     default (From Job resource)
Storage:  default (From Job resource)
When:     2017-09-24 22:48:27
Priority: 10
OK to run? (yes/mod/no): yes
Job queued. JobId=1
You have messages.
*messages
24-Sep 22:48 director-66443 JobId 1: No prior Full backup Job record found.
24-Sep 22:48 director-66443 JobId 1: No prior or suitable Full backup found in catalog. Doing FULL backup.
24-Sep 22:48 director-66443 JobId 1: Start Backup JobId 1, Job=wordpress-node1-defaultbackup.2017-09-24_22.48.29_03
24-Sep 22:48 director-66443 JobId 1: Created new Volume "storage-0001" in catalog.
24-Sep 22:48 director-66443 JobId 1: Using Device "filestorage"
24-Sep 22:48 debian-8-x64-backup-sd JobId 1: Labeled new Volume "storage-0001" on device "filestorage" (/opt/bacula).
24-Sep 22:48 debian-8-x64-backup-sd JobId 1: Wrote label to prelabeled Volume "storage-0001" on device "filestorage" (/opt/bacula)
24-Sep 22:48 wordpress-node1-fd JobId 1:      /run is a different filesystem. Will not descend from / into it.
24-Sep 22:48 wordpress-node1-fd JobId 1:      /dev is a different filesystem. Will not descend from / into it.

Viel Spass beim Rumspielen. Tip: die entscheidenden Templates für Bacula liegen in roles/bacula-server/templates. Das gesamte System kann jederzeit mit make purge gelöscht, und mit make deploy immer wieder auf neuen Hosts frisch aufgesetzt werden.

Literaturhinweise

[1] Michael Plura: Im Schnellverfahren: Droplets von DigitalOcean - virtuelle private Server auf Knopfdruck. In: iX 10/2014, S. 78-79

[2] Tilman Wittenhorst: Kluge Vorratshaltung: Daten sichern mit Bacula 7. In: iX Kompakt 2014 "Open-Source-Administration", S. 67-71

[3] Jeff Gerling: Ansible for DevOps: Server and configuration management for humans. Leanpub 2015, S. 124 sq.: Ephemeral infrastructure