Virtuelle Host Dateien von Apache mit Ansible verwalten

Auf einem Webserver kommen schnell unterschiedliche Dienste zusammen die man besser über virtuelle Host trennt. Für Apache muss hierzu eine bestimmte Konfigurationsdatei erstellt werden. Eine Möglichkeit dies zu bewerkstelligen ist es, eine meistens webbasierte Verwaltungsanwendung wie Webmin zu verwenden. Da ich solche Anwendungen nicht mag (wieder eine Anwendung mehr die man aktualisieren und überwachen muss) verwalte ich bisher alle meine Konfigurationen “manuell” über SSH. Das ist zwar “etwas fummeliger” aber am Ende auch nicht so schwierig. Bei ein oder zwei virtuellen Hosts geht das auch noch aber dann wird es unübersichtlich.

Wie bereits hier beschrieben möchte ich Ansible verwenden um dies zu automatisieren. Den genauen Funktionsumfang möchte ich hier nicht erklären, sondern nur meine notwendigen Schritte.

Die meisten vorhandenen Ansible Playbooks gehen von einem “nacktem” Standard Server aus. Dies ist bei mir nicht mehr der Fall und das Ansible Playbook muss es ermöglichen verschiedene Hostdefinitionen für PHP, Perl, HTML Server mit/und/oder SSL zu erstellen. Das folgende Playbook scheint dies zu erreichen. Der hier vorgestellte Ansatz beruht im wesentlichem auf diesem und diesem Dokument.

Zu erst das Playbook. Dort setzte ich im Abschnitt Vars die Variablen die ich später in der VHost Konfiguration brauche. Im Template kann ich dann über die Abrage “if item ‘Variable’ is defined” hostspezifische Variablen setzen.

vi vhost.yml 

---
- hosts: www.server1.de 
  sudo: yes
  vars:
    apache_vhosts_enabled:
    - servername: "www.server1.de "
      serveralias: "server1.de "
      serveradmin: "admin@server1.de "
      SuexecUserGroup: "server1user server1group"
      documentrootdir: "server1.de/public_html"
      logrootdir: "server1/logs"
      InternalAlias: "server1
      Options: "Indexes MultiViews -Includes -FollowSymLinks +ExecCGI"
      DirectoryIndex: "index.html"
      SSLCertificateFile: "path-to-cert.cert.pem"
      SSLCertificateKeyFile: "path-to-key.de.key.pem"
      SSLCACertificateFile: "path-to-CA.."
      SSLVerifyClient: "require"
  tasks:
  - name: Create a VirtualHost file for each enabled VirtualHost
    template:
      src=vhost.j2
      dest="/etc/apache2/sites-available/"{{ item.servername }} 
      owner=root
      group=root
      mode=0644
    with_items: apache_vhosts_enabled

Die relevanten Auszüge im Template sehen so aus.

vi vhost.j2 
    <VirtualHost *:443>
        ServerName {{ item.servername }}
        DocumentRoot /var/www/{{ item.documentrootdir }}
        ServerAdmin {{ item.serveradmin }}
        SuexecUserGroup  {{  item.SuexecUserGroup }}
        DirectoryIndex  {{ item.DirectoryIndex }}
        <Directory "/var/www/{{ item.documentrootdir }}">
            Options {{ item.Options }}
            Order allow,deny
            allow from all
        </Directory>
        CustomLog /var/www/{{ item.logrootdir }}/access.log common
        ErrorLog /var/www/{{ item.logrootdir }}/error.log
        SSLEngine on
{% if item.SSLVerifyClient is defined %}
        SSLVerifyClient require
        SSLVerifyDepth  1
{% endif %}
        SSLCertificateFile /etc/ssl/{{ item.SSLCertificateFile }}
        SSLCertificateKeyFile /etc/ssl/{{ item.SSLCertificateKeyFile }}
        SSLCACertificateFile /etc/ssl/{{ item.SSLCACertificateFile }}
        SSLProtocol All -SSLv2 -SSLv3
        ....
    ....
</VirtualHost>

Über den Befehl

ansible-playbook vhost.yml 

wird dann die Datei aus dem Template und den Variablen zusammengesetzt und über SSH auf dem Server deployed. Man könnte das Playbook jetzt auch noch erweitern das automatisch der Apache einen Reload macht aber am Anfang möchte ich die Ergebnisse erst noch einmal manuell prüfen bevor sie “scharf geschaltet” werden.

Dies ist mein erster Server den ich so konfiguriere und über die Variablen im Playbook und die “is defined” Abfragen im Template werden nach und nach noch weitere Server aufgenommen.