Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung |
linux:ansible:playbook_example_11 [24.09.2022 14:52. ] – [Script ausführen] django | linux:ansible:playbook_example_11 [27.09.2022 15:54. ] (aktuell) – [Rollen (Beispiele)] link eingefügt django |
---|
====== Ansible - Erweiterte Konfigurationsbeispiel: Roles ====== | ====== Ansible - Erweiterte Konfigurationsbeispiel: Roles ====== |
{{:centos:ansible:ansible_logo.png?nolink&125|Bild: Ansible Logo}} \\ \\ | {{:centos:ansible:ansible_logo.png?nolink&125|Bild: Ansible Logo}} \\ \\ |
| |
| |
===== Grundlagen ===== | ===== Grundlagen ===== |
| |
=== Systemweite Host/Playbook-Definition : site.yml === | === Systemweite Host/Playbook-Definition : site.yml === |
Zunächst befüllen/editieren wir die Konfigurationsdatei **''site.yml''**, die wir automatisiert bei der Grundkonfiguration von **[[first#ansibledirectory_layout|Ansibles Directory Layout]]** erzeugt hatten. Diese Datei wird später alle Definitionen unserer Systemumgebung enthalten, also nicht nur die für den Apache-Webserver, sondern auch für den Datenbank-, Mail- und sonstige Server. Die spezifischen Playbooks werden dann hier nur noch inkludiert bzw. importiert. | Zunächst erstellen und befüllen wir der Playbook-Konfigurationsdatei **''site_generation.yml''**. Diese Datei wird später alle Definitionen unserer Systemumgebung enthalten, also nicht nur die für den Apache-Webserver, sondern auch für den Datenbank-, Mail- und sonstige Server. Die spezifischen Playbooks werden dann hier nur noch inkludiert bzw. importiert. |
$ vim ~/ansible/playbooks/site.yml | $ vim ~/ansible/playbooks/site_generation.yml |
| |
<file c++ ~/ansible/playbooks/site.yml>--- # Start des systemweiten Playbooks site.yml | <file c++ ~/ansible/playbooks/site_generation.yml>--- # Start des systemweiten Playbooks site_generation.yml |
- import_playbook: web.yml # Playbook zum Konfigurieren unseres Webservers einbinden | - import_playbook: web.yml # Playbook zum Konfigurieren unseres Webservers einbinden |
| |
---- | ---- |
| |
=== Webserver Host/Playbook-Definition : web.yml === | === Webserver Host/Playbook-Definition : web_server.yml === |
Für die Konfiguration des Webservers an sich verwenden wir dann die Konfigurationsdatei **''web.yml''**; die wir in der zuvor angelegten systemweiten Konfigurationsdatei **''site.yml''** inkludiert hatten. Da die Konfiguration auf allen WEB-Hosts erfolgen soll, geben wir beim Parameter **''hosts''** den Namen der Hostgruppe aus unserer Inventory-Definition an. Bei der Definition der Rollen geben wir die drei **''roles''** an, die wir in unseren zuvor angestellten Überlegungen gewählt hatten. | Für die Konfiguration des Webservers an sich verwenden wir dann die Konfigurationsdatei **''web_server.yml''**; die wir in der zuvor angelegten systemweiten Konfigurationsdatei **''site_generation.yml''** inkludiert hatten. Da die Konfiguration auf allen WEB-Hosts erfolgen soll, geben wir beim Parameter **''hosts''** den Namen der Hostgruppe aus unserer Inventory-Definition an. Bei der Definition der Rollen geben wir die drei **''roles''** an, die wir in unseren zuvor angestellten Überlegungen gewählt hatten. |
$ vim ~/ansible/web.yml | $ vim ~/ansible/playbooks/web.yml |
| |
<file c++ web.yml>--- # Start des Playbooks für den Web-Server | <file c++ web_server.yml>--- # Start des Playbooks für den Web-Server |
- hosts: www | - hosts: www |
| |
<file c++ ~/ansible/roles/base/tasks/main.yml>--- # Grundlegende Konfiguration für alle Hosts | <file c++ ~/ansible/roles/base/tasks/main.yml>--- # Grundlegende Konfiguration für alle Hosts |
- name: "***base*** : Gruppe für (WEB-Entwickler) '{{ createuser }}' erstellen" | - name: "***base*** : Gruppe für (WEB-Entwickler) '{{ createuser }}' erstellen" |
group: # https://docs.ansible.com/ansible/latest/modules/group_module.html | ansible.builtin.group: # https://docs.ansible.com/ansible/latest/modules/group_module.html |
name: '{{ createuser }}' | name: '{{ createuser }}' |
gid: '{{ createguid }}' | gid: '{{ createguid }}' |
| |
- name: "***base*** : WEB-Admin Nutzerkonto für den User '{{ createuser }}' mit frn zugehörigen UID '{{ createguid }}' anlegen un der Gruppe '{{ createuser }}' zuordnen." | - name: "***base*** : WEB-Admin Nutzerkonto für den User '{{ createuser }}' mit frn zugehörigen UID '{{ createguid }}' anlegen un der Gruppe '{{ createuser }}' zuordnen." |
user: # https://docs.ansible.com/ansible/latest/modules/user_module.html | ansible.builtin.user: # https://docs.ansible.com/ansible/latest/modules/user_module.html |
name: '{{ createuser }}' | name: '{{ createuser }}' |
comment: '{{ createusername }}' | comment: '{{ createusername }}' |
| |
- name: "***base*** : Initiales Passwort für den WEB-Admin '{{ createuser }}' hinterlegen" | - name: "***base*** : Initiales Passwort für den WEB-Admin '{{ createuser }}' hinterlegen" |
shell: # https://docs.ansible.com/ansible/latest/modules/shell_module.html | ansible.builtin.shell: # https://docs.ansible.com/ansible/latest/modules/shell_module.html |
cmd: usermod -p $(echo '{{ createpassword }}' | openssl passwd -1 -stdin) {{ createuser }} | cmd: usermod -p $(echo '{{ createpassword }}' | openssl passwd -1 -stdin) {{ createuser }} |
</file> | </file> |
createpassword: 'M31nP4p4157d3r4113r83573!' # Initialpasswort (ungecrypted!) | createpassword: 'M31nP4p4157d3r4113r83573!' # Initialpasswort (ungecrypted!) |
</file> | </file> |
| |
| Da wir dort ein Passwort vorhalten, werden wir Dank unserer **[[playbook_example_07|Ansible-Vault]]**-Konfiguration diese Datei nun verschlüsseln. |
| $ ansyble-vault encrypt ~/ansible/roles/base/vars/main.yml |
| |
Die nächste Rolle, die wir konfigurieren müssen, ist die für den NTP-Daemon **''chrony''**. Auch hier kopieren wir zunächst das Default-role-template **common**. | Die nächste Rolle, die wir konfigurieren müssen, ist die für den NTP-Daemon **''chrony''**. Auch hier kopieren wir zunächst das Default-role-template **common**. |
<file c++ ~/ansible/roles/chrony/tasks/install.yml>--- | <file c++ ~/ansible/roles/chrony/tasks/install.yml>--- |
- name: "***chrony*** : Installation des Deamon '{{ daemon_name }}' (in der aktuellsten Version)" | - name: "***chrony*** : Installation des Deamon '{{ daemon_name }}' (in der aktuellsten Version)" |
dnf: | ansible.builtin.dnf: |
#https://docs.ansible.com/ansible/latest/modules/dnf_module.html | #https://docs.ansible.com/ansible/latest/modules/dnf_module.html |
name: '{{ daemon_name }}' | name: '{{ daemon_name }}' |
<file c++ ~/ansible/roles/chrony/tasks/config-backup.yml>--- | <file c++ ~/ansible/roles/chrony/tasks/config-backup.yml>--- |
- name: "***chrony*** : 1) Überprüfen ob das Backup der Konfigurationsdatei '{{ config_file }}' bereits existiert" | - name: "***chrony*** : 1) Überprüfen ob das Backup der Konfigurationsdatei '{{ config_file }}' bereits existiert" |
stat: # https://docs.ansible.com/ansible/latest/modules/stat_module.html | ansible.builtin.stat: # https://docs.ansible.com/ansible/latest/modules/stat_module.html |
path: /etc/chrony.conf.orig | path: /etc/chrony.conf.orig |
register: stat_result | register: stat_result |
| |
- name: "***chrony*** : 2) Von der bestehenden originalen Konfigurationsdatei '{{ config_file }}' ein Backup '{{ config_file }}'.orig erstellen" | - name: "***chrony*** : 2) Von der bestehenden originalen Konfigurationsdatei '{{ config_file }}' ein Backup '{{ config_file }}'.orig erstellen" |
copy: # https://docs.ansible.com/ansible/latest/modules/copy_module.html | ansible.builtin.copy: # https://docs.ansible.com/ansible/latest/modules/copy_module.html |
remote_src: yes | remote_src: yes |
src: '{{ config_file }}' | src: '{{ config_file }}' |
<file yml ~/ansible/roles/chrony/tasks/configure.yml>--- | <file yml ~/ansible/roles/chrony/tasks/configure.yml>--- |
- name: "***chrony*** : Template Konfigurationsdatei an Ort und Stelle kopieren und Variablen setzen" | - name: "***chrony*** : Template Konfigurationsdatei an Ort und Stelle kopieren und Variablen setzen" |
template: # https://docs.ansible.com/ansible/latest/modules/template_module.html | ansible.builtin.template: # https://docs.ansible.com/ansible/latest/modules/template_module.html |
src: templates/chrony-client.conf.j2 | src: templates/chrony-client.conf.j2 |
dest: "{{ config_file }}" | dest: "{{ config_file }}" |
<file c++ ~/ansible/roles/chrony/tasks/service.yml>--- | <file c++ ~/ansible/roles/chrony/tasks/service.yml>--- |
- name: "***chrony*** : Sicherstellen dass der Daemon '{{ daemon_name }}' (beim Systemstart) gestartet wird und läuft" | - name: "***chrony*** : Sicherstellen dass der Daemon '{{ daemon_name }}' (beim Systemstart) gestartet wird und läuft" |
service: # https://docs.ansible.com/ansible/latest/modules/service_module.html | ansible.builtin.service: # https://docs.ansible.com/ansible/latest/modules/service_module.html |
name: chronyd | name: chronyd |
state: started | state: started |
<file c++ ~/ansible/roles/www/tasks/install.yml>--- | <file c++ ~/ansible/roles/www/tasks/install.yml>--- |
- name: "***www*** : Installation des Deamon '{{ daemon_name }}' (in der aktuellsten Version)" | - name: "***www*** : Installation des Deamon '{{ daemon_name }}' (in der aktuellsten Version)" |
dnf: | ansible.builtin.dnf: |
#https://docs.ansible.com/ansible/latest/modules/dnf_module.html | #https://docs.ansible.com/ansible/latest/modules/dnf_module.html |
name: '{{ daemon_name }}' | name: '{{ daemon_name }}' |
<file c++ ~/ansible/roles/www/tasks/config-backup.yml>--- | <file c++ ~/ansible/roles/www/tasks/config-backup.yml>--- |
- name: "***www*** : 1) Überprüfen ob das Backup der Konfigurationsdatei '{{ config_file }}' bereits existiert" | - name: "***www*** : 1) Überprüfen ob das Backup der Konfigurationsdatei '{{ config_file }}' bereits existiert" |
stat: # https://docs.ansible.com/ansible/latest/modules/stat_module.html | ansible.builtin.stat: # https://docs.ansible.com/ansible/latest/modules/stat_module.html |
path: '{{ backup_file }}' | path: '{{ backup_file }}' |
register: stat_result | register: stat_result |
<file c++ ~/ansible/roles/www/tasks/configure.yml>--- | <file c++ ~/ansible/roles/www/tasks/configure.yml>--- |
- name: "***www*** : Template Konfigurationsdatei an Ort und Stelle kopieren und Variablen setzen" | - name: "***www*** : Template Konfigurationsdatei an Ort und Stelle kopieren und Variablen setzen" |
template: # https://docs.ansible.com/ansible/latest/modules/template_module.html | ansible.builtin.template: # https://docs.ansible.com/ansible/latest/modules/template_module.html |
src: templates/httpd-server.conf.j2 | src: templates/httpd-server.conf.j2 |
dest: "{{ config_file }}" | dest: "{{ config_file }}" |
<file c++ ~/ansible/roles/www/tasks/service.yml>--- | <file c++ ~/ansible/roles/www/tasks/service.yml>--- |
- name: "***www*** : Sicherstellen dass der Daemon '{{ daemon_name }}' (beim Systemstart) gestartet wird und läuft" | - name: "***www*** : Sicherstellen dass der Daemon '{{ daemon_name }}' (beim Systemstart) gestartet wird und läuft" |
service: # https://docs.ansible.com/ansible/latest/modules/service_module.html | ansible.builtin.service: # https://docs.ansible.com/ansible/latest/modules/service_module.html |
name: httpd | name: httpd |
state: started | state: started |
| |
- name: "***www*** : Paketfilter anpassen und Port 80 (HTTP) öffnen" | - name: "***www*** : Paketfilter anpassen und Port 80 (HTTP) öffnen" |
firewalld: # https://docs.ansible.com/ansible/latest/modules/firewalld_module.html | ansible.builtin.firewalld: # https://docs.ansible.com/ansible/latest/modules/firewalld_module.html |
service: http | service: http |
permanent: yes | permanent: yes |
├── site.yml | ├── site.yml |
└── web.yml</code> | └── web.yml</code> |
| |
<WRAP center round tip 80%> | |
Abschließend kann man sich nun berechtigter Weise die Frage stellen, warum man nun mehrere Dateien erstellt haben,um den Code und die Variablen dazu, der die Pakete installiert und die Dienste verwaltet, separat zu speichern? Wir sind so sehr leicht in der Lage zum, Beispiel Dienste in mehreren Phasen bereitstellen. In einer ersten Phase können wir so Anwendungen lediglich installieren und konfigurieren und erst in der zweiten Phase dann die Dienste dann starten. | |
Natürlich haben es wir so auch leichter Teiel des Codes wiederzu verwenden, als wenn man eine große Datei vernweden würde in der alle Einzelschritte selektiv aufgeführt sind! | |
</WRAP> | |
| |
| |
</html> | </html> |
| |
==== Rollen (Beispiele) ==== | ===== Rollen (Beispiele) ===== |
* **[[centos:rsynd_c8#automatisierter_weg_mit_hilfe_von_ansible|rsync]]**//-Server unter CentOS 8.x einrichten// | * **[[centos:rsynd_c8#automatisierter_weg_mit_hilfe_von_ansible|rsync]]**//-Server unter CentOS 8.x einrichten// |
* **[[centos:pxe_c8:tftp#automatisierter_weg_mit_hilfe_von_ansible|tftp]]**//-Server unter CentOS 8.x einrichten// | * **[[centos:pxe_c8:tftp#automatisierter_weg_mit_hilfe_von_ansible|tftp]]**//-Server unter CentOS 8.x einrichten// |
| * **[[ffmuc-rpb4-ol#aufbau_des_ansible-playbooks_-_inhalte|Bau eines Freifunk-Offloaders auf Basis eines Raspberry 4B]]** |
| |
| |
:KRIT: FIXME :KRIT: | ===== Fazit und Ausblick ===== |
| |
| <WRAP center round info 80%> |
| Abschließend kann man sich nun berechtigter Weise die Frage stellen, warum man nun mehrere Dateien erstellt haben,um den Code und die Variablen dazu, der die Pakete installiert und die Dienste verwaltet, separat zu speichern? Wir sind so sehr leicht in der Lage zum, Beispiel Dienste in mehreren Phasen bereitstellen. In einer ersten Phase können wir so Anwendungen lediglich installieren und konfigurieren und erst in der zweiten Phase dann die Dienste dann starten. |
| Natürlich haben es wir so auch leichter Teile des Codes wieder zu verwenden, als wenn man eine große Datei verwenden würde in der alle Einzelschritte selektiv aufgeführt sind! |
| </WRAP> |
| |
| |
===== lorem ipsum dolor sit amet ===== | ====== Links ====== |
| * **[[detail|zurück zum Kapitel "Ansible - Erweiterte Konfigurationsbeispiele"]] <= ** |
| * **=> [[playbook_example_12|weiter zum Kapitel "Ansible-Lint: Die "Ansible-Fusselbürste"]]** |
| * **[[start|Zurück zur "Ansible"-Übersicht]]** |
| * **[[wiki:start|Zurück zu >>Projekte und Themenkapitel<<]]** |
| * **[[http://dokuwiki.nausch.org/doku.php/|Zurück zur Startseite]]** |
| |
:KRIT: FIXME :KRIT: | |
| |
| |