Im beruflichen Alltag eines Informatikers muss man immer wieder verschiedenste Server- bzw. Testumgebungen installieren. Hier ist also großes Potenzial da, Zeit einzusparen.
Aus diesem Grund habe ich vor einiger Zeit angefangen mich mit Ansible zu beschäftigen und will hier heute den Anfang für die automatisierte Installation eines LAMP Stacks machen. Als erste wollen wir hier die Ansible httpd Role erstellen. Voraussetzung hierfür ist eine Funktionierende Ansible Installation auf dem Server und ein Test der ssh Verbindung zum Zielserver.
Inhaltsverzeichnis
Ansible Struktur für die httpd Role
Als erste schauen wir uns an, wie man am besten die Ordnersturktur für eine Ansible Role aufbaut. Dabei habe ich mich an die Best Practices der Ansible Dokumentation gehalten, habe aber Ordner die ich erstmal nicht brauche weggelassen.
1 2 3 4 5 6 7 | Christian @ ~/Documents/GitHub/ansible-role/httpd * master [19] → tree . ├── defaults │ └── main.yml └── tasks └── main.yml |
Anlegen der Ansible httpd Role tasks/main.yml
Wir starten nun damit, dass wir die Installation des httpd Servers in der tasks/main.yml definieren. Der erste Block sieht dann wie folgt aus:
1 2 3 4 5 6 | - name: yum | install httpd yum: name={{ item }} with_items: - httpd - httpd-tools when: ansible_pkg_mgr == "yum" |
name:
Hier gebe wir einen Text an, der bei einem Lauf von Ansible auf dem Terminal ausgegeben werden soll. Dies ist wichtig falls ein Fehler auftritt. So weis man direkt an welcher Stelle man suche muss.
yum:
An dieser Stelle wird definiert, welche Pakete mit dem Paketmanager yum installiert werden sollen. {{ item }} ist dabei ein Platzhalter für die Paketnamen die im nächsten Schritt definiert werden.
with_items:
Lister der zu installierenden Pakete für den Paketmanager.
when:
Mit when prüft man ob bestimmte Bedingungen zutreffen. An dieser Stelle zum Beispiel ob auf dem Zielsystem der Paketmanager yum verwendet wird.
Weiter geht es mit dem Zweiten Block. Hier installieren wir das Module fcgid.
1 2 3 4 5 6 | - name: yum | install of fcgid yum: name={{ item }} with_items: - mod_fcgid - mod_ruid2 when: ansible_pkg_mgr == "yum" and ( use_perl or use_fcgid ) |
Die meisten Funktionen sind analog zum Ersten Block. Der einzige Unterschied ist hier, dass der when Bereich erweitert wurde. Hier wird als erstes wieder geprüft ob es sich um den Paketmanager yum handelt. Im zweiten Schritt wird geprüft ob die Variable use_per oder use_fcgid wahr ist. Diese Variablen werden im zweiten Teil des Artikels in der defaults/main.yml definiert.
Im dritten Block der tasks/main.yml aktivieren wir nun einige httpd Module.
1 2 3 4 5 6 7 8 9 | - name: Enable common httpd modules apache2_module: name={{ item }} with_items: - proxy - proxy_fcgi - rewrite - filter - deflate - headers |
Hier haben wir eine neue Funktion.
apache2_module:
Mit dieser Funktion werden die übergebende Module für httpd aktiviert werden.
Kommen wir nun zum Vierten und letzten Block. Hier werden die Perl/fcgid Module aktiviert, fall die entsprechende Variable use_per oder use_fcgid wahr ist.
1 2 3 4 5 6 7 | - name: Enable fcgid httpd module apache2_module: name={{ item }} with_items: - cgi - fcgid - suexec when: use_perl or use_fcgid |
Anlegen der Ansible Apache Role defaults/main.yml
Nachdem wir die Tasks für die Ansible httpd Role definiert haben, legen wir nun noch ein paar Variablen in der defaults/main.yml fest. Das ganze sieht dann so aus:
1 2 3 4 5 | Christian @ ~/Documents/GitHub/ansible-role/apache/defaults * master [29] → cat main.yml use_perl: false use_fcgid: false |
Ich habe hier den Standardwert auf false gesetzt, damit nicht auf jedem System unnötig Module installiert werden.
Damit sind wir mit der Definition der Ansible httpd Role soweit fertig. Wir werden diese im nächsten Schritt testen.
Testen der Ansible httpd Role auf einem CentOS 7
Nach einer Änderung an einer Ansible Role ist es immer sinnvoll diese direkt zu testen. Gerade wenn die Dateien länger werden, übersieht man gerne mal eine Abhängigkeit und der ganze Ansible lauf funktioniert nicht mehr.
Für das Testen der Role legen wir eine site.yml und eine hosts Datei an.
site.yml:
1 2 3 4 5 | - name: httpd hosts: httpd remote_user: root roles: - httpd |
In der site.yml definieren wir eine Gruppe httpd und legen fest welche Role zu dieser Gruppe gehören. Dabei legen wir noch mit remote_user fest, mit welchem User Snsible sich auf den Zielserver verbinden soll.
hosts:
1 2 | [httpd] 192.168.10.91 |
In der hosts Datei weisen wir die IP Adresse der httpd entsprechenden httpd Gruppe zu.
Anschließend können wir mit ansible-playbook die beiden Datein aufrufen und damit auf unserem Zielsystem httpd installieren und die entsprechenden Module aktivieren.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | ansible-playbook site.yml -i hosts PLAY [httpd] ******************************************************************* TASK [Gathering Facts] ********************************************************* ok: [192.168.10.90] TASK [httpd : yum | install httpd] ********************************************* ok: [192.168.10.90] => (item=[u'httpd', u'httpd-tools']) TASK [httpd : yum | install of fcgid] ****************************************** skipping: [192.168.10.90] => (item=[]) TASK [httpd : Enable common httpd modules] ************************************* ok: [192.168.10.90] => (item=proxy) ok: [192.168.10.90] => (item=proxy_fcgi) ok: [192.168.10.90] => (item=rewrite) ok: [192.168.10.90] => (item=filter) ok: [192.168.10.90] => (item=deflate) ok: [192.168.10.90] => (item=headers) TASK [httpd : Enable fcgid httpd module] *************************************** skipping: [192.168.10.90] => (item=cgid) skipping: [192.168.10.90] => (item=fcgid) skipping: [192.168.10.90] => (item=suexec) PLAY RECAP ********************************************************************* 192.168.10.90 : ok=3 changed=0 unreachable=0 failed=0 |
Wollen wir nun perl oder fcgid verwenden, müssen wir in der site.yml die entsprechenden Variablen auf true setzten. Dies sieht dann zb. wie folgt aus:
1 2 3 4 5 6 7 | - name: httpd hosts: httpd remote_user: root roles: - httpd vars: - use_perl: true |
Wenn wir jetzt erneut den Lauf starten, werden die entsprechenden Schritte mit ausgeführt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | [root@ansible ansible]# ansible-playbook site.yml -i hosts PLAY [httpd] ******************************************************************* TASK [Gathering Facts] ********************************************************* ok: [192.168.10.90] TASK [httpd : yum | install httpd] ********************************************* ok: [192.168.10.90] => (item=[u'httpd', u'httpd-tools']) TASK [httpd : yum | install of fcgid] ****************************************** ok: [192.168.10.90] => (item=[u'mod_fcgid', u'mod_ruid2']) TASK [httpd : Enable common httpd modules] ************************************* ok: [192.168.10.90] => (item=proxy) ok: [192.168.10.90] => (item=proxy_fcgi) ok: [192.168.10.90] => (item=rewrite) ok: [192.168.10.90] => (item=filter) ok: [192.168.10.90] => (item=deflate) ok: [192.168.10.90] => (item=headers) TASK [httpd : Enable fcgid httpd module] *************************************** ok: [192.168.10.90] => (item=cgi) ok: [192.168.10.90] => (item=fcgid) ok: [192.168.10.90] => (item=suexec) PLAY RECAP ********************************************************************* 192.168.10.90 : ok=5 changed=0 unreachable=0 failed=0 |
Den Code zur Rolle findet ihr im ansible-role Repository auf GitHub. Teil zwei des Tutorials findet ihr hier: Ansible httpd Role Teil 2: Default vHost und SSL verwenden
Schreibe einen Kommentar