centos:ansible:detail

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Nächste ÜberarbeitungBeide Seiten der Revision
centos:ansible:detail [11.01.2020 15:35. ] – [inventory - Beispiel] djangocentos:ansible:detail [28.06.2020 14:09. ] – [Bau eines Freifunk-Offloaders auf Basis eines Raspberry 4B] django
Zeile 1: Zeile 1:
 ====== Ansible - Erweiterte Konfigurationsbeispiele ====== ====== Ansible - Erweiterte Konfigurationsbeispiele ======
 {{:centos:ansible:ansible_logo.png?nolink&125|Bild: Ansible Logo}} \\ \\ {{:centos:ansible:ansible_logo.png?nolink&125|Bild: Ansible Logo}} \\ \\
 +
 +<WRAP center round todo 55%>
 +**Seite in der Entstehung, noch nicht aktuell! Wird laufend aktualisiert!**
 +</WRAP>
 +
  
 Nachdem wir uns bereits eingehend mit den **[[centos:ansible:start#grundlagen|Grundlagen]]**, mit der **[[centos:ansible:start#installation|Installation von Ansible]]** und auch schon mit der Grundkonfiguration beschäftigt sowie erste Erfahrungen mit **[[centos:ansible:first#playbook_-_beispiele|Playbooks]]** gesammelt haben, wollen wir uns nun mit der tiefergehenden Konfiguration von Ansible beschäftigen.  Nachdem wir uns bereits eingehend mit den **[[centos:ansible:start#grundlagen|Grundlagen]]**, mit der **[[centos:ansible:start#installation|Installation von Ansible]]** und auch schon mit der Grundkonfiguration beschäftigt sowie erste Erfahrungen mit **[[centos:ansible:first#playbook_-_beispiele|Playbooks]]** gesammelt haben, wollen wir uns nun mit der tiefergehenden Konfiguration von Ansible beschäftigen. 
Zeile 152: Zeile 157:
  
 /* Viele Hinweise und Beispiel zu den Gruppen finden sich auch hier im Kapitel **[[https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html|How to build your inventory]]** der Ansible Dokumentation enthalten.*/ /* Viele Hinweise und Beispiel zu den Gruppen finden sich auch hier im Kapitel **[[https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html|How to build your inventory]]** der Ansible Dokumentation enthalten.*/
 +
 +Zum Testen, ob die definierten Hosts in unserem **inventory**-File auch erreichbar ist, können wir mit dem Befehl **''ansible -m ping all''** überprüfen.
  
 === playbook === === playbook ===
Zeile 200: Zeile 207:
 Wie schon im vorhergehenden Beispiel angemerkt, wird es bei einer größeren Anzahl von Hostdefinitionen mit umfangreichen oder verschachtelten (Gruppe in Gruppe) Gruppenzugehörigkeiten mit verschiedensten zugeordneten Variablen sehr schnell "schmutzig". All das in einer einzigsten Konfiguration abbilden zu wollen, wird man vermutlich in die Ecke "Hand zu masochistischen Tendenzen" oder Selbstgeisselung eines Admins einordnen - kurzum hier muss ein anderer Lösungsansatz her! Wie schon im vorhergehenden Beispiel angemerkt, wird es bei einer größeren Anzahl von Hostdefinitionen mit umfangreichen oder verschachtelten (Gruppe in Gruppe) Gruppenzugehörigkeiten mit verschiedensten zugeordneten Variablen sehr schnell "schmutzig". All das in einer einzigsten Konfiguration abbilden zu wollen, wird man vermutlich in die Ecke "Hand zu masochistischen Tendenzen" oder Selbstgeisselung eines Admins einordnen - kurzum hier muss ein anderer Lösungsansatz her!
  
-In dem nachfolgenden Konfigurationsbeispiel sehen wir uns eine kleinere Installation an, die zwar nicht genau dem Kriterien **"groß"**, aber an Hand dieses Beispiels lässt sich das grundsätzliche Struktur und der Umgang mit verschachtelten Gruppen anschaulich erklären. +In dem nachfolgenden Konfigurationsbeispiel sehen wir uns eine kleinere Installation an, die zwar nicht genau dem Kriterien **"groß"**, aber an Hand dieses Beispiels lässt sich das grundsätzliche Struktur und der Umgang mit verschachtelten Gruppen anschaulich erklären. Wir gehen bei diesem Beispiel von einer mittleren Freifunk-Installation mit folgenden unterschiedlichen Systemkomponenten und -eigenschaften aus.  aus:
-=== inventory - Beispiel ===+
  
-FIXME Text ergänen FIXME+  * **Standard-Nodes**: Dies sind einfach ausgedrückt Standard-WLAN-Access-Points((**A**ccess **P**oint)), die für Endanwender einen Zugang zum Internet bereitstellen. In einfachen Installationen spannen diese einen Tunnel in Richtung des zentralen Gateways auf. Auf diesen Nodes läuft in aller Regel eine Firmware, die auf dem **[[https://github.com/freifunk-gluon/gluon|Gluon-Framework]]** sowie **[[https://openwrt.org/|OpenWrt]]** basiert. 
 +  * **Offloader**: Bei entsprechenden Verkehrsmengen (Traffic und Nutzer) nutzt man meist in kleinen vermaschten Netzen sog. Offloader, die leistungsfähigere Hardware verbaut haben um einen Tunnel zum zentralen Gateway der Freifunk Community aufzuspannen. Als Offloader kommen meist **x86-Hardware** in Form von **futro-thinclients**, virtualisierte Systeme **KVM** oder auch **Raspberry 4** Auf letzterem läuft als Betriebssystem ein spezielles Debian, auf den beiden anderen i.d.R. **Gluon**.
  
 +In unserem Konfigurationsbeispiel haben wir folgende Komponenten und (Betriebs-)Systeme im Einsatz, woraus sich unterschiedliche Gruppenkonstellationen ergeben, die im Betrieb zum Tragen kommen bzw. verwendet werden.
 +  - **Gruppe** aller WiFi-AccessPoints mit **Gluon** **''ffmuc''**:
 +    * ff_pliening_gbw_cpod
 +    * ff_pliening_gbw_dod
 +    * ff_pliening_gbw_egod
 +    * ff_pliening_gbw_ogod
 +    * ff_pliening_gbw_ug
 +    * ff_roding_as_nausch 
 +  - **Gruppe** aller Offloader **''olall''**:
 +    * ff_pliening_gbw_client
 +    * ff-django-raspi
 +    * ff_pliening_gbw_futro_mesh
 +    * ff_pliening_gbw_kvm_ol
 +  - **Gruppe** **''gluonall''** aller Gluon-Systeme
 +    * ff_pliening_gbw_cpod
 +    * ff_pliening_gbw_dod
 +    * ff_pliening_gbw_egod
 +    * ff_pliening_gbw_ogod
 +    * ff_pliening_gbw_ug
 +    * ff_roding_as_nausch
 +    * ff_pliening_gbw_futro_mesh
 +    * ff_pliening_gbw_kvm_ol
 +  - **Gruppe** **''olfutro''** der Offloader mit Futro-Hardware:
 +    * ff_pliening_gbw_futro_mesh
 +  - **Gruppe** **''ololkvm''** der KVM virtualisierten Offloader:
 +    * ff_pliening_gbw_kvm_ol
 +  - **Gruppe** **''olgluon''** aller Offloader mit **Gluon**
 +    * ff_pliening_gbw_futro_mesh
 +    * ff_pliening_gbw_kvm_ol
 +  - **Gruppe** **''oldeb''** aller Offloader mit **Debian**
 +    * ff_pliening_gbw_futro_mesh
 +    * ff_pliening_gbw_kvm_ol
 +  - **Gruppe** **''all''** aller Nodes:
 +    * ff_pliening_gbw_cpod
 +    * ff_pliening_gbw_dod
 +    * ff_pliening_gbw_egod
 +    * ff_pliening_gbw_ogod
 +    * ff_pliening_gbw_ug
 +    * ff_roding_as_nausch
 +    * ff_pliening_gbw_client
 +    * ff-django-raspi
 +    * ff_pliening_gbw_futro_mesh
 +    * ff_pliening_gbw_kvm_ol
 +
 +Nachfolgendes Schaubild visualisiert die einzelnen Gruppen und die entsprechenden Überlappungen.
 + 
 {{ :centos:ansible:inventory.png?direct&900 |Bild: Übersicht einer möglichen (Infra)Struktur}} {{ :centos:ansible:inventory.png?direct&900 |Bild: Übersicht einer möglichen (Infra)Struktur}}
  
-FIXME Text ergänen FIXME 
  
-Dort legen wir uns unsere erweiterte Host-Datei im YAML-Format an.+=== inventory - Beispiel === 
 +Die **Inventory**-Datei **''inventory.yml''** unseres Beispiels legen wir im Arbeitsverzeichnis unseres Ansible-Administrationshost ab.
    $ vim ~/ansible/inventory.yml    $ vim ~/ansible/inventory.yml
  
Zeile 252: Zeile 305:
 </file> </file>
  
- +Die Datei ist relativ übersichtlich und doch recht einfach zu verstehen. Würden wir nun aber die Host- und Gruppenspezifischen Variablen mit in die Datei aufnehmen, wäre dies jedoch gänzlich anders. Dabei haben wir hier nur 10 Hosts und noch keine 100 oder noch mehr. 
  
-   $ mkdir host_vars+Ansible bietet daher einen skalierbareren Ansatz, um den Überblick über Host- und Gruppenvariablen zu behalten. Man kann für jeden Host und jede Gruppe die Variablen in einer jeweils zugehörigen Datei auslagern. Ansible wir beim Aufruf und Abarbeiten eines Playbooks diese hostspezifischen Dateien im Verzeichnis **''host_vars''** und die gruppenspezifischen Variablen im Verzeichnis **''group_vars''**. Diese Verzeichnisse werden von Ansible entweder im dem Verzeichnis erwartet, in dem das aufgerufene Playbook gespeichert wurde oder alternativ dazu im Verzeichnis in dem das die **Inventory**-Datei gespeichert wurde.
  
-   $ mkdir group_vars+Wir legen also die beiden Verzeichnisse an. 
 +   $ mkdir ~/ansible/inventory/host_vars 
 +   $ mkdir ~/ansible/inventory/group_vars
  
 +Somit haben wir dann aktuell folgende Verzeichnisstruktur auf unserem Admin-/Ansible-Host.
 +<code>.
 +├── authkeys
 +├── files
 +│   ├── CentOS7
 +│   └── CentOS8
 +├── includes
 +├── inventory
 +│   ├── group_vars
 +│   └── host_vars
 +├── playbooks
 +└── templates
 +    └── chrony-client</code>
  
 +Je **Gruppe** speichern wir also eine individuelle Datei im Verzeichnis **''~/ansible/inventory/group_vars''** ab.
 +   $ vim ~/inventory/group_vars/ffmuc.yml
  
-FIXME Text ergänen FIXME+<file bash ~/inventory/group_vars/ffmuc.yml>ffmuc: 
 +  ansible_ssh_port: 22 
 +  ansible_ssh_user: root 
 +  ansible_ssh_private_key_file: /home/django/.ssh/id_rsa4096_freifunk_2014.pub 
 +  contact_info: 'Django [BOfH] | django@nausch.org | chat -> @django' 
 +</file>
  
-/*+Für die anderen Gruppe(n) verfahren wie ebenso. 
 + 
 +Je **Host** speichern wir dann jeweils eine individuelle Datei im Verzeichnis **''~/ansible/inventory/hosts_vars''** ab. 
 +   $ vim ~/ansible/inventory/host_vars/ff_pliening_gbw_egod.yml 
 + 
 +<file bash ~/ansible/inventory/host_vars/ff_pliening_gbw_egod.yml>ff_pliening_gbw_egod: 
 +  hostname: ffplieninggbwegod 
 +  pretty_hostname: ff_pliening_gbw_egod 
 +  latitude: 48.198652080 
 +  longitude: 11.797969940 
 +  branch: stable 
 +  domain: ffmuc_muc_ost 
 +  director: ffmuc_muc_ost 
 +  modell: Ubiquiti UniFi-AC-MESH 
 +  ansible_ssh_host: 2001:608:a01:102:1ae8:29ff:fea9:22ed</file> 
 + 
 +Auch für die anderen Hosts legen wir entsprechende Dateien mit den Variablen an. 
 + 
 +=== playbook === 
 +Die zuvor angelegte Inventory- und auch Host-/Group-Variablendateien wollen wir nun verwenden um die Geolocation-Daten unserer Freifunk-Knoten zu organisieren. Die Geodaten sind in den jeweiligen Host-Dateien in den beiden Variablen **''latitude''** und **''longitude''** gespeichert - diese beiden Variablen nutzen wir nun in unserem Playbook. 
 +   $ ~/ansible/playbooks/09_set_location.yml 
 + 
 +<file bash ~/ansible/playbooks/09_set_location.yml> 
 +--- 
 +- hosts: ffmuc 
 +  gather_facts: False 
 + 
 +  tasks: 
 +    - name: "Set GEO location of our own ffmuc-nodes" 
 +      #https://docs.ansible.com/ansible/latest/modules/raw_module.html 
 +      raw: uci set gluon-node-info.@location[0]="location"; uci set gluon-node-info.@location[0].share_location="1"; uci set gluon-node-info.@location[0].latitude="{{ latitude }}" ; uci set gluon-node-info.@location[0].longitude="{{ longitude }}"; uci commit gluon-node-info</file> 
 + 
 +=== Script antesten === 
 +Bevor wir nun das Playbook ausführen wollen wir erst einmal shen, ob auch die richtigen Hosts verwendet werden würden. Hierzu hat der Befehl **''ansible-playbook''** eine entsprechende Option **''--list-hosts''**. 
 +   $ ansible-playbook -v ~/ansible/playbooks/09_set_location.yml --list-hosts 
 + 
 +<html><pre class="code"> 
 +<font style="color: rgb(43, 100, 164)">Using /etc/ansible/ansible.cfg as config file</font> 
 + 
 +<font style="color: rgb(0, 0, 0)">playbook: /home/django/ansible/playbooks/09_set_location.yml 
 + 
 +  play #1 (ffmuc): ffmuc TAGS: [] 
 +    pattern: ['ffmuc'
 +    hosts (6): 
 +      ff_pliening_gbw_egod 
 +      ff_roding_as_nausch 
 +      ff_pliening_gbw_cpod 
 +      ff_pliening_gbw_dgod 
 +      ff_pliening_gbw_ogod 
 +      ff_pliening_gbw_ug</font></pre> 
 +</html> 
 + 
 +=== Script ausführen === 
 +Nun wollen wir unser ersten Playbook ausführen, um die Geodaten aus der Inventory-Datei auf unseren Freifunk-Knoten abzugleichen; hierzu rufen wir unser Script wie folgt auf: 
 +   $ ansible-playbook -v ~/ansible/playbooks/09_set_location.yml 
 + 
 +<html><pre class="code"> 
 +<font style="color: rgb(43, 100, 164)">Using /etc/ansible/ansible.cfg as config file</font> 
 +<font style="color: rgb(0, 0, 0)">BECOME password:  
 + 
 +PLAY [ffmuc] *************************************************************************************************************************** 
 + 
 +<font style="color: rgb(0, 0, 0)">TASK [Update new contact-address on own ffmuc-nodes] ***********************************************************************************</font> 
 +<font style="color: rgb(196, 160, 0)">changed: [ff_pliening_gbw_egod] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:1ae8:29ff:fea9:22ed closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:1ae8:29ff:fea9:22ed closed."], "stdout": "", "stdout_lines": []} 
 +changed: [ff_pliening_gbw_kvm_ol] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:5054:ff:fe9e:b358 closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:5054:ff:fe9e:b358 closed."], "stdout": "", "stdout_lines": []} 
 +changed: [ff_pliening_gbw_ogod] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:1ae8:29ff:fec0:aaae closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:1ae8:29ff:fec0:aaae closed."], "stdout": "", "stdout_lines": []} 
 +changed: [ff_pliening_gbw_ug] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:32b5:c2ff:fe56:62b1 closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:32b5:c2ff:fe56:62b1 closed."], "stdout": "", "stdout_lines": []} 
 +changed: [ff_pliening_gbw_dgod] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:1ae8:29ff:fec6:c8eb closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:1ae8:29ff:fec6:c8eb closed."], "stdout": "", "stdout_lines": []} 
 +changed: [ff_pliening_gbw_cpod] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:1ae8:29ff:fec6:c8dd closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:1ae8:29ff:fec6:c8dd closed."], "stdout": "", "stdout_lines": []}</font><br> 
 +<font style="color: rgb(0, 0, 0)">PLAY RECAP *****************************************************************************************************************************</font> 
 +<font style="color: rgb(196, 160, 0)">ff_pliening_gbw_cpod       </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=1    </font><font style="color: rgb(196, 160, 0)">changed=1    </font><font style="color: rgb(0, 0, 0)">unreachable=0    failed=0    skipped=0    rescued=0    ignored=0</font> 
 +<font style="color: rgb(196, 160, 0)">ff_pliening_gbw_dgod       </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=1    </font><font style="color: rgb(196, 160, 0)">changed=1    </font><font style="color: rgb(0, 0, 0)">unreachable=0    failed=0    skipped=0    rescued=0    ignored=0</font> 
 +<font style="color: rgb(196, 160, 0)">ff_pliening_gbw_egod       </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=1    </font><font style="color: rgb(196, 160, 0)">changed=1    </font><font style="color: rgb(0, 0, 0)">unreachable=0    failed=0    skipped=0    rescued=0    ignored=0</font> 
 +<font style="color: rgb(196, 160, 0)">ff_pliening_gbw_kvm_ol     </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=1    </font><font style="color: rgb(196, 160, 0)">changed=1    </font><font style="color: rgb(0, 0, 0)">unreachable=0    failed=0    skipped=0    rescued=0    ignored=0</font> 
 +<font style="color: rgb(196, 160, 0)">ff_pliening_gbw_ogod       </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=1    </font><font style="color: rgb(196, 160, 0)">changed=1    </font><font style="color: rgb(0, 0, 0)">unreachable=0    failed=0    skipped=0    rescued=0    ignored=0</font> 
 +<font style="color: rgb(196, 160, 0)">ff_pliening_gbw_ug         </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=1    </font><font style="color: rgb(196, 160, 0)">changed=1    </font><font style="color: rgb(0, 0, 0)">unreachable=0    failed=0    skipped=0    rescued=0    ignored=0</font> 
 +<br></pre> 
 +</html> 
 + 
 +=== Ergebnis === 
 +Nun haben alle unsere eigenen definierten Freifunk Knoten haben nun auf der **[[https://map.ffmuc.net/#!/de/map/18e829a922ed|Freifunk München Karte]]*die aktualisierten GeoDaten. Zum anderen ist der Administrative Aufwand entsprechend überschaubar. 
 + 
 +<WRAP center round info 80%> 
 +Zum Thema administrativer Aufwand wollen wir uns kurz noch ein kleines Rechenbeispiel ansehen. Nehmen wir mal an, wie hätten eine etwas größere Installation mit folgenden Eckdaten:
   * **145** Zeilen (ohne Variablen):   * **145** Zeilen (ohne Variablen):
     * mit **76** Hosts     * mit **76** Hosts
Zeile 272: Zeile 430:
     * und **13** Unter-/Gruppen ~5 Variablen je Gruppe: 65      * und **13** Unter-/Gruppen ~5 Variablen je Gruppe: 65 
 ergäbe dies eine Inventory-Datei mit **__1.350__** Zeilen. 8-o ergäbe dies eine Inventory-Datei mit **__1.350__** Zeilen. 8-o
 +</WRAP>
 +
  
-*/ 
  
 /* /*
Zeile 281: Zeile 440:
  
 https://ansible-tips-and-tricks.readthedocs.io/en/latest/ansible/inventory/ https://ansible-tips-and-tricks.readthedocs.io/en/latest/ansible/inventory/
 +https://gerardnico.com/infra/ansible/start */
  
 +
 +
 +
 +\\ \\ \\ 
  
 FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME  FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME 
Zeile 288: Zeile 452:
  
 /* https://gerardnico.com/infra/ansible/start */ /* https://gerardnico.com/infra/ansible/start */
 +