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
linux:ansible:playbook_example_10 [24.09.2022 11:55. ] – [Jinja2-Template: ssh_client_config.j2] djangolinux:ansible:playbook_example_10 [24.09.2022 13:50. ] (aktuell) – [Links] django
Zeile 299: Zeile 299:
 In dem Task  **''client_config''** hatten wir definiert, dass unsere SSH-Client-Konfiguration auf Basis eines **[[https://docs.ansible.com/ansible/latest/user_guide/playbooks_templating.html|Jinja2-Templates]]** erstellt werden soll. Diese Datei legen wir nun als nächstes an. In dem Task  **''client_config''** hatten wir definiert, dass unsere SSH-Client-Konfiguration auf Basis eines **[[https://docs.ansible.com/ansible/latest/user_guide/playbooks_templating.html|Jinja2-Templates]]** erstellt werden soll. Diese Datei legen wir nun als nächstes an.
    $ vim ~/ansible/roles/ssh_client/templates/ssh_client_config.j2    $ vim ~/ansible/roles/ssh_client/templates/ssh_client_config.j2
-<file c++ ssh_client_config.j2></file>+<file c++ ssh_client_config.j2># Generiert mit Hilfe von Ansible am {{ ansible_date_time.date }} - diese Datei nicht manuell bearbeiten! 
 +# Clientkonfigurationsbeispiel für unterschiedliche Zielsysteme
  
 +## statische Konfiguration
 +# localhost
 +Host localhost
 +  Hostname  127.0.0.1
 +  IdentityFile ~/.ssh/id_intra
  
 +# externer Einwahl-Hosts
 +Host example
 +  Hostname 93.184.216.34
 +  Port 12345
 +  Protocol 2
 +  ForwardX11 yes
 +  ForwardAgent yes
 +  IdentityFile ~/.ssh/id_example
  
 +## dynamisch aus dem Inventory generierte Konfiguration
 +# interne Systeme - DMZ
 +{% for host in groups['DMZ'] %}
 +Host {{ host }}
 +  Hostname {{ hostvars[host]['host_ipv4'] }}
 +  User {{ hostvars[host]['ssh_user'] }}
 +  Port {{ hostvars[host]['ssh_port'] }}
 +  Protocol {{ hostvars[host]['ssh_protocol'] }}
 +  IdentityFile {{ hostvars[host]['ssh_keyfile'] }}
  
 +Host {{ hostvars[host]['host_alias'] }}
 +  Hostname {{ hostvars[host]['host_ipv4'] }}
 +  User {{ hostvars[host]['ssh_user'] }}
 +  Port {{ hostvars[host]['ssh_port'] }}
 +  Protocol {{ hostvars[host]['ssh_protocol'] }}
 +  IdentityFile {{ hostvars[host]['ssh_keyfile'] }}
 +
 +{% endfor %}
 +# interne Systeme - Intranet
 +{% for host in groups['intranet'] %}
 +Host {{ host }}
 +  Hostname {{ hostvars[host]['host_ipv4'] }}
 +  User {{ hostvars[host]['ssh_user'] }}
 +  Port {{ hostvars[host]['ssh_port'] }}
 +  Protocol {{ hostvars[host]['ssh_protocol'] }}
 +  IdentityFile {{ hostvars[host]['ssh_keyfile'] }}
 +
 +Host {{ hostvars[host]['host_alias'] }}
 +  Hostname {{ hostvars[host]['host_ipv4'] }}
 +  User {{ hostvars[host]['ssh_user'] }}
 +  Port {{ hostvars[host]['ssh_port'] }}
 +  Protocol {{ hostvars[host]['ssh_protocol'] }}
 +  IdentityFile {{ hostvars[host]['ssh_keyfile'] }}
 +
 +{% endfor %}
 +# externe System
 +{% for host in groups['freifunk'] %}
 +Host {{ host }}
 +  Hostname [{{ hostvars[host]['host_ipv6'] }}]
 +  User {{ hostvars[host]['ssh_user'] }}
 +  Port {{ hostvars[host]['ssh_port'] }}
 +  Protocol {{ hostvars[host]['ssh_protocol'] }}
 +  IdentityFile {{ hostvars[host]['ssh_keyfile'] }}
 +  ProxyCommand  ssh -q -W %h:%p {{ hostvars[host]['host_sshjump'] }}
 +
 +Host {{ host }}-extern
 +  Hostname {{ hostvars[host]['host_ipv6'] }}
 +  User {{ hostvars[host]['ssh_user'] }}
 +  Port {{ hostvars[host]['ssh_port'] }}
 +  Protocol {{ hostvars[host]['ssh_protocol'] }}
 +  IdentityFile {{ hostvars[host]['ssh_keyfile'] }}
 +
 +{% endfor %}
 +{% for host in groups['raspbian'] %}
 +Host {{ host }}
 +  Hostname {{ hostvars[host]['host_ipv4'] }}
 +  User {{ hostvars[host]['ssh_user'] }}
 +  Port {{ hostvars[host]['ssh_port'] }}
 +  Protocol {{ hostvars[host]['ssh_protocol'] }}
 +  IdentityFile {{ hostvars[host]['ssh_keyfile'] }}
 +  ProxyCommand  ssh -q -W %h:%p {{ hostvars[host]['host_sshjump'] }}
 +
 +Host {{ host }}-intern
 +  Hostname {{ hostvars[host]['host_ipv4'] }}
 +  User {{ hostvars[host]['ssh_user'] }}
 +  Port {{ hostvars[host]['ssh_port'] }}
 +  Protocol {{ hostvars[host]['ssh_protocol'] }}
 +  IdentityFile {{ hostvars[host]['ssh_keyfile'] }}
 +
 +{% endfor %}
 +</file>
 +
 +Das Beispiel passen wir natürlich unserer Umgebung entsprechend an. Einzelne Netzsegmente haben wir in unserem **[[playbook_example_09#cmdb-basierte_professionelle_umgebungen|Inventory]]** in Hostgruppen unterteilt. Basierend auf den **Host**-Definitionen im Inventory werden die Variablen entsprechend mit den spezifischen Hostdaten gefüllt um damit dann beim Lauf des Playbooks die passende SSH-Client-Konfigurationsdatei zu schreiben. Mit Hilfe der Schleifen, welche jeweils durch **''{% for host in groups['<%%--%%HOST-GROUP-NAME%%--%%>'] %}''** und **''{% endfor %}''** eingeschlossen sind, werden beim Abarbeiten des Playbooks für jeden Host aus der spezifischen Gruppe (repräsentiert durch den Namen der Hostgruppe **''<%%--%%HOST-GROUP-NAME%%--%%>''**) Abschnitte in der **''~/.ssh/config''**-Datei hinterlegt.
 +
 +=== Inventory ===
 +Die **[[playbook_example_09#cmdb-basierte_professionelle_umgebungen|Konfigruationsdaten]]** unserer Host halten wir in unserem **Inventory** vor. Hierbei spielt es grundlegend keine Frage ob dies manuell gepflegt, oder scriptiert aus einer **CMBD** exportiert und aufbereitet wurde.
 +
 +Für unser Playbook-Beispiel hier greifen wir auf das exemplarische **[[playbook_example_09#cmdb-basierte_professionelle_umgebungen|Inventory]]**, mit welchem wir uns im Kapitel **[[playbook_example_09|Ansible - Erweiterte Konfigurationsbeispiel: Inventory]]** bereits intensiv beschäftigt hatten, zurück. Nachfolgend sehen wir, wie solch eine Inventory Datei aufgebaut und strukturiert sein könnte. Das exemplarische Beispiel ist hier entsprechend gekürzt und die Stellen mit Hilfe von **''%%...%%''** markiert wiedergegeben"
 +   $ less ~/ansible/inventories/production/hosts
 +
 +<file bash hosts># Generiert mit Hilfe von Ansible am 2022-09-20 - diese Datei nicht manuell bearbeiten!
 +# Inventory Datei für die System-Umgebung bei nausch.org
 +#
 +# Hinweise:
 +#           Kommentare beginnen mit einem '#'-Zeichen
 +#           leere Zeilen werden ignoriert
 +#           Host- und Gruppendefinitionen werden mit [] abgegrenzt
 +#           Hosts können über ihren Hostnamen, FQN oder ihrer IP-Adresse definiert
 +#           übergeordnete Gruppen werden durch [:children] abgegrenzt
 +#
 +# Host-Definitionen
 +
 +# Hosts ohne Gruppenzuordnung
 +localhost
 +
 +[intranet]
 +pml010002
 +pml010003
 +pml010004
 +...
 +...
 +pml010124
 +pml010125
 +pml010126
 +
 +[IDMZ]
 +vml030010
 +vml030020
 +vml030030
 +vml030040
 +...
 +...
 +vml030230
 +vml030240
 +vml030250
 +
 +[EDMZ]
 +vml050010
 +vml050020
 +vml050030
 +vml050040
 +vml050250
 +
 +[TKDMZ]
 +vml070010
 +vml070020
 +vml070030
 +
 +[external]
 +customer_no_001
 +customer_no_002
 +...
 +...
 +customer_no_042
 +
 +[gluon]
 +ff_pliening_gbw__ug_
 +ff_pliening_gbw_egod
 +ff_pliening_gbw_ogod
 +ff_pliening_gbw_dgod
 +ff_pliening_gbw_cpod
 +ff_roding_fwg_nausch
 +
 +[raspbian]
 +ff_pliening_rpb4_ol_v6
 +
 +# Host-Gruppen-Definitionen 
 +# (zu welcher Gruppe gehören Untergruppen bzw. Hosts)
 +
 +[freifunk:children]
 +gluon
 +raspbian
 +
 +[linux:children]
 +intranet
 +IDMZ
 +EDMZ
 +TKDMZ
 +external
 +</file>
 +
 +Die betreffenden Hostspezifischen Variablen halten wir hier in entsprechenden Dateien bzw. Unterverzeichnissen vor. Das nachfolgende Beispiel hier zeigt die Host-spezifischen Variablen eines Hosts im Intranet.
 +   $ less ~/ansible/inventories/production/host_vars/pml111002
 +
 +<file c++ vml030010># Generated by Ansible on 2022-09-20, do not edit manually!
 +host_alias: fw1
 +host_mac: "84:3b:de:ad:be:ef"
 +host_ipv4: "10.30.30.2"
 +host_ipv6: "::1"
 +ssh_port: 22
 +ssh_protocol: 2
 +ssh_keyfile: ~/.ssh/id_idmz"</file>
 +
 +Als Beispiel für einen externen Host, der nur via Jump-Host erreichbar ist sehen wir uns die Inventory-Host-Definition des Hosts **''ff_pliening_gbw%%__%%ug_''** näher an.
 +   $ less ~/ansible/inventories/production/host_vars/ff_pliening_gbw__ug_ 
 +
 +
 +<file c++ ff_pliening_gbw__ug_># Generated by Ansible on 2022-09-20, do not edit manually!
 +host_alias: 
 +host_ipv4:
 +host_ipv6: 2001:678:e68:102:32b5:c2ff:fe56:62b1
 +ssh_user: root
 +ssh_port: 22
 +ssh_protocol: 2
 +ssh_keyfile: ~/.ssh/id_freifunk
 +host_sshjump: vml070010
 +
 +branch: "stable"
 +domain: "ffmuc_muc_ost"
 +director: "ffmuc_muc_ost"
 +node_contact_address: "Django [BOfH] | django@nausch.org | chat: @django"
 +node_hostname: "ff_pliening_gbw_antipode"
 +node_latitude: "-48.19861319429455"
 +node_longitude: "-168.2017571420684"
 +node_model: "TP-Link TL-WDR4300 v1"
 +node_share_location: "True"
 +node_ghostmode: "False"
 +node_release: "experimental"
 +node_autoupdate: "False"
 +</file>
  
 +Hier sehen wir nun dass unter anderem ein anderer SSH-User, ein anderes SSH-Keyfile sowie ein Jump-Host benutzt wird. Ferner finden sich im Anschluß noch weitere Host-spezische Variablen, für die Konfiguration des betreffenden **[[https://map.ffmuc.net/#!/de/map/30b5c25662b1|Freifunk-Knotens]]**.
  
 +=== Playbook-Lauf ===
 +Dank der **[[playbook_example_08#aufgabenstellung_2_-_erweiterte_grund-_basis-installation_fuer_ansible-vault|Vorkonfiguration]]** unseres Ansible-Controll-Nodes, welche wir im Kapitel **[[playbook_example_08|Ansible - erweiterte Konfigurationsbeispiele: Ansible mit Hilfe von Ansible einrichten]]** hier in Djangos WIKI vorgenommen hatten, reicht zum Starten des Playbooks folgender Befehlsaufruf:
 +   $ ansible-playbook ~/ansible/playbooks/ssh_client_config.yml
  
-==== Ergebnis~/.ssh/config ====+<html> 
 +<pre class="code"> 
 +<font style="colorrgb(0, 0, 0)"> 
 +PLAY [ssh_client_config.yml] ******************************************************************************************************
  
 +TASK [Gathering Facts] ************************************************************************************************************</font>
 +<font style="color: rgb(25, 100, 5)">ok: [localhost]</font>
 +<font style="color: rgb(0, 0, 0)">
 +TASK [ssh_client : include_tasks] *************************************************************************************************</font>
 +<font style="color: rgb(43, 100, 164)">included: /home/django/ansible/roles/ssh_client/tasks/client_config.yml for localhost</font>
 +<font style="color: rgb(0, 0, 0)">
 +TASK [ssh_client : Generieren und kopieren der SSH Client Konfiguration ~/.ssh/config.] *******************************************</font>
 +<font style="color: rgb(25, 100, 5)">ok: [localhost]</font>
 +<font style="color: rgb(0, 0, 0)">
 +PLAY RECAP *************************************************************************************************************************</font>
 +<font style="color: rgb(25, 100, 5)">localhost                  </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=3</font>    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0</font>
 +</pre>
 +</html>
 +=== Ergebnis: ~/.ssh/config ===
 +Als Ergebnis erhalten wir dann quasi auf Knopfdruck immer eine aktuelle SSH-Client-Konfigurationsdatei **''~/.ssh/config''**, basierend auf den Konfigurationsdaten aus unsere Inventory.
  
 <file bash ~/.ssh/config># Generiert mit Hilfe von Ansible am 2022-09-24 - diese Datei nicht manuell bearbeiten! <file bash ~/.ssh/config># Generiert mit Hilfe von Ansible am 2022-09-24 - diese Datei nicht manuell bearbeiten!
Zeile 331: Zeile 566:
 # interne Systeme - IDMZ # interne Systeme - IDMZ
 Host vml030010 Host vml030010
-  Hostname 10.0.0.17+  Hostname 10.30.30.10
   User django   User django
   Port 22   Port 22
Zeile 338: Zeile 573:
  
 Host fw1 Host fw1
-  Hostname 10.0.0.17+  Hostname 10.30.30.10
   User django   User django
   Port 22   Port 22
Zeile 345: Zeile 580:
  
 Host vml030020 Host vml030020
-  Hostname 10.0.0.27+  Hostname 10.30.30.20
   User django   User django
   Port 22   Port 22
Zeile 352: Zeile 587:
  
 Host fw2 Host fw2
-  Hostname 10.0.0.27+  Hostname 10.30.30.2
   User django   User django
   Port 22   Port 22
Zeile 359: Zeile 594:
  
 Host vml030030 Host vml030030
-  Hostname 10.0.0.37+  Hostname 10.30.30.30
   User django   User django
   Port 22   Port 22
Zeile 366: Zeile 601:
  
 Host  Host 
-  Hostname 10.0.0.37+  Hostname 10.30.30.30
   User django   User django
   Port 22   Port 22
Zeile 376: Zeile 611:
  
 Host vml030250 Host vml030250
-  Hostname 10.0.0.40+  Hostname 10.30.30.250
   User django   User django
   Port 22   Port 22
Zeile 383: Zeile 618:
  
 Host db_clusternode_3 Host db_clusternode_3
-  Hostname 10.0.0.40+  Hostname 10.30.30.250
   User django   User django
   Port 22   Port 22
Zeile 391: Zeile 626:
 # interne Systeme - Intranet # interne Systeme - Intranet
 Host pml010002 Host pml010002
-  Hostname 10.0.10.2+  Hostname 10.10.10.2
   User django   User django
   Port 22   Port 22
Zeile 398: Zeile 633:
  
 Host kvm_1 Host kvm_1
-  Hostname 10.0.10.2+  Hostname 10.10.10.2
   User django   User django
   Port 22   Port 22
Zeile 408: Zeile 643:
  
 Host pml010126 Host pml010126
-  Hostname 10.0.10.71+  Hostname 10.10.10.126
   User django   User django
   Port 22   Port 22
Zeile 415: Zeile 650:
  
 Host feinstaubsensor Host feinstaubsensor
-  Hostname 10.0.10.71+  Hostname 10.10.10.126
   User django   User django
   Port 22   Port 22
Zeile 457: Zeile 692:
 </file> </file>
  
 +===== Fazit  und Ausblick =====
 +<WRAP center round info 80%>
  
-FIXME //**... do geds weida!**// FIXME +Die manuelle, zeitraubende und ggfFehlerbehaftete Pflege der SSH-Client-Konfigurations-Datei durch mehrere Admins auf verschiedenen Ansible-Kontroll-Knoten ist somit GeschichteFerner sind wir unabhängig und können so viele SSH-Jump-Hosts verwenden, die eben zum Erreichen der Zielhost von Nöten sind.
  
 +Die initiale Fragestellung //Wie wird sicher gestellt, dass alle Ziele auch erreichbar sind?//, die wir bei unseren **[[detail#wo_laufen_die_ansible_scripte|Vorüberlegungen]]** angestellt hatten, können wir also auch als erfolgreich erledigt abhaken und wir sind bei unserem Ziel von **Automatisierung** und **Orchestrierung** einen wesentlichen Schritt weiter gekommen. :UP:
 +</WRAP>
  
-===== lorem ipsum dolor sit amet =====+====== Links ====== 
 +  * **[[detail|zurück zum Kapitel "Ansible - Erweiterte Konfigurationsbeispiele"]] <= ** 
 +  * **=> [[playbook_example_11|weiter zum Kapitel "Ansible - Erweiterte Konfigurationsbeispiel: Roles]]** 
 +  * **[[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: 
  
  • linux/ansible/playbook_example_10.1664020554.txt.gz
  • Zuletzt geändert: 24.09.2022 11:55.
  • von django