Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
linux:ntp [18.02.2024 20:17. ] – [Paketinhalt] 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 ===== | ||
Was uns das Paket **chrony** alles in das System unseres Arch Linux Hosts gebracht hat, können wir wie folgt abfragen: | Was uns das Paket **chrony** alles in das System unseres Arch Linux Hosts gebracht hat, können wir wie folgt abfragen: | ||
# pacman -Qil chrony | # pacman -Qil chrony | ||
+ | |||
+ | ++++ Paketinhalte | | ||
< | < | ||
Version | Version | ||
Zeile 104: | Zeile 110: | ||
chrony / | chrony / | ||
+ | ++++ | ||
===== chronyc und chronyd ===== | ===== chronyc und chronyd ===== | ||
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 127: | 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 1535: | Zeile 1546: | ||
chrony 4.5 2023-12-05 | chrony 4.5 2023-12-05 | ||
</ | </ | ||
- | </ | + | ++++ |
- | </ | + | |
==== Binary chronyd ==== | ==== Binary chronyd ==== | ||
Zeile 1571: | 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. |
- | < | + | |
- | <panel title=" | + | $ man chronyd |
+ | ++++ chronyd manpage | | ||
< | < | ||
Zeile 1766: | Zeile 1776: | ||
chrony 4.5 2023-12-05 | chrony 4.5 2023-12-05 | ||
</ | </ | ||
- | </ | + | ++++ |
- | </ | + | |
===== 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 4580: | Zeile 4588: | ||
# Django : 2024-02-18 | # Django : 2024-02-18 | ||
- | server | + | pool pool.ntp.org iburst |
####################################################################### | ####################################################################### | ||
Zeile 4735: | 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 4902: | 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 4908: | 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 4935: | 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 4948: | 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 4955: | 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 5062: | 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 5068: | 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 5112: | Zeile 5246: | ||
| | ||
- | < | + | < |
+ | .-- Source mode ' | ||
/ .- Source state ' | / .- Source state ' | ||
| / ' | | / ' | ||
Zeile 5122: | 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 5131: | 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 5167: | 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 5210: | 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 5228: | Zeile 5390: | ||
< | < | ||
=============================================================================== | =============================================================================== | ||
- | 2003:a:e0d:7603: | + | fd00::3:10:0:0:210 |
- | _gateway | + | _gateway |
+ | 2003: | ||
</ | </ | ||
Zeile 5243: | 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 5265: | 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 5287: | 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 5322: | 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:// | ||
+ |