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:ntp [21.02.2024 17:51. ] – [Checking chrony Source Statistics] djangolinux:ntp [03.07.2024 19:56. ] (aktuell) – [Rolle] django
Zeile 1: Zeile 1:
 +{{htmlmetatags>metatag-robots=() 
 +metatag-keywords=(Ansible,Arch Linux,ntp, chrony, timeserver,stratum,chronyc,chronyd) 
 +metatag-description=(NTP-Zeitserver mit chrony unter Arch Linux einrichten und nutzen)
 +}}
 ====== NTP-Zeitserver mit chrony unter Linux einrichten und nutzen ====== ====== NTP-Zeitserver mit chrony unter Linux einrichten und nutzen ======
 {{:linux:hourglass.png?nolink&100 |Bild: stilisierte Sanduhr}} Basis für eine zuverlässige Kommunikation zwischen netzwerkbasierten Diensten und Servern ist unter anderem eine exakte Zeitmessung. Nur so kann gewährleistet werden das Systemkomponenten wie z.B. systemd-Timer und Cronjobs zur richtigen Zeit gestartet werden und laufen. Einzelne Systeme können mit Hilfe des **N**etwork **T**ime **P**rotocol kurz **NTP** ihre Systemzeiten mit einem zentralen Zeitserver oder einem Pool von Servern zu synchronisieren. NTP wurde 1985 von David L. Mills entwickelt und wurde als [[https://tools.ietf.org/html/rfc958|RFC 958]] definiert um eine zuverlässige Zeitgabe über Netzwerke mit variabler Paketlaufzeit über das verbindungslose Protokolls **UDP** zu ermöglichen und bekam von der Internet Assigned Numbers Authority den UDP-Ports **123** zugewiesen. Das **RFC958** wurde in den letzten Jahren mehrfach überarbeitet und ergänzt und wurde letztmalig mit **[[https://www.rfc-editor.org/rfc/rfc9109|RFC 9109 - Network Time Protocol Version 4: Port Randomization]]** ergänzt. {{:linux:hourglass.png?nolink&100 |Bild: stilisierte Sanduhr}} Basis für eine zuverlässige Kommunikation zwischen netzwerkbasierten Diensten und Servern ist unter anderem eine exakte Zeitmessung. Nur so kann gewährleistet werden das Systemkomponenten wie z.B. systemd-Timer und Cronjobs zur richtigen Zeit gestartet werden und laufen. Einzelne Systeme können mit Hilfe des **N**etwork **T**ime **P**rotocol kurz **NTP** ihre Systemzeiten mit einem zentralen Zeitserver oder einem Pool von Servern zu synchronisieren. NTP wurde 1985 von David L. Mills entwickelt und wurde als [[https://tools.ietf.org/html/rfc958|RFC 958]] definiert um eine zuverlässige Zeitgabe über Netzwerke mit variabler Paketlaufzeit über das verbindungslose Protokolls **UDP** zu ermöglichen und bekam von der Internet Assigned Numbers Authority den UDP-Ports **123** zugewiesen. Das **RFC958** wurde in den letzten Jahren mehrfach überarbeitet und ergänzt und wurde letztmalig mit **[[https://www.rfc-editor.org/rfc/rfc9109|RFC 9109 - Network Time Protocol Version 4: Port Randomization]]** ergänzt.
Zeile 26: Zeile 30:
 ==== Chrony unter Arch Linux installieren ==== ==== Chrony unter Arch Linux installieren ====
 Bei der Installation des chrony-Paketes verwenden wir unter **[[https://archlinux.org/|Arch Linux]]** den Paketmanager **''pacman''**. Bei der Installation des chrony-Paketes verwenden wir unter **[[https://archlinux.org/|Arch Linux]]** den Paketmanager **''pacman''**.
-  - Als User: <code> $ sudo pacman -S chrony -y </code> +  - Als User: <code> $ sudo pacman -S chrony</code> 
-  - Als Nutzer mit Root-Rechten entsprechend: <code> $ sudo pacman -S chrony -y </code>+  - Als Nutzer mit Root-Rechten entsprechend: <code> pacman -S chrony</code>
  
 ===== Paketinhalt ===== ===== Paketinhalt =====
Zeile 1774: Zeile 1778:
 ++++ ++++
 ===== Dokumentation ===== ===== Dokumentation =====
-Eine ausführliche Onlinedokumentation des Chrony Projekts findet sich auf der entsprechnden Projektseite → https://chrony-project.org/documentation.html Bei der Installation des aktuellen chrony-Paketes z.B. unter Arch Linux finden sich im Verzeichnis **''/usr/share/doc/chrony/''** auch entsprechende FAQs, READMEs, NEWS und Beispiele.+Eine ausführliche Onlinedokumentation des Chrony Projekts findet sich auf der entsprechenden Projektseite → https://chrony-project.org/documentation.html Bei der Installation des aktuellen chrony-Paketes z.B. unter Arch Linux finden sich im Verzeichnis **''/usr/share/doc/chrony/''** auch entsprechende FAQs, READMEs, NEWS und Beispiele.
    # tree /usr/share/doc/chrony/    # tree /usr/share/doc/chrony/
 <code>/usr/share/doc/chrony// <code>/usr/share/doc/chrony//
Zeile 4584: Zeile 4588:
  
 # Django : 2024-02-18 # Django : 2024-02-18
-server pool.ntp.org iburst+pool pool.ntp.org iburst
  
 ####################################################################### #######################################################################
Zeile 4907: Zeile 4911:
 Die relevanten KOnfigurationsoptionen können wir mit Hilfe von **''grep''** uns auch gerafft anzeigen lassen. Die relevanten KOnfigurationsoptionen können wir mit Hilfe von **''grep''** uns auch gerafft anzeigen lassen.
    # grep -Ev '(^%|^$|^#|^!|^;)' /etc/chrony.conf    # grep -Ev '(^%|^$|^#|^!|^;)' /etc/chrony.conf
-<code>server pool.ntp.org iburst+<code>pool pool.ntp.org iburst
 driftfile /var/lib/chrony/drift driftfile /var/lib/chrony/drift
 ntsdumpdir /var/lib/chrony ntsdumpdir /var/lib/chrony
Zeile 5184: Zeile 5188:
 MS Name/IP address         Stratum Poll Reach LastRx Last sample                MS Name/IP address         Stratum Poll Reach LastRx Last sample               
 =============================================================================== ===============================================================================
-^* defiant.tlercher.de            10   377    96    +59us[ +988us] +/-   10ms</code>+^+ time.cnetm.de                   6   377       +755us[ +755us] +/-   17ms 
 +^- frank.askja.de                2     377       -166us[ -166us] +/-   59ms 
 +^* ntp1.noris.net                2     377    72   -154us[ -125us] +/-   12ms 
 +^+ sv1.ggsrv.de                  2     377       +284us[ +284us] +/-   15ms 
 +</code>
  
 Dieses Beispiel zeigt die Abfrage auf unserem zentralen NTP-Server, den wir gerade eingerichtet haben. Nachfolgendes Beispiel zeigt einen Host, der wiederum unseren eigenen zentralen NTP-Server als Quelle benutzt. Dieses Beispiel zeigt die Abfrage auf unserem zentralen NTP-Server, den wir gerade eingerichtet haben. Nachfolgendes Beispiel zeigt einen Host, der wiederum unseren eigenen zentralen NTP-Server als Quelle benutzt.
Zeile 5238: Zeile 5246:
  
    chronyc> sources -v    chronyc> sources -v
-<code>  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.+<code> 
 +  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
  / .- Source state '*' = current best, '+' = combined, '-' = not combined,  / .- Source state '*' = current best, '+' = combined, '-' = not combined,
 | /             'x' = may be in error, '~' = too variable, '?' = unusable. | /             'x' = may be in error, '~' = too variable, '?' = unusable.
Zeile 5248: Zeile 5257:
 MS Name/IP address         Stratum Poll Reach LastRx Last sample                MS Name/IP address         Stratum Poll Reach LastRx Last sample               
 =============================================================================== ===============================================================================
-^* defiant.tlercher.de            10   377   246    +59us[ +988us] +/-   10ms+^+ time.cnetm.de                   6   377     7   +755us[ +755us] +/-   17ms 
 +^- frank.askja.de                2     377       -166us[ -166us] +/-   59ms 
 +^* ntp1.noris.net                2     377    72   -154us[ -125us] +/-   12ms 
 +^+ sv1.ggsrv.de                  2     377       +284us[ +284us] +/-   15ms
 </code> </code>
  
Zeile 5257: Zeile 5269:
 <code>Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev <code>Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
 ============================================================================== ==============================================================================
-defiant.tlercher.de         6     86m     +0.279      0.359    +87us   188us</code>+time.cnetm.de              16  11   782     -0.042      1.299    -35us   292us 
 +frank.askja.de             16     783     +0.281      0.379   +169us    99us 
 +ntp1.noris.net              6     452     -0.529      0.977   -304us    43us 
 +sv1.ggsrv.de               14     784     +0.211      0.264   +434us    70us</code>
  
 Mit der Option **''-v''** erhalten wir eine Kurzbeschreibung der angezeigten Werte.  Mit der Option **''-v''** erhalten wir eine Kurzbeschreibung der angezeigten Werte. 
Zeile 5272: Zeile 5287:
 Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
 ============================================================================== ==============================================================================
-defiant.tlercher.de         6     86m     +0.279      0.359    +95us   188us+time.cnetm.de              16  11   782     -0.042      1.299    -37us   292us 
 +frank.askja.de             16     783     +0.281      0.379   +178us    99us 
 +ntp1.noris.net              6     452     -0.529      0.977   -320us    43us 
 +sv1.ggsrv.de               14     784     +0.211      0.264   +440us    70us
 </code> </code>
  
Zeile 5318: Zeile 5336:
    # chronyc tracking    # chronyc tracking
  
-<code>Reference ID    : 88F3B185 (kronos.mailus.de+<code>Reference ID    : 3E800112 (ntp1.noris.net
-Stratum         : 4 +Stratum         : 3 
-Ref time (UTC)  : Sun Feb 18 18:06:16 2024 +Ref time (UTC)  : Thu Feb 22 12:24:14 2024 
-System time     : 0.000038475 seconds fast of NTP time +System time     : 0.000030264 seconds slow of NTP time 
-Last offset     : +0.000023120 seconds +Last offset     : +0.000049906 seconds 
-RMS offset      : 0.000039260 seconds +RMS offset      : 0.000355495 seconds 
-Frequency       : 23.886 ppm fast +Frequency       : 23.667 ppm fast 
-Residual freq   : +0.003 ppm +Residual freq   : +0.017 ppm 
-Skew            : 0.136 ppm +Skew            : 0.322 ppm 
-Root delay      : 0.029358303 seconds +Root delay      : 0.016084936 seconds 
-Root dispersion : 0.018334404 seconds +Root dispersion : 0.002525240 seconds 
-Update interval : 257.seconds+Update interval : 64.seconds
 Leap status     : Normal</code> Leap status     : Normal</code>
  
Zeile 5372: Zeile 5390:
 <code>Hostname                      NTP   Drop Int IntL Last     Cmd   Drop Int  Last <code>Hostname                      NTP   Drop Int IntL Last     Cmd   Drop Int  Last
 =============================================================================== ===============================================================================
-2003:a:e0d:7603:10::210        39          -    53       0      0       - +fd00::3:10:0:0:210            115          -    50       0      0       - 
-_gateway                       39             53       0      0       -+_gateway                      110      0        50            0       - 
 +2003:a:e0d:7603:10::210        71             42       0      0       -
 </code> </code>
  
Zeile 5387: Zeile 5406:
  
 ===== Orchestrierung - Installation und Konfiguration des chronyd mit Hilfe von Ansible ===== ===== Orchestrierung - Installation und Konfiguration des chronyd mit Hilfe von Ansible =====
-Natürlich wird man im Jahr 2024 nicht mehr ernsthaft, manuell Server aufsetzen und betreiben wollen. Vielmehr wird amn auf ein Orchestrierungswerkzeug wie z.B. **[[linux:ansible:start|Ansible]]** zurückgreifen.+Natürlich wird man im Jahr 2024 nicht mehr ernsthaft, manuell Server aufsetzen und betreiben wollen. Vielmehr wird man auf ein Orchestrierungswerkzeug wie z.B. **[[linux:ansible:start|Ansible]]** zurückgreifen.
  
 Wir werden uns nun nachfolgend sowohl die Client- wie auch die Server-Installation und -konfiguration genauer betrachten.  Wir werden uns nun nachfolgend sowohl die Client- wie auch die Server-Installation und -konfiguration genauer betrachten. 
  
-===== Installation und Client-Konfiguration ===== +==== Installation und Client-Konfiguration ==== 
-Setzen wir einen neue virtuellen Host unter Arch Linux neu auf, oder wollen wir bei einem bestehenden Host die Konfiguration aktualisieren, verwenden wir wie zuvor schon angeschnitten **[[https://www.ansible.com/|Ansible]]** als Orchstrierungswerkzeug. So ist sichergestellt dass zum einen all unsere Hosts entsprechend gleich aufgebaut, konfiguriert und betrieben werden. +Setzen wir einen neue virtuellen Host unter Arch Linux neu auf, oder wollen wir bei einem bestehenden Host die Konfiguration aktualisieren, verwenden wir wie zuvor schon angeschnitten **[[https://www.ansible.com/|Ansible]]** als Orchestrierungswerkzeug. So ist sichergestellt dass zum einen all unsere Hosts entsprechend gleich aufgebaut, konfiguriert und betrieben werden. 
  
 +=== Rolle ===
 Für die Konfiguration unserer Hosts verwenden wir eine eigene Rolle **''chrony_client''**, die wir dann in einem unserer Playbooks später einfach mit aufrufen werden. Für die Konfiguration unserer Hosts verwenden wir eine eigene Rolle **''chrony_client''**, die wir dann in einem unserer Playbooks später einfach mit aufrufen werden.
    $ tree roles/chrony_client/    $ tree roles/chrony_client/
Zeile 5410: Zeile 5430:
 └── vars</code> └── vars</code>
  
-Wie wir sehen ist die Rolle durchaus überschaubar, im Task **''main.yaml''** verweisen wir lediglich auf den eigentlichen Task **''chrony-.yml''**.+Wie wir sehen ist die Rolle durchaus überschaubar, im Task **''main.yaml''** verweisen wir lediglich auf den eigentlichen Task **''chrony.yml''**.
    $ vim ~/ansible/roles/chrony_client/tasks/main.yml    $ vim ~/ansible/roles/chrony_client/tasks/main.yml
 <file yaml roles/chrony_client/tasks/main.yml>---                                     # Playbook/Rolle zur Konfiguration des NTP-Clients                                                <file yaml roles/chrony_client/tasks/main.yml>---                                     # Playbook/Rolle zur Konfiguration des NTP-Clients                                               
Zeile 5420: Zeile 5440:
    $ vim ~/ansible/roles/chrony_client/tasks/chrony.yml    $ vim ~/ansible/roles/chrony_client/tasks/chrony.yml
 <file yaml roles/chrony_client/tasks/chrony.yml>--- # YAML Start <file yaml roles/chrony_client/tasks/chrony.yml>--- # YAML Start
-    # SSH Server Configdatei erzeugen und kopieren.+    # Chrony Daemon installieren und als Client konfigurieren.
  
 - name: "Installation des chrony-Daemons." - name: "Installation des chrony-Daemons."
Zeile 5431: Zeile 5451:
     path: /etc/chrony.conf.orig     path: /etc/chrony.conf.orig
   register: check_chrony_config   register: check_chrony_config
 +
 +- name: "Sofern bereits eine Backupdatei der chrony.conf existiert, diese rücksichern."
 +  ansible.builtin.copy:
 +    remote_src: true
 +    src: /etc/chrony.conf.orig
 +    dest: /etc/chrony.conf
 +    owner: root
 +    group: root
 +    mode: '0644'
 +  when: check_chrony_config.stat.exists
  
 - name: "Backupdatei der chrony.conf Konfigurationsdatei erstellen." - name: "Backupdatei der chrony.conf Konfigurationsdatei erstellen."
Zeile 5467: Zeile 5497:
 ... # YML Ende</file> ... # YML Ende</file>
  
-Über die Variable **''chrony_config''** definieren wir nun im Inventory entweder in den Host- oder Group-Variablen welchen NTP-Server bzw. welchen NTP-Pool wir verwenden möchten. In Nachfolgendem Beispiel setzen wir für alle Host der Zone **edmz** als NTP-Server den Host **''time.dmz.nausch.org''**.+=== Inventory -Variablendefinition === 
 +Über die Variable **''chrony_config''** definieren wir nun im Inventory entweder in den Host- oder Group-Variablen welchen NTP-Server bzw. welchen NTP-Pool wir verwenden möchten. In Nachfolgendem Beispiel setzen wir für alle Host der Zone **edmz** als NTP-Server die Host-IP-Adressen **''fd00::3:10:0:0:110''**, **''2003:a:e0d:7603:10::110''** und **''10.0.0.110''**. Ferner setzen wir noch als Empfangs-eMail-Adresse die unseres Hauptadmins, falls chronyd einen Fehler von mehr als 0,5 Sekunden korrigieren muss
  
    $ vim inventories/production/group_vars/edmz/chrony    $ vim inventories/production/group_vars/edmz/chrony
-<file bash inventories/production/host_vars/pml010102/chrony> +<file yaml inventories/production/group_vars/edmz/chrony>chrony_config:                                                                                                        
-chrony_config:+
   - from: 'pool 2.arch.pool.ntp.org iburst'   - from: 'pool 2.arch.pool.ntp.org iburst'
-    to:   'server time.dmz.nausch.org iburst'+    to  
 +           server fd00::3:10:0:0:110      iburst 
 +           server 2003:a:e0d:7603:10::110 iburst 
 +           server 10.0.0.110              iburst 
 +  - from: '! mailonchange wibble@example.net 0.5' 
 +    to  : mailonchange django@nausch.org 0.5
 </file> </file>
  
-Die definierte Rolle **chrony_client** binden wird dann z.B. in das Playbook für den Bau einer neuen VM ein. +=== Playbook === 
-   # vim playbooks/kvm_gast_gen.yml +Die definierte Rolle **chrony_client** binden wird dann z.B. in das Playbook für die Installation und Konfiguration des **chrony**-Daemon im **Client-Mode** ein. 
-<file yaml playbooks/kvm_gast_gen.yml>--- +   # vim playbooks/arch_chrony_client.yml 
-# Ansible Playbook zum Erstellen einer virtuellen Maschine auf Basis Arch-Linux auf dem neuen ArchLinux KVM-Host+<file yaml playbooks/arch_chrony_client.yml>--- 
-# Aufruf via $ ansible-playbook playbooks/kvm_gast_gen.yml --limit <-VHOSTNAME->, also z.B.: +# Ansible Playbook zum Konfigurieren des Chrony-Daemon im Client-Modus unter Arch-Linux. 
-#  $ ansible-playbook playbooks/kvm_gast_gen.yml --limit vml000210 --ssh-common-args='-o StrictHostKeyChecking=no'+# Aufruf via $ ansible-playbook playbooks/arch_chrony_client.yml --limit <-VHOSTNAME->, also z.B.: 
 +#  $ ansible-playbook playbooks/arch_chrony_client.yml --limit vml000210
 # für einen Host aus der Hostgruppe DMZ. # für einen Host aus der Hostgruppe DMZ.
  
-- name: kvm_gast_gen.yml                    # Name des Playbooks+- name: arch_chrony_client.yml              # Name des Playbooks
   hosts: idmz:edmz:intra                    # Hostgruppe für die das Playbook gelten soll   hosts: idmz:edmz:intra                    # Hostgruppe für die das Playbook gelten soll
-  vars:                                     # 
-    ssh_user: "{{ lookup('env','USER') }}"  # aktuellen Benutzer ermitteln und Variable übergeben 
-  gather_facts: false                       # keine Informationen des|der remote-hosts einsammeln 
  
   roles:   roles:
-    - role: arch_gast_install               # Basisinstallation und Konfiguration von Arch-Linux 
-      tags: arch_gast_install               # Tag-Kennzeichnung der definierten Rolle 
-    - role: arch_user                       # Admin-Konten anlegen 
-      tags: arch_user                       # Tag-Kennzeichnung der definierten Rolle 
-    - role: ssh_server                      # SSH Server konfigurieren 
-      tags: ssh_server                      # Tag-Kennzeichnung der definierten Rolle 
     - role: chrony_client                   # Chrony-Client installieren und konfigurieren     - role: chrony_client                   # Chrony-Client installieren und konfigurieren
       tags: chrony_client                   # Tag-Kennzeichnung der definierten Rolle       tags: chrony_client                   # Tag-Kennzeichnung der definierten Rolle
-    - role: arch_reboot_vm                  # Reboot des VHosts nach erfolgter Grundkonfiguration 
-      tags: arch_reboot_vm                  # Tag-Kennzeichnung der definierten Rolle 
-    - role: arch_mate                       # Mate Desktop installieren 
-      tags: mate                            # Tag-Kennzeichnung der definierten Rolle 
-      when: ( guest_mate == "true" )        # 
-    - role: arch_snapper                    # Snapper installieren 
-      tags: snapper                         # Tag-Kennzeichnung der definierten Rolle 
-    - role: arch_sysinfo_vm                 # Sysinfo4Wallpaper installieren 
-      tags: wallpaper                       # Tag-Kennzeichnung der definierten Rolle 
-      when: ( guest_mate == "true" )        # 
-    - role: arch_reboot_vm                  # Reboot des VHosts nach erfolgter Grundkonfiguration 
-      tags: arch_reboot_vm_end              # Tag-Kennzeichnung der definierten Rolle 
 ... ...
 </file> </file>
 +
 +=== Playbooklauf ===
 +Die orchestrierte Variante der Installation und Konfiguration unseres **chrony**-Daemon im **Client-Mode** gestaltet sich ab sofort sehr einfach, brauchen wir doch lediglich die Konfigurationswerte im Inventory zu hinterlegen und zu pflegen und letztendlich das Playbook entsprechend aufzurufen:
 +   $ ansible-playbook playbooks/arch_chrony_client.yml --limit vml000210
 +
 +<html><pre class="code">
 +<font style="color: rgb(0, 0, 0)">[19:32:35] Gathering Facts</font>
 +<font style="color: rgb(25, 100, 5)">↳  vml000210 | SUCCESS | 1.81s</font>
 +<font style="color: rgb(0, 0, 0)">[19:32:37] chrony_client : include_tasks</font>
 +<font style="color: rgb(25, 100, 5)">↳  vml000210 | SUCCESS | 21ms</font>
 +<font style="color: rgb(0, 0, 0)">[19:32:37]     ↳ chrony: Installation des chrony-Daemons.</font>
 +<font style="color: rgb(25, 100, 5)">↳  vml000210 | SUCCESS | 1.34s</font>
 +<font style="color: rgb(0, 0, 0)">[19:32:38]     ↳ chrony: Checken ob es bereits eine Backupdatei der chrony.conf gibt.</font>
 +<font style="color: rgb(25, 100, 5)">↳  vml000210 | SUCCESS | 713ms</font>
 +<font style="color: rgb(0, 0, 0)">[19:32:39]     ↳ chrony: Sofern bereits eine Backupdatei der chrony.conf existiert, diese rücksichern.</font>
 +<font style="color: rgb(196, 160, 0)">↳  vml000210 | CHANGED | 661ms</font>
 +<font style="color: rgb(0, 0, 0)">[19:32:40]     ↳ chrony: Backupdatei der chrony.conf Konfigurationsdatei erstellen.</font>
 +<font style="color: rgb(43, 100, 164)">vml000210 | SKIPPED | 31ms</font>
 +<font style="color: rgb(0, 0, 0)">[19:32:40]     ↳ chrony: Änderungen an der chrony.conf mit blockinfile vornehmen.</font>
 +<font style="color: rgb(196, 160, 0)">↳  vml000210 | CHANGED | 616ms</font>
 +<font style="color: rgb(0, 0, 0)">[19:32:41]     ↳ chrony: Änderungen an der chrony.conf mit lineinfile vornehmen.</font>
 +<font style="color: rgb(196, 160, 0)">↳  vml000210 | CHANGED | 1.18s</font>
 +<font style="color: rgb(0, 0, 0)">[19:32:42]     ↳ chrony: Sicherstellen, dass der chrony Service reboot(-fest) startet.</font>
 +<font style="color: rgb(25, 100, 5)">↳  vml000210 | SUCCESS | 984ms</font>
 +<font style="color: rgb(0, 0, 0)">[19:32:43] system</font>
 +<font style="color: rgb(25, 100, 5)">-- Play recap --</font>
 +<font style="color: rgb(196, 160, 0)">vml000210                  </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=8    </font><font style="color: rgb(196, 160, 0)">changed=3    </font>unreachable=0    failed=0    <font style="color: rgb(43, 100, 164)">skipped=1</font>    rescued=0    ignored=0</font>
 +</pre>
 +</html>
 +
 +==== Installation und Chrony-Server-Konfiguration ====
 +Damit unsere eigenen neue virtuellen Host unter Arch Linux die Zeit von unserem eigenen NTP-Server holen können werden wir nun im nächsten Konfigurationsbeispiel mit Hilfe von **[[https://www.ansible.com/|Ansible]] chrony** installieren und als NTP-Server konfigurieren.
 +
 +=== Rollen ===
 +== Chrony ==
 +Da sich die Installation und Konfiguration unseres **chrony** im Daemon-Modus lediglich bei den Konfigurationsparametern unterscheidet, können wir die Rolle aus dem vorherigen Beispiel einfach aufgreifen und wiederverwenden!
 +   $ tree roles/chrony_client/
 +++++ roles/chrony_client/ |
 +<code>roles/chrony_client/
 +├── defaults
 +├── files
 +├── handlers
 +├── library
 +├── lookup_plugins
 +├── meta
 +├── module_utils
 +├── tasks
 +│   ├── chrony.yml
 +│   └── main.yml
 +├── templates
 +└── vars</code>
 +++++
 +
 +Wie wir sehen ist die Rolle durchaus überschaubar, im Task **''main.yaml''** verweisen wir lediglich auf den eigentlichen Task **''chrony-.yml''**.
 +   $ vim ~/ansible/roles/chrony_client/tasks/main.yml
 +++++ roles/chrony_client/tasks/main.yml |
 +<file yaml roles/chrony_client/tasks/main.yml>---                                     # Playbook/Rolle zur Konfiguration des NTP-Clients                                               
 +- include_tasks: chrony.yml             # Chrony Client installieren und konfigurieren.
 +  tags: chrony                          #
 +...                                     # YML Ende</file>
 +++++
 +
 +Die eigentliche Installation und Konfiguration erfolgt dann im Task **''chrony.yml''**.
 +   $ vim ~/ansible/roles/chrony_client/tasks/chrony.yml
 +++++ roles/chrony_client/tasks/chrony.yml |
 +<file yaml roles/chrony_client/tasks/chrony.yml>--- # YAML Start
 +    # Chrony Daemon installieren und als Client konfigurieren.
 +
 +- name: "Installation des chrony-Daemons."
 +  community.general.pacman:
 +    name: chrony
 +    state: present
 +
 +- name: "Checken ob es bereits eine Backupdatei der chrony.conf gibt."
 +  ansible.builtin.stat:
 +    path: /etc/chrony.conf.orig
 +  register: check_chrony_config
 +
 +- name: "Sofern bereits eine Backupdatei der chrony.conf existiert, diese rücksichern."
 +  ansible.builtin.copy:
 +    remote_src: true
 +    src: /etc/chrony.conf.orig
 +    dest: /etc/chrony.conf
 +    owner: root
 +    group: root
 +    mode: '0644'
 +  when: check_chrony_config.stat.exists
 +
 +- name: "Backupdatei der chrony.conf Konfigurationsdatei erstellen."
 +  ansible.builtin.copy:
 +    remote_src: true
 +    src: /etc/chrony.conf
 +    dest: /etc/chrony.conf.orig
 +    owner: root
 +    group: root
 +    mode: '0644'
 +  when: not check_chrony_config.stat.exists
 +
 +- name: "Änderungen an der chrony.conf mit blockinfile vornehmen."
 +  ansible.builtin.blockinfile:
 +    path: /etc/chrony.conf
 +    marker: '# {mark} ANSIBLE MANAGED - DO NOT EDIT BLOCK'
 +    insertbefore: BOF
 +    block: |
 +      # Ansible managed configuration file, do not modify manually!
 +
 +- name: "Änderungen an der chrony.conf mit lineinfile vornehmen."
 +  ansible.builtin.lineinfile:
 +    dest: /etc/chrony.conf
 +    regexp: '{{ item.from }}'
 +    line: '{{ item.to }}'
 +    state: present
 +    backrefs: false
 +  with_items: '{{ chrony_config }}'
 +
 +- name: "Sicherstellen, dass der chrony Service reboot(-fest) startet."
 +  ansible.builtin.systemd:
 +    name: chronyd
 +    # state: reloaded
 +    enabled: true
 +
 +... # YML Ende</file>
 +++++
 +
 +== Firewalld - Paketfilter ==
 +Der eigentliche "große" Unterschied zwischen **Client-** und **Daemon-Mode** bei unserer chrony-Konfiguration ist der Umstand, dass wir auf unserem NTP-Server mit Hilfe des Firewall-Daemon **''firewalld''** noch die Verkehrsbeziehungen freischalten und den Port **''123/UDP''** für die betreffenden Netze freischalten werden.
 +
 +Diese Konfiguration lagern wir in einer eigenen Rolle aus, da diese ja bei Hosts, die den chronyd lediglich als Client nutzen nicht benötigt wird.
 +
 +Da sich die Installation und Konfiguration unseres **chrony** im Daemon-Modus lediglich bei den Konfigurationsparametern unterscheidet, können wir die Rolle aus dem vorherigen Beispiel einfach aufgreifen und wiederverwenden!
 +
 +Für die Konfiguration der Paketfilterregeln unseres NTP-Serversverwenden wir eine eigene Rolle **chrony_firewalld**, die wir dann in einem unserer Playbooks später einfach mit aufrufen werden. 
 +
 +   $ tree roles/chrony_firewalld/
 +
 +<code>roles/chrony_firewalld/
 +├── defaults
 +├── files
 +├── handlers
 +├── library
 +├── lookup_plugins
 +├── meta
 +├── module_utils
 +├── tasks
 +│   ├── config.yml
 +│   └── main.yml
 +├── templates
 +└── vars</code>
 +
 +Wie wir sehen ist die Rolle durchaus überschaubar, im Task **''main.yaml''** verweisen wir lediglich auf den eigentlichen Task **''chrony-.yml''**.
 +   $ vim ~/ansible/roles/chrony_firewalld/tasks/main.yml
 +
 +<file yaml roles/chrony_firewalld/tasks/main.yml>---                                     # Playbook/Rolle zur Konfiguration des firewalld                              
 +- include_tasks: config.yml             # firewall konfigurieren.
 +  tags: config                          #
 +...                                     # YML Ende
 +</file>
 +
 +Die eigentliche Konfiguration unserer notwendigen Firewall-Regeln erfolgt dann im Task **''config.yml''**.
 +   $ vim ~/ansible/roles/chrony_firewalld/tasks/config.yml
 +
 +<file yaml roles/chrony_firewalld/tasks/config.yml>-- # YAML Start
 +    # Firewall Daemon Regeln für chrony im Daemon-Mode konfigurieren.
 +
 +- name: "Port 123/UDP für IPv4 in der Zone IDMZ freischalten."
 +  ansible.posix.firewalld:
 +    rich_rule: >
 +      rule family=ipv4
 +      source address={{ guest_ip4_net_1 }}{{ guest_mask4_1 }}
 +      port protocol="udp" port="123"
 +      destination address={{ guest_ip4_1 }}/32
 +      accept
 +    zone: '{{ guest_zone_1 }}'
 +    immediate: true
 +    permanent: true
 +    state: enabled
 +
 +- name: "Port 123/UDP für IPv6 (ULA) in der Zone IDMZ freischalten."
 +  ansible.posix.firewalld:
 +    rich_rule: >
 +      rule family=ipv6
 +      source address=fd00::/10
 +      port protocol="udp" port="123"
 +      destination address={{ guest_ip6_ls_1 }}{{ guest_mask6_1 }}
 +      accept
 +    zone: '{{ guest_zone_1 }}'
 +    immediate: true
 +    permanent: true
 +    state: enabled
 +
 +- name: "Port 123/UDP für IPv6 (Global-Scope) in der Zone IDMZ freischalten."
 +  ansible.posix.firewalld:
 +    rich_rule: >
 +      rule family=ipv6
 +      source address={{ guest_ip6_net_1 }}{{ guest_mask6_1 }}
 +      port protocol="udp" port="123"
 +      destination address={{ guest_ip6_gs_1 }}{{ guest_mask6_1 }}
 +      accept
 +    zone: '{{ guest_zone_1 }}'
 +    immediate: true
 +    permanent: true
 +    state: enabled
 +
 +- name: "Port 123/UDP für IPv4 in der Zone INTRA freischalten."
 +  ansible.posix.firewalld:
 +    rich_rule: >
 +      rule family=ipv4
 +      source address={{ guest_ip4_net_2 }}{{ guest_mask4_2 }}
 +      port protocol="udp" port="123"
 +      destination address={{ guest_ip4_2 }}/32
 +      accept
 +    zone: '{{ guest_zone_2 }}'
 +    immediate: true
 +    permanent: true
 +    state: enabled
 +
 +- name: "Port 123/UDP für IPv6 (ULA) in der Zone INTRA freischalten."
 +  ansible.posix.firewalld:
 +    rich_rule: >
 +      rule family=ipv6
 +      source address=fd00::/10
 +      port protocol="udp" port="123"
 +      destination address={{ guest_ip6_ls_2 }}{{ guest_mask6_2 }}
 +      accept
 +    zone: '{{ guest_zone_2 }}'
 +    immediate: true
 +    permanent: true
 +    state: enabled
 +
 +- name: "Port 123/UDP für IPv6 (Global-Scope) in der Zone INTRA freischalten."
 +  ansible.posix.firewalld:
 +    rich_rule: >
 +      rule family=ipv6
 +      source address={{ guest_ip6_net_2 }}{{ guest_mask6_2 }}
 +      port protocol="udp" port="123"
 +      destination address={{ guest_ip6_gs_2 }}{{ guest_mask6_2 }}
 +      accept
 +    zone: '{{ guest_zone_2 }}'
 +    immediate: true
 +    permanent: true
 +    state: enabled
 +
 +- name: "Regeländerungen auf vml000110 neu laden."
 +  ansible.builtin.service:
 +    name: firewalld
 +    state: reloaded
 +
 +... # YML Ende</file>
 +
 +=== Inventory -Variablendefinition ===
 +== chronyd==
 +Über die Variable **''chrony_config''** definieren wir nun im Inventory in den Host-Variablen alle Konfigurationsparameter, die wir bei unserem NTP-Server bzw. genauer gesagt bei unserem **chronyd** im **Server-Mode**setzen wollen.
 +
 +   $ vim inventories/production/host_vars/vml010110/chrony
 +<file yaml inventories/production/host_vars/vml010110/chrony>chrony_config:                                                                                              
 +  - from: 'pool 2.arch.pool.ntp.org iburst'
 +    to  : pool pool.ntp.org              iburst
 +  - from: '! dumpdir /var/lib/chrony'
 +    to  : dumpdir /var/lib/chrony
 +  - from: '# is unimportant.'
 +    to  : |
 +          # is unimportant.
 +          #
 +          # nausch.org :
 +          allow fd00::/10
 +          allow 10.0.0.0/24
 +          allow 2003:a:e0d:7603::/64
 +          allow 192.168.0.0/24
 +          allow 2003:a:e0d:7607::/64
 +  - from: '! local stratum 10'
 +    to  : local stratum 3
 +  - from: '! logchange 0.5'
 +    to  : logchange 0.5
 +  - from: '! mailonchange wibble@example.net 0.5'
 +    to  : mailonchange django@nausch.org 0.5
 +  - from: '! lock_all'
 +    to  : lock_all
 +</file>
 +
 +== firewalld==
 +Die Netzwerkspezifischen Definitionen für den Paketfilter holen wir uns aus den Netzwerk-Variablen unseres Hosts selbst.
 +
 +   $ vim inventories/production/host_vars/vml010110/kvm_vhost
 +<file yaml inventories/production/host_vars/vml010110/kvm_vhost>kvm_base:           "kvm-arch"                                                                              
 +host_dev:           "eth0"
 +host_ip:            '{{ guest_ip4_1 }}'
 +guest_name:         "vml000110"
 +guest_zone:         "idmz"
 +guest_domain:       "nausch.org"
 +guest_desc:         "Ansible-Test-VM III on new ArchLINUX"
 +guest_mate:         "true"
 +guest_ram:          8192
 +guest_cpu:          4
 +guest_imagesize:    30
 +guest_imagetype:    "qcow2"
 +guest_imagemode:    "compat=1.1"
 +guest_source:       "archlinux-2024.01.16-x86_64.iso"
 +guest_zone_1:       "idmz"
 +guest_bridge_1:     "br3"
 +guest_nic_1:        "eth0"
 +guest_direction_1:  "idmz_2_intra"
 +guest_mac_1:        "52:54:00:41:11:01"
 +guest_ip4_net_1:    "10.0.0.0"
 +guest_ip4_1:        "10.0.0.110"
 +guest_mask4_1:      "/24"
 +guest_gw4_1:        "10.0.0.210"
 +guest_dns4_1:       "217.237.151.142"
 +guest_ip6_ll_1:     "fe80::3:10:ff:fe00:110"
 +guest_ip6_ls_1:     "fd00::3:10:0:0:110"
 +guest_ip6_gs_1:     "2003:a:e0d:7603:10::110"
 +guest_ip6_net_1:    "2003:a:e0d:7603::"
 +guest_mask6_1:      "/64"
 +guest_gw6_1:        "fd00::3:10:0:0:210"
 +guest_dns6_1:       "2003:180:2:a000::53"
 +guest_zone_2:       "intra"
 +guest_bridge_2:     "br4"
 +guest_nic_2:        "eth1"
 +guest_direction_2:  "intra_2_idmz"
 +guest_mac_2:        "52:54:00:41:11:02"
 +guest_ip4_net_2:    "192.168.0.0"
 +guest_ip4_2:        "192.168.0.110"
 +guest_mask4_2:      "/24"
 +guest_gw4_2:        "10.0.0.210"
 +guest_dns4_2:       "217.237.151.142"
 +guest_ip6_ll_2:     "fe80::7:1921:68ff:fe00:110"
 +guest_ip6_ls_2:     "fd00::7:192:168:0:110"
 +guest_ip6_gs_2:     "2003:a:e0d:7607:1920:168:0:110"
 +guest_ip6_net_2:    "2003:a:e0d:7607::"
 +guest_mask6_2:      "/64"
 +guest_gw6_2:
 +guest_dns6_2:
 +</file>
 +
 +=== Playbook ===
 +Die definierte Rollen **chrony_client** und **chrony_firewalld** binden wird dann z.B. in das Playbook für die Installation und Konfiguration des **chrony**-Daemon im **Server-Mode** ein.
 +   # vim playbooks/arch_chrony_server.yml
 +<file yaml playbooks/arch_chrony_server.yml>---
 +# Ansible Playbook zum Konfigurieren des Chrony-Daemon im Server-Modus unter Arch-Linux.
 +# Aufruf via $ ansible-playbook playbooks/arch_chrony_client.yml :
 +#  $ ansible-playbook playbooks/arch_chrony_server.yml
 +# für einen Host aus der Hostgruppe DMZ.
 +
 +- name: arch_chrony_server.yml              # Name des Playbooks
 +  hosts: vml010110                          # Hostgruppe für die das Playbook gelten soll
 +
 +  roles:
 +    - role: chrony_client                   # Chrony-Client installieren und konfigurieren
 +      tags: chrony_client                   # Tag-Kennzeichnung der definierten Rolle
 +    - role: chrony_firewalld                # Paketfilter-Regeln für Chrony-Server anlegen
 +      tags: chrony_firewalld                # Tag-Kennzeichnung der definierten Rolle
 +...
 +</file>
 +
 +=== Playbooklauf ===
 +Die orchestrierte Variante der Installation und Konfiguration unseres **chrony**-Daemon im **Server-Mode** gestaltet sich ab sofort sehr einfach, brauchen wir doch lediglich die Konfigurationswerte im Inventory zu hinterlegen und zu pflegen und letztendlich das Playbook entsprechend aufzurufen:
 +   $ ansible-playbook playbooks/arch_chrony_server.yml
 +
 +<html><pre class="code">
 +<font style="color: rgb(0, 0, 0)">[23:10:06] Gathering Facts</font>
 +<font style="color: rgb(25, 100, 5)">↳  vml010110 | SUCCESS | 1.79s</font>
 +<font style="color: rgb(0, 0, 0)">[23:10:08] chrony_client : include_tasks</font>
 +<font style="color: rgb(25, 100, 5)">↳  vml010110 | SUCCESS | 24ms</font>
 +<font style="color: rgb(0, 0, 0)">[23:10:08]     ↳ chrony: Installation des chrony-Daemons.</font>
 +<font style="color: rgb(25, 100, 5)">↳  vml010110 | SUCCESS | 1.34s</font>
 +<font style="color: rgb(0, 0, 0)">[23:10:10]     ↳ chrony: Checken ob es bereits eine Backupdatei der chrony.conf gibt.</font>
 +<font style="color: rgb(25, 100, 5)">↳  vml010110 | SUCCESS | 679ms</font>
 +<font style="color: rgb(0, 0, 0)">[23:10:10]     ↳ chrony: Sofern bereits eine Backupdatei der chrony.conf existiert, diese rücksichern.</font>
 +<font style="color: rgb(196, 160, 0)">↳  vml010110 | CHANGED | 626ms</font>
 +<font style="color: rgb(0, 0, 0)">[23:10:11]     ↳ chrony: Backupdatei der chrony.conf Konfigurationsdatei erstellen.
 +<font style="color: rgb(43, 100, 164)">vml010110 | SKIPPED | 36ms</font>
 +<font style="color: rgb(0, 0, 0)">[23:10:11]     ↳ chrony: Änderungen an der chrony.conf mit blockinfile vornehmen.</font>
 +<font style="color: rgb(196, 160, 0)">↳  vml010110 | CHANGED | 607ms</font>
 +<font style="color: rgb(0, 0, 0)">[23:10:12]     ↳ chrony: Änderungen an der chrony.conf mit lineinfile vornehmen.</font>
 +<font style="color: rgb(196, 160, 0)">↳  vml010110 | CHANGED | 3.97s</font>
 +<font style="color: rgb(0, 0, 0)">[23:10:16]     ↳ chrony: Sicherstellen, dass der chrony Service reboot(-fest) startet.</font>
 +<font style="color: rgb(25, 100, 5)">↳  vml010110 | SUCCESS | 984ms</font>
 +<font style="color: rgb(0, 0, 0)">[23:10:17] chrony_firewalld : include_tasks</font>
 +<font style="color: rgb(25, 100, 5)">↳  vml010110 | SUCCESS | 36ms</font>
 +<font style="color: rgb(0, 0, 0)">[23:10:17]     ↳ config: Port 123/UDP für IPv4 in der Zone IDMZ freischalten.</font>
 +<font style="color: rgb(196, 160, 0)">↳  vml010110 | CHANGED | 848ms</font>
 +<font style="color: rgb(0, 0, 0)">[23:10:17]     ↳ config: Port 123/UDP für IPv6 (ULA) in der Zone IDMZ freischalten.</font>
 +<font style="color: rgb(196, 160, 0)">↳  vml010110 | CHANGED | 7276ms</font>
 +<font style="color: rgb(0, 0, 0)">[23:10:18]     ↳ config: Port 123/UDP für IPv6 (Global-Scope) in der Zone IDMZ freischalten.</font>
 +<font style="color: rgb(196, 160, 0)">↳  vml010110 | CHANGED | 697ms</font>
 +<font style="color: rgb(0, 0, 0)">[23:10:19]     ↳ config: Port 123/UDP für IPv4 in der Zone INTRA freischalten.</font>
 +<font style="color: rgb(196, 160, 0)">↳  vml010110 | CHANGED | 798ms</font>
 +<font style="color: rgb(0, 0, 0)">[23:10:20]     ↳ config: Port 123/UDP für IPv6 (ULA) in der Zone INTRA freischalten.</font>
 +<font style="color: rgb(196, 160, 0)">↳  vml010110 | CHANGED | 774ms</font>
 +<font style="color: rgb(0, 0, 0)">[23:10:20]     ↳ config: Port 123/UDP für IPv6 (Global-Scope) in der Zone INTRA freischalten.</font>
 +<font style="color: rgb(196, 160, 0)">↳  vml010110 | CHANGED | 804ms</font>
 +<font style="color: rgb(0, 0, 0)">[23:10:21]     ↳ config: Regeländerungen auf vml000110 neu laden.</font>
 +<font style="color: rgb(196, 160, 0)">↳  vml010110 | CHANGED | 1.02s</font>
 +<font style="color: rgb(0, 0, 0)">[23:10:22] system</font>
 +<font style="color: rgb(25, 100, 5)">-- Play recap --</font>
 +<font style="color: rgb(196, 160, 0)">vml010110                  </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=16   </font><font style="color: rgb(196, 160, 0)">changed=10   </font>unreachable=0    failed=0    <font style="color: rgb(43, 100, 164)">skipped=1</font>    rescued=0    ignored=0</font>
 +</pre>
 +</html>
 +
 +====== Links ======
 +  * Zurück zu **[[wiki:start|Projekte und Themenkapitel]]**
 +  * Zurück zu **[[centos:start|LINUX Installation und Konfiguration]]**
 +  * Zurück zu **[[linux:ansible:start|Zurück zur "Ansible"-Übersicht"]]**
 +  * Zurück zur **[[http://dokuwiki.nausch.org/doku.php/|Startseite]]**
  
  • linux/ntp.1708537875.txt.gz
  • Zuletzt geändert: 21.02.2024 17:51.
  • von django