Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| linux:ntp [19.02.2024 13:21. ] – [Manualpage von chronyd] django | linux:ntp [03.07.2024 19:56. ] (aktuell) – [Rolle] django | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | {{htmlmetatags> | ||
| + | metatag-keywords=(Ansible, | ||
| + | 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 ====== | ||
| {{: | {{: | ||
| Zeile 26: | Zeile 30: | ||
| ==== Chrony unter Arch Linux installieren ==== | ==== Chrony unter Arch Linux installieren ==== | ||
| Bei der Installation des chrony-Paketes verwenden wir unter **[[https:// | Bei der Installation des chrony-Paketes verwenden wir unter **[[https:// | ||
| - | - Als User: < | + | - Als User: < |
| - | - Als Nutzer mit Root-Rechten entsprechend: | + | - Als Nutzer mit Root-Rechten entsprechend: |
| ===== Paketinhalt ===== | ===== Paketinhalt ===== | ||
| Zeile 110: | Zeile 114: | ||
| Nach der Installation des **chrony** Paketes finden wir zwei Binärpakete in unserem System. | Nach der Installation des **chrony** Paketes finden wir zwei Binärpakete in unserem System. | ||
| + | # ll -alF / | ||
| + | < | ||
| + | -rwxr-xr-x 1 root root 297640 Dec 24 08:56 / | ||
| ==== Binary chronyc ==== | ==== Binary chronyc ==== | ||
| **'' | **'' | ||
| Zeile 130: | Zeile 137: | ||
| ==== Manualpage von chronyc ==== | ==== Manualpage von chronyc ==== | ||
| - | Bei Bedarf wirft man einen Blick in besagte Manual-Page | + | Bei Bedarf wirft man einen Blick in besagte Manual-Page. |
| - | < | + | |
| - | <panel title=" | + | |
| + | ++++ chronyc manpage | | ||
| < | < | ||
| Zeile 1538: | Zeile 1546: | ||
| chrony 4.5 2023-12-05 | chrony 4.5 2023-12-05 | ||
| </ | </ | ||
| - | </ | + | ++++ |
| - | </ | + | |
| ==== Binary chronyd ==== | ==== Binary chronyd ==== | ||
| Zeile 1574: | Zeile 1580: | ||
| ==== Manualpage von chronyd ==== | ==== Manualpage von chronyd ==== | ||
| - | Eine ausführliche Beschreibung des Daemon und seiner Optionen findet man in zugehöriger Manual-Page | + | Eine ausführliche Beschreibung des Daemon und seiner Optionen findet man in zugehöriger Manual-Page. |
| $ man chronyd | $ man chronyd | ||
| Zeile 1772: | Zeile 1778: | ||
| ++++ | ++++ | ||
| ===== Dokumentation ===== | ===== Dokumentation ===== | ||
| - | Eine ausführliche Onlinedokumentation des Chrony Projekts findet sich auf der entsprechnden | + | Eine ausführliche Onlinedokumentation des Chrony Projekts findet sich auf der entsprechenden |
| # tree / | # tree / | ||
| < | < | ||
| Zeile 4582: | Zeile 4588: | ||
| # Django : 2024-02-18 | # Django : 2024-02-18 | ||
| - | server | + | pool pool.ntp.org iburst |
| ####################################################################### | ####################################################################### | ||
| Zeile 4737: | Zeile 4743: | ||
| ! allow 192.168/16 | ! allow 192.168/16 | ||
| # Django : 2024-02-18 | # Django : 2024-02-18 | ||
| + | allow fd00::/10 | ||
| allow 10.0.0.0/24 | allow 10.0.0.0/24 | ||
| allow 2003: | allow 2003: | ||
| Zeile 4904: | Zeile 4911: | ||
| Die relevanten KOnfigurationsoptionen können wir mit Hilfe von **'' | Die relevanten KOnfigurationsoptionen können wir mit Hilfe von **'' | ||
| # grep -Ev ' | # grep -Ev ' | ||
| - | < | + | < |
| driftfile / | driftfile / | ||
| ntsdumpdir / | ntsdumpdir / | ||
| Zeile 4910: | Zeile 4917: | ||
| leapsectz right/UTC | leapsectz right/UTC | ||
| makestep 1.0 3 | makestep 1.0 3 | ||
| + | allow fd00::/ | ||
| allow 10.0.0.0/24 | allow 10.0.0.0/24 | ||
| allow 2003: | allow 2003: | ||
| Zeile 4937: | Zeile 4945: | ||
| # firewall-cmd --permanent --zone=idmz --add-rich-rule=" | # firewall-cmd --permanent --zone=idmz --add-rich-rule=" | ||
| destination address=" | destination address=" | ||
| + | |||
| + | success | ||
| + | |||
| + | |||
| + | # firewall-cmd --permanent --zone=idmz --add-rich-rule=" | ||
| + | destination address=" | ||
| success | success | ||
| Zeile 4950: | Zeile 4964: | ||
| success | success | ||
| - | Anschliessend | + | # firewall-cmd --permanent --zone=idmz --add-rich-rule=" |
| + | destination address=" | ||
| + | |||
| + | success | ||
| + | |||
| + | |||
| + | Anschließend | ||
| # firewall-cmd --reload | # firewall-cmd --reload | ||
| Zeile 4957: | Zeile 4977: | ||
| Werfen wir noch kurz einen Blick in die Zone **'' | Werfen wir noch kurz einen Blick in die Zone **'' | ||
| # firewall-cmd --zone=idmz --list-rich-rules | # firewall-cmd --zone=idmz --list-rich-rules | ||
| - | < | + | < |
| - | rule family=" | + | rule family=" |
| - | rule family=" | + | rule family=" |
| + | rule family=" | ||
| + | </ | ||
| Bei Bedarf machen wir das gleiche nun noch mit der Zone **'' | Bei Bedarf machen wir das gleiche nun noch mit der Zone **'' | ||
| # firewall-cmd --zone=intra --list-rich-rules | # firewall-cmd --zone=intra --list-rich-rules | ||
| - | < | + | < |
| - | rule family=" | + | |
| rule family=" | rule family=" | ||
| - | rule family=" | + | rule family=" |
| + | rule family=" | ||
| + | rule family=" | ||
| ===== Start des Daemon ===== | ===== Start des Daemon ===== | ||
| Zeile 5064: | Zeile 5087: | ||
| udp UNCONN | udp UNCONN | ||
| - | === Checking chrony Sources === | + | ==== Paketfilter - Port Erreichbarkeit ==== |
| + | Bevor wir nun von einem unserer Client-Hosts, | ||
| + | |||
| + | Zunächst installieren wir uns besagtes Programm-Paket, | ||
| + | # pacman -S nmap | ||
| + | |||
| + | Zunächst testen wir ob wir per **'' | ||
| + | # nmap -4 -sU -v -p 123 10.0.0.110 | ||
| + | < | ||
| + | Initiating ARP Ping Scan at 18:33 | ||
| + | Scanning 10.0.0.110 [1 port] | ||
| + | Completed ARP Ping Scan at 18:33, 0.06s elapsed (1 total hosts) | ||
| + | Initiating Parallel DNS resolution of 1 host. at 18:33 | ||
| + | Completed Parallel DNS resolution of 1 host. at 18:33, 0.00s elapsed | ||
| + | Initiating UDP Scan at 18:33 | ||
| + | Scanning 10.0.0.110 [1 port] | ||
| + | Discovered open port 123/udp on 10.0.0.110 | ||
| + | Completed UDP Scan at 18:33, 0.14s elapsed (1 total ports) | ||
| + | Nmap scan report for 10.0.0.110 | ||
| + | Host is up (0.00044s latency). | ||
| + | |||
| + | PORT STATE SERVICE | ||
| + | 123/udp open ntp | ||
| + | MAC Address: 52: | ||
| + | |||
| + | Read data files from: / | ||
| + | Nmap done: 1 IP address (1 host up) scanned in 0.32 seconds | ||
| + | Raw packets sent: 3 (180B) | Rcvd: 2 (104B)</ | ||
| + | |||
| + | Soweit so gut, das hat also schon mal geklappt! | ||
| + | Im nächsten Schritt versuchen wir ob wir Port **'' | ||
| + | # nmap -6 -sU -v -p 123 fd00:: | ||
| + | < | ||
| + | Initiating ND Ping Scan at 18:38 | ||
| + | Scanning fd00:: | ||
| + | Completed ND Ping Scan at 18:38, 0.06s elapsed (1 total hosts) | ||
| + | Initiating Parallel DNS resolution of 1 host. at 18:38 | ||
| + | Completed Parallel DNS resolution of 1 host. at 18:38, 0.00s elapsed | ||
| + | Initiating UDP Scan at 18:38 | ||
| + | Scanning fd00:: | ||
| + | Discovered open port 123/udp on fd00:: | ||
| + | Completed UDP Scan at 18:38, 0.14s elapsed (1 total ports) | ||
| + | Nmap scan report for fd00:: | ||
| + | Host is up (0.00052s latency). | ||
| + | |||
| + | PORT STATE SERVICE | ||
| + | 123/udp open ntp | ||
| + | MAC Address: 52: | ||
| + | |||
| + | Read data files from: / | ||
| + | Nmap done: 1 IP address (1 host up) scanned in 0.32 seconds | ||
| + | Raw packets sent: 3 (264B) | Rcvd: 2 (168B)</ | ||
| + | |||
| + | Auch das wurde entsprechend positiv beschieden **'' | ||
| + | Zum Schluß testen wir dann noch die Variante mit der **IPv6-Unicast-Adresse** **'' | ||
| + | # nmap -6 -sU -v -p 123 2003: | ||
| + | < | ||
| + | Initiating ND Ping Scan at 18:41 | ||
| + | Scanning 2003: | ||
| + | Completed ND Ping Scan at 18:41, 0.06s elapsed (1 total hosts) | ||
| + | Initiating Parallel DNS resolution of 1 host. at 18:41 | ||
| + | Completed Parallel DNS resolution of 1 host. at 18:41, 0.00s elapsed | ||
| + | Initiating UDP Scan at 18:41 | ||
| + | Scanning vml000110.idmz.nausch.org (2003: | ||
| + | Discovered open port 123/udp on 2003: | ||
| + | Completed UDP Scan at 18:41, 0.14s elapsed (1 total ports) | ||
| + | Nmap scan report for vml000110.idmz.nausch.org (2003: | ||
| + | Host is up (0.00053s latency). | ||
| + | |||
| + | PORT STATE SERVICE | ||
| + | 123/udp open ntp | ||
| + | MAC Address: 52: | ||
| + | |||
| + | Read data files from: / | ||
| + | Nmap done: 1 IP address (1 host up) scanned in 0.32 seconds | ||
| + | Raw packets sent: 3 (264B) | Rcvd: 2 (168B)</ | ||
| + | |||
| + | Auch dieser Test war entsprechend erfolgreich! Somit können wir uns nun im Anschluss mit dem Binary **'' | ||
| + | |||
| + | |||
| + | ==== Checking chrony Sources | ||
| Welche Server vom lokalen Daemon benutzt werden kann mit Hilfe des Befehls **'' | Welche Server vom lokalen Daemon benutzt werden kann mit Hilfe des Befehls **'' | ||
| # chronyc sources | # chronyc sources | ||
| Zeile 5070: | Zeile 5173: | ||
| < | < | ||
| =============================================================================== | =============================================================================== | ||
| - | ^* kronos.mailus.de | + | ^* defiant.tlercher.de 2 10 377 91 |
| + | |||
| + | Mit der Option **'' | ||
| + | # chronyc sources -v | ||
| + | < | ||
| + | .-- Source mode ' | ||
| + | / .- Source state ' | ||
| + | | / ' | ||
| + | || .- xxxx [ yyyy ] +/- zzzz | ||
| + | || Reachability register (octal) -. | ||
| + | || Log2(Polling interval) --. | | yyyy = measured offset, | ||
| + | || \ | ||
| + | || | ||
| + | MS Name/IP address | ||
| + | =============================================================================== | ||
| + | ^+ time.cnetm.de | ||
| + | ^- frank.askja.de | ||
| + | ^* ntp1.noris.net | ||
| + | ^+ sv1.ggsrv.de | ||
| + | </ | ||
| 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. | ||
| - | < | + | < |
| + | .-- Source mode ' | ||
| + | / .- Source state ' | ||
| + | | / ' | ||
| + | || .- xxxx [ yyyy ] +/- zzzz | ||
| + | || Reachability register (octal) -. | ||
| + | || Log2(Polling interval) --. | | yyyy = measured offset, | ||
| + | || \ | ||
| + | || | ||
| + | MS Name/IP address | ||
| =============================================================================== | =============================================================================== | ||
| - | ^* vml000110.idmz.nausch.org | + | ^+ fd00:: |
| - | ^+ 10.0.0.110 | + | ^* vml000110.idmz.nausch.org |
| + | ^+ 10.0.0.110 | ||
| Die einzelnen Spalten haben folgende Bedeutung: | Die einzelnen Spalten haben folgende Bedeutung: | ||
| Zeile 5114: | Zeile 5246: | ||
| | | ||
| - | < | + | < |
| + | .-- Source mode ' | ||
| / .- Source state ' | / .- Source state ' | ||
| | / ' | | / ' | ||
| Zeile 5124: | Zeile 5257: | ||
| MS Name/IP address | MS Name/IP address | ||
| =============================================================================== | =============================================================================== | ||
| - | ^* kronos.mailus.de | + | ^+ time.cnetm.de 2 |
| + | ^- frank.askja.de | ||
| + | ^* ntp1.noris.net | ||
| + | ^+ sv1.ggsrv.de | ||
| </ | </ | ||
| - | === Checking chrony Source Statistics === | + | ==== Checking chrony Source Statistics |
| Den Status unserer Zeitserverquellen fragen wir mit dem Befehl **chronyc sourcestats** ab. | Den Status unserer Zeitserverquellen fragen wir mit dem Befehl **chronyc sourcestats** ab. | ||
| # chronyc sourcestats | # chronyc sourcestats | ||
| Zeile 5133: | Zeile 5269: | ||
| < | < | ||
| ============================================================================== | ============================================================================== | ||
| - | kronos.mailus.de 26 | + | time.cnetm.de |
| + | frank.askja.de | ||
| + | ntp1.noris.net | ||
| + | sv1.ggsrv.de | ||
| + | |||
| + | Mit der Option **'' | ||
| + | # chronyc sourcestats -v | ||
| + | < | ||
| + | / .- Number of residual runs with same sign. | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | Name/IP Address | ||
| + | ============================================================================== | ||
| + | time.cnetm.de | ||
| + | frank.askja.de | ||
| + | ntp1.noris.net | ||
| + | sv1.ggsrv.de | ||
| + | </ | ||
| Die einzelnen Spalten haben folgende Bedeutung: | Die einzelnen Spalten haben folgende Bedeutung: | ||
| Zeile 5169: | Zeile 5327: | ||
| Name/IP Address | Name/IP Address | ||
| ============================================================================== | ============================================================================== | ||
| - | kronos.mailus.de | + | fd00:: |
| + | vml000110.idmz.nausch.org | ||
| + | 10.0.0.110 6 | ||
| </ | </ | ||
| - | === Checking chrony Tracking === | + | ==== Checking chrony Tracking |
| Die Anzeige der System Zeit Informationen fragen wir mit dem Befehl **chronyc tracking** ab. | Die Anzeige der System Zeit Informationen fragen wir mit dem Befehl **chronyc tracking** ab. | ||
| # chronyc tracking | # chronyc tracking | ||
| - | < | + | < |
| - | Stratum | + | Stratum |
| - | Ref time (UTC) : Sun Feb 18 18:06:16 2024 | + | Ref time (UTC) : Thu Feb 22 12:24:14 2024 |
| - | System time : 0.000038475 | + | System time : 0.000030264 |
| - | Last offset | + | Last offset |
| - | RMS offset | + | RMS offset |
| - | Frequency | + | Frequency |
| - | Residual freq : +0.003 ppm | + | Residual freq : +0.017 ppm |
| - | Skew : 0.136 ppm | + | Skew : 0.322 ppm |
| - | Root delay : 0.029358303 | + | Root delay : 0.016084936 |
| - | Root dispersion : 0.018334404 | + | Root dispersion : 0.002525240 |
| - | Update interval : 257.0 seconds | + | Update interval : 64.5 seconds |
| Leap status | Leap status | ||
| Zeile 5212: | Zeile 5372: | ||
| * **Not synchronized** Zeit konnte noch nicht synchronisiert werden. | * **Not synchronized** Zeit konnte noch nicht synchronisiert werden. | ||
| - | === Checking chrony Clients === | + | ==== Checking chrony Clients |
| Betreiben wir unseren chrony-Daemon im Server-Mode, | Betreiben wir unseren chrony-Daemon im Server-Mode, | ||
| # chronyc -a | # chronyc -a | ||
| Zeile 5230: | Zeile 5390: | ||
| < | < | ||
| =============================================================================== | =============================================================================== | ||
| - | 2003:a:e0d:7603: | + | fd00::3:10:0:0:210 |
| - | _gateway | + | _gateway |
| + | 2003: | ||
| </ | </ | ||
| Zeile 5245: | 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: | + | 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: |
| 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, | + | Setzen wir einen neue virtuellen Host unter Arch Linux neu auf, oder wollen wir bei einem bestehenden Host die Konfiguration aktualisieren, |
| + | === Rolle === | ||
| Für die Konfiguration unserer Hosts verwenden wir eine eigene Rolle **'' | Für die Konfiguration unserer Hosts verwenden wir eine eigene Rolle **'' | ||
| $ tree roles/ | $ tree roles/ | ||
| Zeile 5267: | Zeile 5429: | ||
| ├── templates | ├── templates | ||
| └── vars</ | └── vars</ | ||
| + | |||
| + | Wie wir sehen ist die Rolle durchaus überschaubar, | ||
| + | $ vim ~/ | ||
| + | <file yaml roles/ | ||
| + | - include_tasks: | ||
| + | tags: chrony | ||
| + | ... # YML Ende</ | ||
| + | |||
| + | Die eigentliche Installation und Konfiguration erfolgt dann im Task **'' | ||
| + | $ vim ~/ | ||
| + | <file yaml roles/ | ||
| + | # Chrony Daemon installieren und als Client konfigurieren. | ||
| + | |||
| + | - name: " | ||
| + | community.general.pacman: | ||
| + | name: chrony | ||
| + | state: present | ||
| + | |||
| + | - name: " | ||
| + | ansible.builtin.stat: | ||
| + | path: / | ||
| + | register: check_chrony_config | ||
| + | |||
| + | - name: " | ||
| + | ansible.builtin.copy: | ||
| + | remote_src: true | ||
| + | src: / | ||
| + | dest: / | ||
| + | owner: root | ||
| + | group: root | ||
| + | mode: ' | ||
| + | when: check_chrony_config.stat.exists | ||
| + | |||
| + | - name: " | ||
| + | ansible.builtin.copy: | ||
| + | remote_src: true | ||
| + | src: / | ||
| + | dest: / | ||
| + | owner: root | ||
| + | group: root | ||
| + | mode: ' | ||
| + | when: not check_chrony_config.stat.exists | ||
| + | |||
| + | - name: " | ||
| + | ansible.builtin.blockinfile: | ||
| + | path: / | ||
| + | marker: '# {mark} ANSIBLE MANAGED - DO NOT EDIT BLOCK' | ||
| + | insertbefore: | ||
| + | block: | | ||
| + | # Ansible managed configuration file, do not modify manually! | ||
| + | |||
| + | - name: " | ||
| + | ansible.builtin.lineinfile: | ||
| + | dest: / | ||
| + | regexp: '{{ item.from }}' | ||
| + | line: '{{ item.to }}' | ||
| + | state: present | ||
| + | backrefs: false | ||
| + | with_items: '{{ chrony_config }}' | ||
| + | |||
| + | - name: " | ||
| + | ansible.builtin.systemd: | ||
| + | name: chronyd | ||
| + | # state: reloaded | ||
| + | enabled: true | ||
| + | |||
| + | ... # YML Ende</ | ||
| + | |||
| + | === Inventory -Variablendefinition === | ||
| + | Über die Variable **'' | ||
| + | |||
| + | $ vim inventories/ | ||
| + | <file yaml inventories/ | ||
| + | - from: 'pool 2.arch.pool.ntp.org iburst' | ||
| + | to : | | ||
| + | | ||
| + | | ||
| + | | ||
| + | - from: '! mailonchange wibble@example.net 0.5' | ||
| + | to : mailonchange django@nausch.org 0.5 | ||
| + | </ | ||
| + | |||
| + | === Playbook === | ||
| + | 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. | ||
| + | # vim playbooks/ | ||
| + | <file yaml playbooks/ | ||
| + | # Ansible Playbook zum Konfigurieren des Chrony-Daemon im Client-Modus unter Arch-Linux. | ||
| + | # Aufruf via $ ansible-playbook playbooks/ | ||
| + | # $ ansible-playbook playbooks/ | ||
| + | # für einen Host aus der Hostgruppe DMZ. | ||
| + | |||
| + | - name: arch_chrony_client.yml | ||
| + | hosts: idmz: | ||
| + | |||
| + | roles: | ||
| + | - role: chrony_client | ||
| + | tags: chrony_client | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | === 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/ | ||
| + | |||
| + | < | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== 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:// | ||
| + | |||
| + | === Rollen === | ||
| + | == Chrony == | ||
| + | Da sich die Installation und Konfiguration unseres **chrony** im Daemon-Modus lediglich bei den Konfigurationsparametern unterscheidet, | ||
| + | $ tree roles/ | ||
| + | ++++ roles/ | ||
| + | < | ||
| + | ├── defaults | ||
| + | ├── files | ||
| + | ├── handlers | ||
| + | ├── library | ||
| + | ├── lookup_plugins | ||
| + | ├── meta | ||
| + | ├── module_utils | ||
| + | ├── tasks | ||
| + | │ ├── chrony.yml | ||
| + | │ └── main.yml | ||
| + | ├── templates | ||
| + | └── vars</ | ||
| + | ++++ | ||
| Wie wir sehen ist die Rolle durchaus überschaubar, | Wie wir sehen ist die Rolle durchaus überschaubar, | ||
| $ vim ~/ | $ vim ~/ | ||
| + | ++++ roles/ | ||
| <file yaml roles/ | <file yaml roles/ | ||
| - include_tasks: | - include_tasks: | ||
| tags: chrony | tags: chrony | ||
| ... # YML Ende</ | ... # YML Ende</ | ||
| + | ++++ | ||
| Die eigentliche Installation und Konfiguration erfolgt dann im Task **'' | Die eigentliche Installation und Konfiguration erfolgt dann im Task **'' | ||
| $ vim ~/ | $ vim ~/ | ||
| + | ++++ roles/ | ||
| <file yaml roles/ | <file yaml roles/ | ||
| - | # SSH Server Configdatei erzeugen | + | # Chrony Daemon installieren |
| - name: " | - name: " | ||
| Zeile 5289: | Zeile 5605: | ||
| path: / | path: / | ||
| register: check_chrony_config | register: check_chrony_config | ||
| + | |||
| + | - name: " | ||
| + | ansible.builtin.copy: | ||
| + | remote_src: true | ||
| + | src: / | ||
| + | dest: / | ||
| + | owner: root | ||
| + | group: root | ||
| + | mode: ' | ||
| + | when: check_chrony_config.stat.exists | ||
| - name: " | - name: " | ||
| Zeile 5324: | Zeile 5650: | ||
| ... # YML Ende</ | ... # YML Ende</ | ||
| + | ++++ | ||
| + | |||
| + | == Firewalld - Paketfilter == | ||
| + | Der eigentliche " | ||
| + | |||
| + | 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, | ||
| + | |||
| + | Für die Konfiguration der Paketfilterregeln unseres NTP-Serversverwenden wir eine eigene Rolle **chrony_firewalld**, | ||
| + | |||
| + | $ tree roles/ | ||
| + | |||
| + | < | ||
| + | ├── defaults | ||
| + | ├── files | ||
| + | ├── handlers | ||
| + | ├── library | ||
| + | ├── lookup_plugins | ||
| + | ├── meta | ||
| + | ├── module_utils | ||
| + | ├── tasks | ||
| + | │ ├── config.yml | ||
| + | │ └── main.yml | ||
| + | ├── templates | ||
| + | └── vars</ | ||
| + | |||
| + | Wie wir sehen ist die Rolle durchaus überschaubar, | ||
| + | $ vim ~/ | ||
| + | |||
| + | <file yaml roles/ | ||
| + | - include_tasks: | ||
| + | tags: config | ||
| + | ... # YML Ende | ||
| + | </ | ||
| + | |||
| + | Die eigentliche Konfiguration unserer notwendigen Firewall-Regeln erfolgt dann im Task **'' | ||
| + | $ vim ~/ | ||
| + | |||
| + | <file yaml roles/ | ||
| + | # 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=" | ||
| + | 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::/ | ||
| + | port protocol=" | ||
| + | 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=" | ||
| + | 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=" | ||
| + | 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::/ | ||
| + | port protocol=" | ||
| + | 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=" | ||
| + | destination address={{ guest_ip6_gs_2 }}{{ guest_mask6_2 }} | ||
| + | accept | ||
| + | zone: '{{ guest_zone_2 }}' | ||
| + | immediate: true | ||
| + | permanent: true | ||
| + | state: enabled | ||
| + | |||
| + | - name: " | ||
| + | ansible.builtin.service: | ||
| + | name: firewalld | ||
| + | state: reloaded | ||
| + | |||
| + | ... # YML Ende</ | ||
| + | |||
| + | === Inventory -Variablendefinition === | ||
| + | == chronyd== | ||
| + | Über die Variable **'' | ||
| + | |||
| + | $ vim inventories/ | ||
| + | <file yaml inventories/ | ||
| + | - from: 'pool 2.arch.pool.ntp.org iburst' | ||
| + | to : pool pool.ntp.org | ||
| + | - from: '! dumpdir / | ||
| + | to : dumpdir / | ||
| + | - from: '# is unimportant.' | ||
| + | to : | | ||
| + | # is unimportant. | ||
| + | # | ||
| + | # nausch.org : | ||
| + | allow fd00::/10 | ||
| + | allow 10.0.0.0/24 | ||
| + | allow 2003: | ||
| + | allow 192.168.0.0/ | ||
| + | allow 2003: | ||
| + | - 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 | ||
| + | </ | ||
| + | |||
| + | == firewalld== | ||
| + | Die Netzwerkspezifischen Definitionen für den Paketfilter holen wir uns aus den Netzwerk-Variablen unseres Hosts selbst. | ||
| + | |||
| + | $ vim inventories/ | ||
| + | <file yaml inventories/ | ||
| + | host_dev: | ||
| + | host_ip: | ||
| + | guest_name: | ||
| + | guest_zone: | ||
| + | guest_domain: | ||
| + | guest_desc: | ||
| + | guest_mate: | ||
| + | guest_ram: | ||
| + | guest_cpu: | ||
| + | guest_imagesize: | ||
| + | guest_imagetype: | ||
| + | guest_imagemode: | ||
| + | guest_source: | ||
| + | guest_zone_1: | ||
| + | guest_bridge_1: | ||
| + | guest_nic_1: | ||
| + | guest_direction_1: | ||
| + | guest_mac_1: | ||
| + | guest_ip4_net_1: | ||
| + | guest_ip4_1: | ||
| + | guest_mask4_1: | ||
| + | guest_gw4_1: | ||
| + | guest_dns4_1: | ||
| + | guest_ip6_ll_1: | ||
| + | guest_ip6_ls_1: | ||
| + | guest_ip6_gs_1: | ||
| + | guest_ip6_net_1: | ||
| + | guest_mask6_1: | ||
| + | guest_gw6_1: | ||
| + | guest_dns6_1: | ||
| + | guest_zone_2: | ||
| + | guest_bridge_2: | ||
| + | guest_nic_2: | ||
| + | guest_direction_2: | ||
| + | guest_mac_2: | ||
| + | guest_ip4_net_2: | ||
| + | guest_ip4_2: | ||
| + | guest_mask4_2: | ||
| + | guest_gw4_2: | ||
| + | guest_dns4_2: | ||
| + | guest_ip6_ll_2: | ||
| + | guest_ip6_ls_2: | ||
| + | guest_ip6_gs_2: | ||
| + | guest_ip6_net_2: | ||
| + | guest_mask6_2: | ||
| + | guest_gw6_2: | ||
| + | guest_dns6_2: | ||
| + | </ | ||
| + | |||
| + | === 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/ | ||
| + | <file yaml playbooks/ | ||
| + | # Ansible Playbook zum Konfigurieren des Chrony-Daemon im Server-Modus unter Arch-Linux. | ||
| + | # Aufruf via $ ansible-playbook playbooks/ | ||
| + | # $ ansible-playbook playbooks/ | ||
| + | # für einen Host aus der Hostgruppe DMZ. | ||
| + | |||
| + | - name: arch_chrony_server.yml | ||
| + | hosts: vml010110 | ||
| + | |||
| + | roles: | ||
| + | - role: chrony_client | ||
| + | tags: chrony_client | ||
| + | - role: chrony_firewalld | ||
| + | tags: chrony_firewalld | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | === 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/ | ||
| + | |||
| + | < | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | <font style=" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ====== Links ====== | ||
| + | * Zurück zu **[[wiki: | ||
| + | * Zurück zu **[[centos: | ||
| + | * Zurück zu **[[linux: | ||
| + | * Zurück zur **[[http:// | ||
| + | |||