From 727e5f5fe02b2f1967ef949b14bca3f8e753f6a6 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:30:46 -0500 Subject: [PATCH 01/22] New translations 04-advanced-commands.md (French) --- .../books/admin_guide/04-advanced-commands.fr.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/books/admin_guide/04-advanced-commands.fr.md b/docs/books/admin_guide/04-advanced-commands.fr.md index c67782a227..cbfd188b4f 100644 --- a/docs/books/admin_guide/04-advanced-commands.fr.md +++ b/docs/books/admin_guide/04-advanced-commands.fr.md @@ -1,5 +1,5 @@ --- -title: Commandes avancées Linux +title: Commandes Avancées Linux --- # Commandes avancées pour utilisateurs Linux @@ -38,7 +38,7 @@ antoine steven ``` -!!! Note +!!! note "Note" `uniq` nécessite que le fichier d'entrée soit trié car il ne compare que des lignes consécutives. @@ -215,11 +215,11 @@ L’option `-I` permet de spécifier un caractère (dans notre exemple le caract Le paquet `yum-utils` est une collection d’utilitaires de différents auteurs pour `yum`, qui le rendent plus simple et plus puissant à utiliser. -!!! Note +!!! note "Note" Bien que `yum` ait été remplacé par `dnf` dans Rocky Linux 8, le nom du paquet est resté `yum-utils` mais il peut tout aussi bien être installé avec le paquet `dnf-utils`. Ce sont des utilitaires YUM classiques implémentés comme des CLI au-dessus de DNF pour maintenir une compatibilité ascendante avec `yum-3`. -Voici quelques exemples parmi ces utilitaires . +Voici quelques exemples parmi ces utilitaires. ### la commande `repoquery` @@ -332,7 +332,7 @@ L’option `-n` permet de spécifier le nombre de secondes entre chaque exécuti !!! Note - Pour quitter la commande `watch`, vous devez taper les clés : CTRL+C pour tuer le processus. + To exit the `watch` command, you must type the keys: CTRL+C to kill the process. Exemples : @@ -386,9 +386,9 @@ Options : | `-g` et `-o`     | appartenance.               | | `-m`     | permissions.               | | `-p`     | préserve la date et l'heure des fichiers sources.               | -| `-t` | copie tous les arguments sources dans le dossier. | +| `-t` | copie tous les arguments sources vers le dossier. | -Cannot be displayed note "Remarque" +!!! note "Remarque" Il existe aussi des options pour gérer le contexte de SELinux (cf. man install). @@ -420,7 +420,7 @@ Cette commande permet déjà de gagner du temps, maintenant ajoutons l'appartena sudo install -v -o rocky -g users -m 644 -D -t ~/samples/ src/sample.txt ``` - Cannot be displayed!!! note "Remarque" + !!! note "Remarque" Dans ce cas `sudo` est nécessaire pour modifier les propriétés. From 322ae6fea2ac82518e6315055be231c027640a08 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:30:47 -0500 Subject: [PATCH 02/22] New translations 04-advanced-commands.md (German) --- docs/books/admin_guide/04-advanced-commands.de.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/books/admin_guide/04-advanced-commands.de.md b/docs/books/admin_guide/04-advanced-commands.de.md index 64fc607bd8..724846d317 100644 --- a/docs/books/admin_guide/04-advanced-commands.de.md +++ b/docs/books/admin_guide/04-advanced-commands.de.md @@ -215,13 +215,13 @@ Mit der Option `-I` können Sie ein Zeichen (in unserem Beispiel das `%` Zeichen Das `yum-utils` Paket ist eine Sammlung von Werkzeugen verschiedener Autoren für `yum`, die es einfacher und leistungsfähiger machen. -!!! note "Hinweis" +!!! note "Anmerkung" Während `yum` in Rocky Linux 8 durch `dnf` ersetzt wurde der Paketname bleibt `yum-utils`, obwohl er auch als `dnf-utils` installiert werden kann. Dies sind klassische YUM Werkzeuge, die als CLI Shims auf DNF implementiert werden, um die Rückwärtskompatibilität mit `yum-3` zu gewährleisten. -Hier sind einige Beispiele: +Nachfolgend finden Sie einige Beispiele für diese Dienstprogramme. -### `repoquery` Befehl +### Das Kommando `repoquery` Der Befehl `repoquery` wird verwendet, um die Pakete im Repository abzufragen. @@ -267,7 +267,7 @@ $ repoquery -l yum-utils Der `yumdownloader` Befehl lädt RPM-Pakete aus den Repositories herunter. Äquivalent zu `dnf download --downloadonly --downloaddir ./ package-name` -!!! CANNOT BE TRANSLATED!!! note "Hinweis" +!!! note "Anmerkung" Dieser Befehl ist sehr nützlich, um schnell ein lokales Repository für einige rpms zu erstellen! @@ -332,7 +332,7 @@ Mit der Option `-n` können Sie die Anzahl der Sekunden zwischen jeder Ausführu !!! note "Anmerkung" - To exit the `watch` command, you must type the keys: CTRL+C to kill the process. + . Beispiele: From a7682ae296dee2dddc480c196dfe0d41d5f5495f Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:30:50 -0500 Subject: [PATCH 03/22] New translations 05-vi.md (French) --- docs/books/admin_guide/05-vi.fr.md | 40 +++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/books/admin_guide/05-vi.fr.md b/docs/books/admin_guide/05-vi.fr.md index a1e92b8d7d..3f2d958420 100644 --- a/docs/books/admin_guide/05-vi.fr.md +++ b/docs/books/admin_guide/05-vi.fr.md @@ -10,12 +10,12 @@ Dans ce chapitre, vous allez apprendre à travailler avec l'éditeur VIsual. **Objectifs** : Dans ce chapitre, les futurs administrateurs Linux vont apprendre comment : -:heavy_check_mark: Utiliser les principales commandes de l’éditeur VI ; +:heavy_check_mark: Utiliser les principales commandes de l’éditeur VI ; :heavy_check_mark: Modifier un texte grâce à l’éditeur VI. :checkered_flag: **commandes utilisateurs**, **linux** -**Connaissances : ** :star: +**Connaissances : ** :star: **Complexité : ** :star: :star: **Temps de lecture : **20 minutes @@ -36,14 +36,14 @@ Ses fonctionnalités sont : La commande `vi` ouvre l’éditeur de texte *VI*. -``` +```bash vi [-c commande] [fichier] ``` Exemple : -``` -$ vi /home/rockstar/fichier +```bash +vi /home/rockstar/file ``` | Option | Information | @@ -58,7 +58,7 @@ Si la commande `vi` est exécutée sans préciser de nom de fichier, VI ouvre un L’éditeur `vim` reprend l’interface et les fonctions de VI avec de nombreuses améliorations. -``` +```bash vim [-c commande] [fichier] ``` @@ -66,7 +66,7 @@ Parmi ces améliorations, l’utilisateur dispose de la coloration syntaxique, t Pendant une session, VI utilise un fichier tampon dans lequel il inscrit toutes les modifications effectuées par l’utilisateur. -!!! Note +!!! note "Note" Tant que l’utilisateur n’a pas enregistré son travail, le fichier d’origine n’est pas modifié. @@ -78,9 +78,9 @@ Au démarrage, VI est en mode *commandes*. Pour sortir de VI, il faut, depuis le mode Commandes, taper sur : puis saisir : -* `q` pour sortir sans sauvegarder (_quit_) ; -* `w` pour enregistrer son travail (_write_) ; -* `wq` (_write quit_) ou `x` (_eXit_) pour sortir et sauvegarder. +* `q` pour sortir sans sauvegarder (*quit*) ; +* `w` pour enregistrer son travail (*write*) ; +* `wq` (*write quit*) ou `x` (*eXit*) pour sortir et sauvegarder. En mode command, cliquer sur la touche Z (en majuscule) deux fois de suite pour sauvegarder et sortir. @@ -210,11 +210,11 @@ VI bascule en mode *insertion* après la saisie d’une de ces touches. * Insertion de texte avant un caractère : -i (_insert_) +i (*insert*) * Insertion de texte après un caractère : -a (_append_) +a (*append*) ### Par rapport à une ligne @@ -292,7 +292,7 @@ Ces opérations se font en mode *commandes*. * Remplacer un mot : -cw_word_ESC +cw*word*ESC !!! tip "Astuce" @@ -395,9 +395,9 @@ Il existe des caractères jokers permettant de faciliter la recherche sous VI. Exemple : -`/[Mm]ot` : recherche _mot_ et _Mot_ +`/[Ww]ord` : search *word* or *Word* -`/[1-9]mot` : recherche_1mot_, _2mot_ … _`x`mot_ où `x` est un nombre +`/[1-9]word` : search *1word*, *2word* … *`x`word* where `x` is a number * `^` : Recherche d’une chaîne débutant la ligne. @@ -415,7 +415,7 @@ Exemple : Exemple : -`/M.t` : recherche _Mot_, _Mat_ … +`/W.rd` : search *Word*, *Ward* … * `*` : Le nombre de fois que le caractère précédent correspond, 0 fois, ou un nombre quelconque de fois. @@ -507,8 +507,8 @@ Le **g** signifie ici **global**. Il est possible d’exécuter VI en précisant les options à charger pour la session. Pour cela, il faut utiliser l’option `-c` : -``` -$ vi -c "set nu" /home/rockstar/fichier +```bash +vi -c "set nu" /home/rockstar/file ``` Il est aussi possible de saisir les commandes *Ex* dans un fichier nommé `.exrc` mis dans le répertoire de connexion de l’utilisateur. À chaque démarrage de VI ou de VIM, les commandes seront lues et appliquées. @@ -517,6 +517,6 @@ Il est aussi possible de saisir les commandes *Ex* dans un fichier nommé `.exrc Il existe un tutoriel pour apprendre à utiliser VI. Il est accessible avec la commande `vimtutor`. -``` -$ vimtutor +```bash +vimtutor ``` From 0f35575451dbacb4a01516ade7bbe62fced8c7ca Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:30:51 -0500 Subject: [PATCH 04/22] New translations 05-vi.md (German) --- docs/books/admin_guide/05-vi.de.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/books/admin_guide/05-vi.de.md b/docs/books/admin_guide/05-vi.de.md index f99750edd6..f80e6b0aa7 100644 --- a/docs/books/admin_guide/05-vi.de.md +++ b/docs/books/admin_guide/05-vi.de.md @@ -36,14 +36,14 @@ Seine Funktionen sind: Der `vi` Befehl öffnet den *VI* Texteditor. -``` +```bash vi [-c command] [file] ``` Beispiel: -``` -$ vi /home/rockstar/file +```bash +vi /home/rockstar/file ``` | Option | Informationen | @@ -58,7 +58,7 @@ Wenn der Befehl `vi` ohne Angabe eines Dateinamens ausgeführt wird, öffnet VI Der `vim` Editor übernimmt die Benutzeroberfläche und die Funktionen von VI, die mit vielen Verbesserungen ergänzt werden. -``` +```bash vim [-c command] [file] ``` @@ -292,7 +292,7 @@ Diese Operationen werden im *Befehl*-Modus durchgeführt. * Ein Wort ersetzen: -cw_word_ESC +cw*word*ESC !!! tip "Hinweis" @@ -507,8 +507,8 @@ Das **g** steht hier für **global**. Es ist möglich, VI auszuführen, wobei die Optionen angegeben werden, die für die Sitzung geladen werden sollen. Um dies zu tun, müssen Sie die `-c` Option verwenden: -``` -$ vi -c "set nu" /home/rockstar/file +```bash +vi -c "set nu" /home/rockstar/file ``` Es ist auch möglich, die *Ex*-Befehle in einer Datei mit dem Namen `.exrc` in das Login-Verzeichnis des Benutzers zu speichern. Bei jedem VI- oder VIM-Start werden die Befehle gelesen und angewendet. @@ -517,6 +517,6 @@ Es ist auch möglich, die *Ex*-Befehle in einer Datei mit dem Namen `.exrc` in d Es gibt ein Tutorial zum Lernen wie man VI benutzt. Es ist mit dem Befehl `vimtutor` zugänglich. -``` +```bash $ vimtutor ``` From c500850cec24fd1af484f4dedd0bd02cf344b7a3 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:31:14 -0500 Subject: [PATCH 05/22] New translations 12-network.md (French) --- docs/books/admin_guide/12-network.fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/books/admin_guide/12-network.fr.md b/docs/books/admin_guide/12-network.fr.md index 1b69899a0f..97f76736f6 100644 --- a/docs/books/admin_guide/12-network.fr.md +++ b/docs/books/admin_guide/12-network.fr.md @@ -646,7 +646,7 @@ tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2161/sshd Une mauvaise configuration peut faire que plusieurs interfaces utilisent la même adresse IP. Cela peut se produire lorsqu'un réseau a plusieurs serveurs DHCP ou quand la même adresse IP est assignée manuellement plusieurs fois. -Lorsque le réseau ne fonctionne pas, et quand un conflit d'adresse IP peut en être la cause, il est possible d'utiliser le logiciel `arp-scan` (nécessite EPEL) : +Lorsque le réseau ne fonctionne pas correctement et que la cause pourrait être un conflit d'adresse IP, vous pouvez utiliser le logiciel `arp-scan` (nécessite le dépôt d'EPEL) : ``` $ dnf install arp-scan From 7201061a9083b14a5dd74018558dc1f49664678f Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:31:15 -0500 Subject: [PATCH 06/22] New translations 12-network.md (German) --- docs/books/admin_guide/12-network.de.md | 746 ++++++++++++++++++++++++ 1 file changed, 746 insertions(+) create mode 100644 docs/books/admin_guide/12-network.de.md diff --git a/docs/books/admin_guide/12-network.de.md b/docs/books/admin_guide/12-network.de.md new file mode 100644 index 0000000000..8aae49e11b --- /dev/null +++ b/docs/books/admin_guide/12-network.de.md @@ -0,0 +1,746 @@ +--- +title: Netzwerk Implementierung +--- + +# Implementierung des Netzwerks + +In diesem Kapitel erfahren Sie, wie Sie mit dem Netzwerk arbeiten und das Netzwerk verwalten. + +**** + +**Ziele**: In diesem Kapitel lernen Sie Folgendes: + +:heavy_check_mark: eine Workstation konfigurieren, um DHCP zu benutzen; +:heavy_check_mark: eine Workstation so konfigurieren, dass sie eine statische Konfiguration verwendet; +:heavy_check_mark: eine Workstation konfigurieren, um ein Gateway zu benutzen; +:heavy_check_mark: eine Workstation, um einen DNS-Server zu benutzen; +:heavy_check_mark: beim Netzwerk einer Workstation, Probleme lösen. + +:checkered_flag: **Netzwerk**, **Linux**, **IP** + +**Wissen** : :star: :star: +**Komplexität** : :star: :star: + +**Lesezeit**: 31 Minuten + +**** + +## Allgemeines + +Um dieses Kapitel zu veranschaulichen, verwenden wir die folgende Architektur. + +![Unsere Netzwerkarchitektur](images/network-001.png) + +Dabei werden wir Folgendes berücksichtigen: + +* Integration in ein LAN (lokales Netzwerk); +* die Konfiguration eines Gateways, um einen entfernten Server zu erreichen; +* die Konfiguration eines DNS-Servers und die Implementierung der Namensauflösung. + +Die minimalen Parameter, die für die Maschine definiert werden müssen, sind folgende: + +* der Name der Maschine; +* die IP-Adresse; +* die Subnetzmaske. + +Beispiel: + +* `pc-rocky`; +* `192.168.1.10`; +* `255.255.255.0`. + +Die Notation namens CIDR ist immer häufiger: 192.168.1.10/24 + +IP-Adressen werden für das korrekte Routen von Nachrichten (Pakete) verwendet. Sie sind in zwei Teile aufgeteilt: + +* der feste Teil, der das Netzwerk identifiziert; +* die Kennung des Hosts im Netzwerk. + +Die Subnetz-Maske ist ein Satz von **4 Bytes** um folgende Adressen zu isolieren: + +* die Netzwerkadresse (**NetID** oder **SubnetID**) durch eine bitweise logische UND-Verknüpfung zwischen der IP-Adresse und der Maske; +* die Host-Adresse (**HostID**) durch eine bitweise logische UND-Verknüpfung zwischen der IP-Adresse und das Komplement der Maske. + +Es gibt auch spezifische Adressen innerhalb eines Netzwerks, die identifiziert werden müssen. Die erste Adresse eines Bereichs und der letzteren haben eine bestimmte Rolle: + +* Die erste Adresse eines Bereichs ist die **Netzwerkadresse**. Sie dient zur Identifizierung von Netzwerken und zur Weiterleitung von Informationen von einem Netzwerk zu einem anderen. + +* Die letzte Adresse eines Bereichs ist die **Broadcast-Adresse**. Sie wird zur Übertragung von Informationen auf alle Maschinen im Netzwerk verwendet. + +### MAC-Adresse / IP-Adresse + +Eine **MAC-Adresse** ist ein physikalischer Identifikator, der bei der Herstellung auf das Gerät geschrieben wurde. Dies wird manchmal als Hardware-Adresse bezeichnet. Es besteht aus 6 Bytes, die oft in hexadezimaler Form angegeben werden (z.B. 5E:FF:56:A2:AF:15). Genauer: 3 Bytes des Herstellers und 3 Bytes als Seriennummer. + +!!! warning "Warnhinweis" + + Diese letzte Behauptung verliert heutzutage bei Virtualisierung etwas an Bedeutung. Es gibt auch noch Softwarelösungen zum Ändern der MAC-Adresse. + +Eine Internet-Protokoll (**IP**) Adresse ist eine Identifikationsnummer, die dauerhaft oder vorübergehend jedem Gerät zugewiesen ist, das über das Internet-Protokoll an ein Computernetzwerk angeschlossen ist. Ein Teil definiert die Netzwerkadresse (NetID oder SubnetID), der andere Teil definiert die Adresse des Hosts im Netzwerk (HostID). Die relative Größe jedes Teils variiert je nach Netz (Sub-)Maske. + +Eine IPv4-Adresse definiert eine Adresse auf 4 Bytes. Die Anzahl der verfügbaren Adressen, die nahe an der Sättigung angekommen war, erforderte die Schaffung eines neuen Standards. IPv6 wurde auf 16 Bytes definiert. + +IPv6 wird oft durch 8 Gruppen von 2 Bytes durch einen Doppelpunkt getrennt repräsentiert. Unbedeutende Nullen können weggelassen werden, eine oder mehrere Gruppen von 4 aufeinanderfolgenden Nullen können durch zwei aufeinander folgende Doppelpunkte ersetzt werden. + +Subnetzmasken haben von 0 bis 128 Bit. (zum Beispiel 21ac:0000:0000:0611:21e0:00ba:321b:54da/64 oder 21ac::611:21e0:ba:321b:54da/64) + +In einer Webadresse oder URL (Uniform Resource Locator), eine IPv4-Adresse kann von einem Doppelpunkt und einer Port-Adresse gefolgt werden (welche die Anwendung angibt, an die die Daten geschickt werden). Um Verwirrung in einer URL zu vermeiden, wird die IPv6-Adresse auch in eckigen Klammern [ ], Doppelpunkt, Port-Adresse geschrieben. + +IP- und MAC-Adressen müssen im Netzwerk eindeutig sein! + +### DNS-Domäne + +Client-Maschinen können Teil einer DNS (**Domain Name System**, z.B. `mydomain.lan`) Domain sein. + +Der voll qualifizierte Maschinenname (**FQDN**) wird `pc-rocky.mydomain.lan`. + +Ein Satz von Computern kann in eine logische Namensauflösung gruppiert werden, die als DNS-Domain bezeichnet wird. Eine DNS-Domäne ist natürlich nicht auf ein einziges physikalisches Netzwerk beschränkt. + +Damit ein Computer Teil einer DNS-Domain sein kann, muss er ein DNS-Suffix bekommen (hier `mydomain.lan`) sowie Server, die er abfragen kann. + +### Erinnerung an das OSI-Modell + +!!! note "Eselsbrücke" + + Um sich an die Reihenfolge der Schichten des OSI-Modells zu erinnern, erinnere dich an den folgenden Satz: __Please Do Not Touch Steven's Pet Alligator__ + +| Layer | Protokolle | +| ---------------- | ------------------------------------------ | +| 7 - Anwendung | POP, IMAP, SMTP, SSH, SNMP, HTTP, FTP, ... | +| 6 - Präsentation | ASCII, MIME, ... | +| 5 - Session | TLS, SSL, NetBIOS, ... | +| 4 - Transport | TLS, SSL, TCP, UDP, ... | +| 3 - Netzwerk | IPv4, IPv6, ARP, ... | +| 2 - Datenlink | Ethernet, WiFi, Token Ring, ... | +| 1 - Physikalisch | Kabel, Glasfasern, Funkwellen, usw... | + +**Ebene 1** (Physikalisch) unterstützt die Übertragung über einen Kommunikationskanal (Wi-Fi, optische Faser, RJ-Kabel, usw...). Einheit: Bit. + +**Layer 2** (Data Link) unterstützt Netzwerktopologie (Token-Ring, Stern, Bus, usw...), Datenaufteilung und Übertragungsfehler. Einheit: Frame. + +**Layer 3** (Netzwerk) unterstützt End-zu-Ende-Datenübertragung (IP-Routing = Gateway). Einheit: Das Paket. + +**Layer 4** (Transport) unterstützt Service Typ (verbunden oder nicht verbunden), Verschlüsselung und Strömungskontrolle. Einheit: das Segment oder das Datagram. + +**Layer 5** (Session) unterstützt die Kommunikation zwischen zwei Computern. + +**Layer 6** (Präsentation) repräsentiert den Bereich, der unabhängig von Daten auf der Anwendungsebene ist. Im Wesentlichen übersetzt diese Ebene vom Netzwerkformat ins Anwendungsformat oder vom Anwendungsformat ins Netzwerkformat. + +**Layer 7** (Anwendung) repräsentiert den Kontakt mit dem Benutzer. Es umfasst die vom Netzwerk angebotenen Dienste: http, dns, ftp, imap, pop, smtp, usw... + +## Die Benennung von Schnittstellen + +*lo* ist die "**loopback**"-Schnittstelle, die es TCP/IP Programmen erlaubt, miteinander zu kommunizieren, ohne den lokalen Rechner zu verlassen. Dies aktiviert Testing, wenn das **-Netzwerkmodul des Systems ordnungsgemäß** funktioniert und ermöglicht auch das Anpingen des localhost. Alle Pakete, die durch localhost eingehen werden, gehen auch durch localhost aus. Die empfangenen Pakete sind die gesendeten Pakete. + +Der Linux-Kernel weist Schnittstellennamen mit einem bestimmten Präfix je nach Typ zu. Üblicherweise begannen beispielsweise alle **Ethernet** Schnittstellen mit **eth**. Dem Präfix folgte eine Nummer, die erste 0 (eth0, eth1, eth2...). Die Wifi-Schnittstellen erhielten ein wlan prefix. + +Auf Rocky8 Linux-Distributionen wird systemd Schnittstellen mit der neuen Konvention benennen, bei denen "X" eine Nummer darstellt: + +* `enoX`: Onboard-Geräte +* `ensX`: PCI Express Hotplug Slot +* `enpXsX`: physikalische/geographische Position des Steckverbinders der Hardware +* ... + +## Verwendung dès `ip` Befehls + +Vergessen Sie den alten `ifconfig` Befehl! Denke `ip`! + +!!! note "Anmerkung" + + Kommentar für Administratoren älterer Linux-Systeme: + + Der historische Netzwerk-Management-Befehl ist `ifconfig`. Dieser Befehl wurde durch den `ip`-Befehl ersetzt, der Netzwerkadministratoren bereits gut bekannt ist. + + Das Kommando `ip` ist der Befehl par excellence, der **IP-Adresse, ARP, Routing, usw...** verwaltet. + + Der Befehl `ifconfig` ist standardmäßig nicht mehr auf Rocky8 installiert. + + Es ist wichtig, jetzt gute Gewohnheiten zu bekommen. + +## Der Hostname + +Der `hostname` Befehl zeigt oder setzt den Hostnamen des Systems + +``` +hostname [-f] [hostname] +``` + +| Option | Beschreibung | +| ------ | --------------------------- | +| `-f` | FQDN anzeigen | +| `-i` | System-IPs-Adresse anzeigen | + +!!! tip "Hinweis" + + Dieser Befehl wird von verschiedenen Netzwerkprogrammen verwendet, um den Rechner zu identifizieren. + +Um einen Hostnamen zuzuweisen, ist es möglich den `hostname` Befehl zu verwenden, aber die Änderungen werden beim nächsten Booten nicht beibehalten. Der Befehl ohne Argumente zeigt den Hostnamen an. + +Um den Hostnamen dauerhaft festzulegen, muss die Datei `/etc/sysconfig/network` geändert werden: + +``` +NETWORKING=yes +HOSTNAME=pc-rocky.mondomaine.lan +``` + +Außerdem liest das Boot-Skript die Datei `/etc/hosts`, um den System-Hostnamen aufzulösen. + +Beim Systemstart wertet Linux den `HOSTNAME`-Wert in der Datei `/etc/sysconfig/network` aus. + +Es verwendet dann die Datei `/etc/hosts`, um die Haupt-IP-Adresse des Servers und dessen Hostnamen auszuwerten. Es leitet den DNS-Domänennamen ab. + +Daher ist es wichtig, diese beiden Dateien vor jeder Konfiguration von Netzwerkdiensten auszufüllen. + +!!! tip "Hinweis" + + Um zu wissen, ob diese Konfiguration vollständig ist, müssen die Befehle `hostname` und `hostname -f` mit den erwarteten Werten antworten. + +## /etc/hosts Datei + +Die Datei `/etc/hosts` ist eine statische Hostnamenzuordnungstabelle, die dem folgenden Format folgt: + +``` +@IP [alias] [# comment] +``` + +Beispiel für eine `/etc/hosts` Datei: + +``` +127.0.0.1 localhost localhost.localdomain +::1 localhost localhost.localdomain +192.168.1.10 rockstar.rockylinux.lan rockstar +``` + +Die `/etc/hosts` Datei wird immer noch vom System verwendet, insbesondere zum Boot-Zeitpunkt, wenn das System-FQDN ermittelt wird. + +!!! tip "Hinweis" + + RedHat empfiehlt, dass mindestens eine Zeile mit dem Systemnamen ausgefüllt werden sollte. + +Wenn der **DNS** Service (**D**omain**N**ame **S**ervice) nicht vorhanden ist, müssen Sie alle Namen in der Hosts-Datei für jeden Ihrer Rechner eingeben. + +Die Datei `/etc/hosts` enthält eine Zeile pro Eintrag mit der IP-Adresse, den FQDN, dann den Hostnamen (in dieser Reihenfolge) und eine Reihe von Aliase (alias1 alias2 . .). Der Alias ist optional. + +## `/etc/nsswitch.conf` Datei + +Die **NSS** (**N**Name **S**ervice **S**witch) erlaubt Konfigurationsdateien (z.B. `/etc/passwd`, `/etc/group`, `/etc/hosts`), die durch eine oder mehrere zentralisierte Datenbanken ersetzt werden sollen. + +Die Datei `/etc/nsswitch.conf` wird verwendet, um die Namen-Service-Datenbanken zu konfigurieren. + +``` +passwd: files +shadow: files +group: files + +hosts: files dns +``` + +In diesem Fall wird Linux zuerst nach einem Hostnamen suchen (`hosts:` Zeile) in der `/etc/hosts` Datei (`files` Wert) bevor er DNS abgefragt (`dns` Wert) wird! Dieses Verhalten kann einfach durch Bearbeiten der Datei `/etc/nsswitch.conf` geändert werden. + +Natürlich kann man sich vorstellen, ein LDAP abzufragen, MySQL oder ein anderer Server, indem Sie den Nameservice so konfigurieren, dass er auf Systemanfragen für Hosts, Benutzer, Gruppen usw. reagiert. + +Die Auflösung des Namendienstes kann mit dem `getent` Befehl getestet werden, den wir später in diesem Kurs sehen werden. + +## `/etc/resolv.conf` Datei + +Die Datei `/etc/resolv.conf` enthält die Konfiguration der DNS-Namensauflösung. + +``` +#Generated by NetworkManager +domain mondomaine.lan +search mondomaine.lan +nameserver 192.168.1.254 +``` + +!!! tip "Hinweis" + + Diese Datei ist historisch. Sie wird nicht mehr direkt ausgefüllt! + +Neuere Generationen von Distributionen haben im Allgemeinen den `NetworkManager` Dienst integriert. Mit diesem Service können Sie die Konfiguration effizienter verwalten, entweder im Grafik- oder im Konsolen-Modus. + +Es erlaubt das Hinzufügen von DNS-Servern aus der Konfigurationsdatei einer Netzwerkschnittstelle. Anschließend wird die Datei `/etc/resolv.conf` dynamisch aufgefüllt, die niemals direkt bearbeitet werden sollte, da die Konfigurationsänderungen sonst beim nächsten Start des Netzwerkdienstes verloren gehen. + +## `ip` Befehl + +Das `ip` Kommando des `iproute2` Pakets erlaubt es Ihnen, eine Schnittstelle und deren Routing-Tabelle zu konfigurieren. + +Schnittstellen anzeigen: + +``` +[root]# ip link +``` + +Schnittstellen-Information anzeigen: + +``` +[root]# ip addr show +``` + +Zeigt die Informationen einer Schnittstelle an: + +``` +[root]# ip addr show eth0 +``` + +ARP-Tabelle anzeigen: + +``` +[root]# ip neigh +``` + +Alle historischen Netzwerkverwaltungsbefehle wurden unter dem `ip` Befehl zusammengefasst, der Netzwerkadministratoren gut bekannt ist. + +## DHCP-Konfiguration + +Das **DHCP** Protokoll (**D**ynamic **H**ost **C**ontrol **P**rotocol) erlaubt es Ihnen, eine komplette IP-Konfiguration über das Netzwerk zu erhalten. Dies ist der Standard-Konfigurationsmodus einer Netzwerkschnittstelle unter Rocky Linux, was erklärt, warum ein an das Netzwerk eines Internet-Routers angeschlossenes System ohne zusätzliche Konfiguration funktionieren kann. + +Die Konfiguration von Schnittstellen unter Rocky Linux erfolgt im Ordner `/etc/sysconfig/network-scripts/`. + +Für jede Ethernet-Schnittstelle ermöglicht eine `ifcfg-ethX` Datei die Konfiguration der dazugehörigen Schnittstelle. + +``` +DEVICE=eth0 +ONBOOT=yes +BOOTPROTO=dhcp +HWADDR=00:0c:29:96:32:e3 +``` + +* Schnittstellenname (muss im Dateinamen sein): + +``` +DEVICE=eth0 +``` + +* Die Schnittstelle automatisch starten: + +``` +ONBOOT=yes +``` + +* Eine DHCP-Anfrage beim Start der Schnittstelle auslösen: + +``` +BOOTPROTO=dhcp +``` + +* Geben Sie die MAC-Adresse an (optional, aber nützlich, wenn es mehrere Schnittstellen gibt) : + +``` +HWADDR=00:0c:29:96:32:e3 +``` + +!!! tip "Hinweis" + + Wenn NetworkManager installiert ist, werden die Änderungen automatisch berücksichtigt. Falls nicht, müssen Sie den Netzwerkdienst neu starten. + +* Netzwerkdienst neustarten: + +``` +[root]# systemctl restart NetworkManager +``` + +## Statische Konfiguration + +Die statische Konfiguration erfordert mindestens: + +``` +DEVICE=eth0 +ONBOOT=yes +BOOTPROTO=none +IPADDR=192.168.1.10 +NETMASK=255.255.255.0 +``` + +* Hier werden "dhcp" durch "none" ersetzt, was der statischen Konfiguration entspricht: + +``` +BOOTPROTO=none +``` + +* IP-Adresse: + +``` +IPADDR=192.168.1.10 +``` + +* Subnet-Maske: + +``` +NETMASK=255.255.255.0 +``` + +* Die Maske kann auch mit einem Präfix angegeben werden: + +``` +PREFIX=24 +``` + +!!! warning "Warnhinweis" + + Sie sollten NETMASK ODER PREFIX verwenden - Nicht beides! + +## Routing + +![Netzwerkarchitektur mit Gateway](images/network-002.png) + +``` +DEVICE=eth0 +ONBOOT=yes +BOOTPROTO=none +HWADDR=00:0c:29:96:32:e3 +IPADDR=192.168.1.10 +NETMASK=255.255.255.0 +GATEWAY=192.168.1.254 +``` + +Das Kommando `ip route`: + +``` +[root]# ip route show +192.168.1.0/24 dev eth0 […] src 192.168.1.10 metric 1 +default via 192.168.1.254 dev eth0 proto static +``` + +Es ist eine gute Idee, eine Routing-Tabelle lesen zu können, insbesondere in einer Umgebung mit mehreren Netzwerkschnittstellen. + +* Im angezeigten Beispiel ist das `192.168.1.0/24` Netzwerk direkt vom `eth0` Gerät aus erreichbar also gibt es eine Metrik bei `1` (durchläuft keinen Router). + +* Alle anderen Netzwerke als dem vorherigen werden erreichbar sein, wieder von dem `eth0` Gerät, aber diesmal werden die Pakete an ein `192.68.1.254` Gateway adressiert. Das Routing-Protokoll ist ein statisches Protokoll (obwohl es möglich ist, eine Route zu einer dynamisch zugewiesenen Adresse in GNU/Linux hinzuzufügen). + +## Namensauflösung + +Ein System muss Folgendes auflösen: + +* FQDNs in IP-Adressen + +``` +www.free.fr = 212.27.48.10 +``` + +* IP-Adressen in Namen + +``` +212.27.48.10 = www.free.fr +``` + +* oder um Informationen über ein Gebiet zu erhalten: + +``` +MX de free.fr = 10 mx1.free.fr + 20 mx2.free.fr +``` + +``` +DEVICE=eth0 +ONBOOT=yes +BOOTPROTO=none +HWADDR=00:0c:29:96:32:e3 +IPADDR=192.168.1.10 +NETMASK=255.255.255.0 +GATEWAY=192.168.1.254 +DNS1=172.16.1.2 +DNS2=172.16.1.3 +DOMAIN=rockylinux.lan +``` + +In diesem Fall, um das DNS zu erreichen, müssen Sie durch das Gateway gehen. + +``` + #Generated by NetworkManager + domain mondomaine.lan + search mondomaine.lan + nameserver 172.16.1.2 + nameserver 172.16.1.3 +``` + +Die Datei wurde vom NetworkManager aktualisiert. + +## Fehlerbehebung + +Der `ping` Befehl sendet Datagramme an eine andere Maschine und wartet auf eine Antwort. + +Es ist der grundlegende Befehl zum Testen des Netzwerks, da er die Verbindung zwischen Ihrer Netzwerkschnittstelle und einer anderen überprüft. + +Syntax des `ping` Befehl: + +``` +ping [-c numerical] destination +``` + +Mit der Option `-c` (count) können Sie den Befehl nach dem Countdown in Sekunden beenden. + +Beispiel: + +``` +[root]# ping –c 4 localhost +``` + +!!! tip "Hinweis" + + Konnektivität von nah bis fern überprüfen + +1) Überprüft die TCP/IP-Software-Ebene + +``` +[root]# ping localhost +``` + +"ping" der inneren Schleife erkennt keinen Hardwarefehler an der Netzwerkschnittstelle. Es stellt einfach fest, ob die IP-Software-Konfiguration korrekt ist. + +2) Überprüfen der Netzwerkkarte + +``` +[root]# ping 192.168.1.10 +``` + +Um festzustellen, dass die Netzwerkkarte funktionsfähig ist, müssen wir nun ihre IP-Adresse mit ping testen. Die Netzwerkkarte, wenn das Netzwerkkabel nicht angeschlossen ist, sollte sich in einem "down"-Zustand befinden. + +Wenn ping nicht funktioniert, zuerst das Netzwerkkabel zusammen mit dem Switch überprüfen und die Schnittstelle neu zusammenstellen (siehe `if up` Befehl), dann die Schnittstelle selbst überprüfen. + +3) Überprüfen der Verbindung des Gateways + +``` +[root]# ping 192.168.1.254 +``` + +4) Überprüfung der Konnektivität eines entfernten Servers + +``` +[root]# ping 172.16.1.2 +``` + +5) Validierung des DNS-Dienstes + +``` +[root]# ping www.free.fr +``` + +### `dig` Befehl + +Der `dig` Befehl wird verwendet, um den DNS-Server abzufragen. + +Die `dig` Befehlssyntax: + +``` +dig [-t type] [+short] [name] +``` + +Beispiele: + +``` +[root]# dig +short rockylinux.org +76.223.126.88 +[root]# dig -t MX +short rockylinux.org  ✔ +5 alt1.aspmx.l.google.com. +... +``` + +Der `dig` Befehl wird verwendet, um DNS-Server abzufragen. Es ist standardmäßig sehr ausführlich, aber dieses Verhalten kann mit der `+short` Option geändert werden. + +It is also possible to specify a DNS **record type** to resolve, such as an MX **type** to get information about the mail exchangers for a domain. + +### `getent` Befehl + +Das `getent` (get entry) Kommando wird verwendet, um einen NSSwitch Eintrag zu erhalten (`hosts` + `dns`) + +Syntax des `getent` Befehls: + + +``` +getent hosts name +``` + +Beispiel: + +``` +[root]# getent hosts rockylinux.org + 76.223.126.88 rockylinux.org +``` + +Querying only a DNS server may return an erroneous result that does not take into account the contents of a `hosts` file, although this should be rare nowadays. + +Um auch die `/etc/hosts` Datei zu berücksichtigen, muss der NSSwitch Namensdienst abgefragt werden, der sich um jede DNS-Auflösung kümmert. + +### `ipcalc` Befehl + +Das `ipcalc` (**ip calculation**) Kommando wird verwendet, um die Adresse eines Netzwerks oder Broadcasts von einer IP-Adresse und einer Maske zu berechnen. + +Syntax des `ipcalc` Befehls: + +``` +ipcalc [options] IP +``` + +Beispiel: + +``` +[root]# ipcalc –b 172.16.66.203 255.255.240.0 +BROADCAST=172.16.79.255 +``` + +!!! tip "Hinweis" + + Dieser Befehl ist interessant, gefolgt von einer Umleitung, die automatisch die Konfigurationsdateien Ihrer Schnittstellen ausfüllt: + + ``` + [root]# ipcalc –b 172.16.66.203 255.255.240.0 >> /etc/sysconfig/network-scripts/ifcfg-eth0 + ``` + +| Option | Beschreibung | +| ------ | --------------------------------------- | +| `-b` | Zeigt die Broadcast-Adresse. | +| `-D` | Zeigt die Netzwerkadresse und Maske an. | + +Der Befehl `ipcalc` bietet eine einfache Möglichkeit, die IP-Informationen eines Hosts zu berechnen. Die verschiedenen Optionen geben an, welche Informationen `ipcalc` anzeigen soll. Es können mehrere Optionen angegeben werden. Eine IP-Adresse muss für die Operation angegeben werden. Die meisten Operationen erfordern auch eine Netzwerkmaske oder einen CIDR-Präfix. + +| Kurz-Option | Lang-Option | Beschreibung | +| ----------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-b` | `--broadcast` | Zeigt die Broadcast-Adresse der angegebenen IP-Adresse und die Netzwerkmaske an. | +| `-h` | `--hostname` | Zeigt den Hostnamen der via DNS angegebenen IP-Adresse. | +| `-D` | `--netmask` | Berechnet die Netzwerkmaske für die angegebene IP-Adresse. Dies unter der Voraussetzung, dass die IP-Adresse Teil eines kompletten Netzwerks der Klasse A, B oder C ist. Viele Netzwerke verwenden keine Standard-Netzwerkmasken, in diesem Fall wird ein falscher Wert zurückgegeben. | +| `-p` | `--prefix` | Gibt das Präfix der Maske/IP-Adresse an. | +| `-n` | `--network` | Gibt die Netzwerkadresse der angegebenen IP-Adresse und Maske an. | +| `-s` | `--silent` | Keine Fehlermeldungen anzeigen. | + +### Das Kommando `ss` + +Der Befehl `ss` (**Socketstatistiken**) zeigt die Listening-Ports im Netzwerk an. + +Syntax des `ss`-Befehls: + +``` +ss [-tuna] +``` + +Beispiel: + +``` +[root]# ss –tuna +tcp LISTEN 0 128 *:22 *:* +``` + +Die Befehle `ss` und `netstat` (to follow) werden für den Rest Ihres GNU/Linux-Lebens sehr wichtig sein. + +Bei der Implementierung von Netzwerkdiensten ist es üblich, mit einem dieser beiden Befehle zu überprüfen, ob der Dienst auf den erwarteten Ports lauscht. + +### Das Kommando `netstat` + +!!! warning "Warnhinweis" + + Der Befehl `netstat` ist jetzt obsolet und wird standardmäßig nicht mehr unter Rocky Linux installiert. Möglicherweise finden Sie immer noch einige Linux-Versionen, die es installiert haben, aber es ist am besten, wenn Sie `ss` für alles verwenden, wofür Sie + bisher `netstat` benutzt haben. + +Der `netstat` Befehl (**Netzwerkstatistiken**) zeigt die listening-Ports im Netzwerk an. + +Syntax des `netstat` Befehls: + +``` +netstat -tapn +``` + +Beispiel: + +``` +[root]# netstat –tapn +tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2161/sshd +``` + +### IP- oder MAC-Adressen-Konflikte + +Eine fehlerhafte Konfiguration kann dazu führen, dass mehrere Schnittstellen dieselbe IP-Adresse verwenden. Dies kann passieren, wenn ein Netzwerk mehrere DHCP-Server hat oder wenn die gleiche IP-Adresse mehrfach manuell zugewiesen wurde. + +Wenn das Netzwerk nicht richtig funktioniert und die Ursache möglicherweise ein IP-Adresskonflikt ist, können Sie die Software `arp-scan` verwenden (erfordert EPEL-Repository): + +``` +$ dnf install arp-scan +``` + +Beispiel: + +``` +$ arp-scan -I eth0 -l + +172.16.1.104 00:01:02:03:04:05 3COM CORPORATION +172.16.1.107 00:0c:29:1b:eb:97 VMware, Inc. +172.16.1.250 00:26:ab:b1:b7:f6 (Unknown) +172.16.1.252 00:50:56:a9:6a:ed VMWare, Inc. +172.16.1.253 00:50:56:b6:78:ec VMWare, Inc. +172.16.1.253 00:50:56:b6:78:ec VMWare, Inc. (DUP: 2) +172.16.1.253 00:50:56:b6:78:ec VMWare, Inc. (DUP: 3) +172.16.1.253 00:50:56:b6:78:ec VMWare, Inc. (DUP: 4) +172.16.1.232 88:51:fb:5e:fa:b3 (Unknown) (DUP: 2) +``` + +!!! tip "Hinweis" + + Wie das obige Beispiel zeigt, ist es auch möglich, MAC-Adressen-Konflikte zu haben! Diese Probleme können durch Virtualisierungstechnologien und das Kopieren virtueller Maschinen entstehen. + +## Hot-Konfiguration + +Das Kommando `ip` kann eine IP-Adresse zu einer Schnittstelle unmittelbar hinzufügen + +``` +ip addr add @IP dev DEVICE +``` + +Beispiel: + +``` +[root]# ip addr add 192.168.2.10 dev eth1 +``` + +Der `ip` Befehl erlaubt die Aktivierung oder Deaktivierung einer Schnittstelle: + +``` +ip link set DEVICE up +ip link set DEVICE down +``` + +Beispiel: + +``` +[root]# ip link set eth1 up +[root]# ip link set eth1 down +``` + +Der `ip` Befehl kann verwendet werden, um eine Route hinzuzufügen: + +``` +ip route add [default|netaddr] via @IP [dev device] +``` + +Beispiel: + +``` +[root]# ip route add default via 192.168.1.254 +[root]# ip route add 192.168.100.0/24 via 192.168.2.254 dev eth1 +``` + +## Zusammenfassung + +Die in diesem Kapitel verwendeten Dateien sind: + +![Zusammenfassung der im Netzwerkteil implementierten Dateien](images/network-003.png) + +Eine komplette Schnittstellen-Konfiguration könnte wie folgt aussehen (Datei `/etc/sysconfig/network-scripts/ifcfg-eth0`): + +``` + DEVICE=eth0 + ONBOOT=yes + BOOTPROTO=none + HWADDR=00:0c:29:96:32:e3 + IPADDR=192.168.1.10 + NETMASK=255.255.255.0 + GATEWAY=192.168.1.254 + DNS1=172.16.1.1 + DNS2=172.16.1.2 + DOMAIN=rockylinux.lan +``` + +Die Vorgehensweise bei der Fehlerbehebung sollte von dem nächstgelegenen bis zum weitesten gehen: + +1. ping localhost (Software-Test) +2. ping IP-Adresse (Hardwaretest) +3. ping Gateway (Verbindungstest) +4. ping Remote-Server (Routing-Test) +5. DNS-Query (dig oder ping) + +![Vorgehensweise bei der Fehlerbehebung oder Netzwerküberprüfung](images/network-004.png) From 3097f7770b6ace07e66e3f289f98c61c9d8e02e5 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:31:19 -0500 Subject: [PATCH 07/22] New translations 13-softwares.md (French) --- docs/books/admin_guide/13-softwares.fr.md | 32 +++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/books/admin_guide/13-softwares.fr.md b/docs/books/admin_guide/13-softwares.fr.md index 24c5e3abbb..04e32d22ed 100644 --- a/docs/books/admin_guide/13-softwares.fr.md +++ b/docs/books/admin_guide/13-softwares.fr.md @@ -78,8 +78,8 @@ rpm -q [-a][-i][-l] package [-f] file Exemple : ```bash -[root]# rpm -qil package -[root]# rpm -qf /path/to/file +rpm -qil package +rpm -qf /path/to/file ``` | Option | Description | @@ -134,11 +134,11 @@ httpd-tools.x86_64 2.4.37-30.module_el8.3.0+561+97fdbbcc @app ## DNF: Dandified Yum -**DNF** (**Dandified Yum**) est un gestionnaire de paquets logiciels, successeur de **YUM** (**Yellow dog **U**pdater **M**odified). Il fonctionne avec des paquets **RPM** regroupés dans un dépôt (un répertoire de stockage des paquets) local ou distant. Pour les commandes les plus courantes, son utilisation est identique à celle de `yum`. +**DNF** (**Dandified Yum**) est un gestionnaire de paquets logiciels, successeur de **YUM** (**Y**ellow dog **U**pdater **M**odified). Il fonctionne avec des paquets **RPM** regroupés dans un dépôt (un répertoire de stockage des paquets) local ou distant. Pour les commandes les plus courantes, son utilisation est identique à celle de `yum`. La commande `dnf` permet la gestion des paquets en comparant ceux installés sur le système à ceux présents dans les dépôts définis sur le serveur. Elle permet aussi d’installer automatiquement les dépendances, si elles sont également présentes dans les dépôts. -`dnf` est le gestionnaire utilisé par de nombreuses distributions à base RedHat (Rocky Linux, Fedora, CentOS, …​). Son équivalent dans le monde Debian est **APT** (**A**dvanced **P**ackaging **T**ool). +`dnf` est le gestionnaire utilisé par de nombreuses distributions basées sur RedHat (Rocky Linux, Fedora, CentOS, …​). Son équivalent dans le monde Debian est **APT** (**A**dvanced **P**ackaging **T**ool). ### La commande `dnf` @@ -217,7 +217,7 @@ pcp-pmda-nginx.aarch64 : Performance Co-Pilot (PCP) metrics for the Nginx Webser python3-certbot-nginx.noarch : The nginx plugin for certbot ``` -Le gestionnaire DNF s’appuie sur un ou plusieurs fichiers de configuration afin de cibler les dépôts contenant les paquets RPM. +Une autre façon de rechercher un package en entrant une clé de recherche supplémentaire consiste à envoyer le résultat de la commande `dnf` via un pipe à la commande grep avec la clé souhaitée. ```bash dnf search nginx | grep mod @@ -260,7 +260,7 @@ La commande `dnf list` liste tous les paquets installés sur le système ou pré | Paramètre | Description | | ----------- | ---------------------------------------------------------------------------- | -| `all` | Liste les paquets installés puis ceux disponibles sur les dépôts. | +| `all` | Liste les paquets installés puis ceux disponibles dans les dépôts. | | `available` | Liste uniquement les paquets disponibles pour installation. | | `updates` | Liste les paquets pouvant être mis à jour. | | `obsoletes` | Liste les paquets rendus obsolètes par des versions supérieures disponibles. | @@ -415,7 +415,7 @@ Repo-pkgs : 1,650 Repo-available-pkgs: 1,107 Repo-size : 6.4 G Repo-mirrors : https://mirrors.rockylinux.org/mirrorlist?arch=aarch64&repo=PowerTools-8 -Repo-baseurl : https://mirror2.sandyriver.net/pub/rocky/8.8/PowerTools/x86_64/os/ (30 more) +Repo-baseurl : https://example.com/pub/rocky/8.8/PowerTools/x86_64/os/ (30 more) Repo-expire : 172,800 second(s) (last: Tue 22 Mar 2022 05:49:24 PM CET) Repo-filename : /etc/yum.repos.d/Rocky-PowerTools.repo ... @@ -491,8 +491,8 @@ La commande `dnf clean` nettoie tous les caches et fichiers temporaires créés | `all` | Supprime tous les fichiers temporaires créés pour les dépôts activés. | | `dbcache` | Supprime les fichiers de cache des métadonnées du dépôt. | | `expire-cache` | Supprime les fichiers cookies locaux. | -| `métadonnées` | Supprime toutes les métadonnées des dépôts. | -| `paquets` | Supprime tous les paquets mis en cache. | +| `metadata` | Supprime toutes les métadonnées des dépôts. | +| `packages` | Supprime tous les paquets mis en cache. | ### Comment fonctionne DNF @@ -529,7 +529,7 @@ Les modules ont été introduits dans Rocky Linux 8 par le système upstream. Af !!! hint "Package Confusion" - La création de modules streams dans le dépôt AppStream a causé beaucoup de confusion. Puisque les modules sont empaquetés dans un flux (stream, voir nos exemples ci-dessous), un paquet particulier s'affichera dans nos RPMs, mais si une tentative était faite pour l'installer sans activer le module, rien ne se passerait. N'oubliez pas de regarder les modules si vous essayez d'installer un paquet et qu'il ne le trouve pas. + La création de modules streams dans le dépôt AppStream a causé beaucoup de confusion. Puisque les modules sont empaquetés dans un flux (stream, voir nos exemples ci-dessous), un paquet particulier s'affichera dans nos RPMs, mais si une tentative était faite pour l'installer sans activer le module, rien ne se passerait. N'oubliez pas d'examiner les modules si vous essayez d'installer un paquet et que dfn ne le trouve pas. ### Que sont les modules ? @@ -771,7 +771,7 @@ Description : This package contains the Extra Packages for Enterprise Linux : (EPEL) repository GPG key as well as configuration for yum. ``` -Le paquet, comme vous pouvez le voir dans la description du paquet ci-dessus, ne contient pas d'exécutables, de bibliothèques, etc. , mais seulement les fichiers de configuration et les clés GPG pour configurer le dépôt. +Le paquet, comme vous pouvez le voir dans la description du paquet ci-dessus, ne contient pas d'exécutables, de bibliothèques, etc., mais seulement les fichiers de configuration et les clés GPG pour configurer le dépôt. Une autre façon de vérifier que l'installation est correcte est d'interroger la base de données rpm. @@ -953,13 +953,13 @@ dnf config-manager --save --setopt=*.proxy=http://proxy.rocky.lan:3128/ `copr` est un forgeage automatique de rpm, fournissant un dépôt avec les paquets construits. -* Activer un dépôt de copr : +* Activer un dépôt COPR : ``` copr enable xxxx ``` -### `Télécharger` le plugin +### `Télécharger` le plugiciel Télécharger le paquet rpm au lieu de l'installer : @@ -967,7 +967,7 @@ Télécharger le paquet rpm au lieu de l'installer : dnf download ansible ``` -Si vous voulez juste obtenir l'url de l'emplacement distant du paquet : +Si vous voulez juste obtenir l'URL de l'emplacement distant du paquet : ``` dnf download --url ansible @@ -983,7 +983,7 @@ dnf download --resolv --alldeps ansible Après avoir exécuté une mise à jour avec `dnf update`, les processus en cours d'exécution continueront à s'exécuter, mais avec les anciens binaires. Afin de prendre en compte les changements de code et en particulier les mises à jour de sécurité, ils doivent être redémarrés. -Le plugin `needs-restarting` vous permettra de détecter les processus qui sont dans ce cas. +Le plugiciel `needs-restarting` vous permettra de détecter les processus qui sont dans ce cas. ``` dnf needs-restarting [-u] [-r] [-s] @@ -991,7 +991,7 @@ dnf needs-restarting [-u] [-r] [-s] | Options | Observation | | ------- | ----------------------------------------------------------------------- | -| `-u` | Considérez uniquement les processus appartenant à l'utilisateur actuel. | +| `-u` | considérer uniquement les processus appartenant à l'utilisateur actuel. | | `-r` | pour vérifier si un redémarrage peut être nécessaire. | | `-s` | pour vérifier si les services ont besoin d'être redémarrés. | | `-s -r` | pour faire les deux en une seule étape. | From daf7322c0cd00baa4ec458be9d863d97cef503e0 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:31:23 -0500 Subject: [PATCH 08/22] New translations 00-toc.md (French) --- docs/books/learning_ansible/00-toc.fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/books/learning_ansible/00-toc.fr.md b/docs/books/learning_ansible/00-toc.fr.md index 7f50b63822..2703c81ae5 100644 --- a/docs/books/learning_ansible/00-toc.fr.md +++ b/docs/books/learning_ansible/00-toc.fr.md @@ -4,4 +4,4 @@ title: Apprendre Ansible avec Rocky # Apprendre Ansible avec Rocky -Ansible est un outil d'automatisation pour GNU/Linux simple, mais puissant. Ce tutoriel va vous guider au travers des concepts permettant d'utiliser Ansible pour automatiser vos tâches informatiques d'une façon amusante (espérons le) et informative. Les exercices présents dans ces chapitres vous permettront d'acquérir un niveau confortable pour utiliser Ansible en situation réelle. +Ansible est un outil d'automatisation pour Linux simple, mais puissant. Ce tutoriel va vous guider au travers des concepts permettant d'utiliser Ansible pour automatiser vos tâches informatiques d'une façon amusante (espérons le) et informative. Les exercices présents dans ces chapitres vous permettront d'acquérir un niveau confortable pour utiliser Ansible en situation réelle. From ff599769f12dae0fdd56860b2f513f4325fb7a88 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:31:34 -0500 Subject: [PATCH 09/22] New translations 02-advanced.md (French) --- docs/books/learning_ansible/02-advanced.fr.md | 744 ++++++++++++++++++ 1 file changed, 744 insertions(+) create mode 100644 docs/books/learning_ansible/02-advanced.fr.md diff --git a/docs/books/learning_ansible/02-advanced.fr.md b/docs/books/learning_ansible/02-advanced.fr.md new file mode 100644 index 0000000000..09366eda43 --- /dev/null +++ b/docs/books/learning_ansible/02-advanced.fr.md @@ -0,0 +1,744 @@ +--- +title: Ansible - Niveau Intermédiaire +--- + +# Ansible - Tutoriel Niveau Intermédiaire + +Dans ce chapitre, vous allez approfondir vos connaissances sur Ansible. + +**** + +**Objectifs** : Dans ce chapitre, vous apprendrez à : + +:heavy_check_mark: travailler avec des variables ; +:heavy_check_mark: utiliser des boucles ; +:heavy_check_mark: gérer les changements d'état et réagir en conséquence ; +:heavy_check_mark: gérer des tâches asynchrones. + +:checkered_flag: **ansible**, **module**, **playbook** + +**Connaissances**: :star : :star : :star : +**Complexité**: :star : :star : + +**Temps de lecture** : 31 minutes + +**** + +Dans le chapitre précédent, vous avez appris à installer Ansible, à l'utiliser en ligne de commande ou comment écrire des playbooks pour permettre la réutilisation de votre code. + +Dans ce chapitre, nous pouvons commencer à découvrir des notions plus avancées sur la façon d'utiliser Ansible et quelques tâches intéressantes que vous utiliserez très régulièrement. + +## Les variables + +!!! note "Remarque" + + Pour de plus amples détails veuillez consulter la documentation Plus [ici](https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html). + +Sous Ansible, il y a différents types de variables primitives : + +* chaînes de caractères, +* nombres entiers, +* booléens. + +Ces variables peuvent être organisées ainsi : + +* dictionnaires, +* listes. + +Une variable peut être définie à différents endroits, comme dans un playbook, dans un rôle ou à partir de la ligne de commande par exemple. + +Par exemple, à partir d'un playbook : + +``` +--- +- hosts: apache1 + vars: + port_http: 80 + service: + debian: apache2 + rhel: httpd +``` + +ou depuis la ligne de commande : + +``` +$ ansible-playbook deploy-http.yml --extra-vars "service=httpd" +``` + +Une fois définie, une variable peut être utilisée en l'appelant entre des accolades doubles : + +* `{{ port_http }}` pour une valeur simple, +* `{{ service['rhel'] }}` ou `{{ service.rhel }}` pour un dictionnaire. + +Par exemple : + +``` +- name: make sure apache is started + ansible.builtin.systemd: + name: "{{ service['rhel'] }}" + state: started +``` + +Bien sûr, il est également possible d'accéder aux variables globales les faits (**facts**) d'Ansible (type d'OS, adresses IP, nom de la VM, etc.). + +### Variables d'externalisation + +Les variables peuvent être incluses dans un fichier externe au playbook, auquel cas ce fichier doit être défini dans le playbook avec la directive `vars_files` : + +``` +--- +- hosts: apache1 + vars_files: + - myvariables.yml +``` + +Le fichier `myvariables.yml` : + +``` +--- +port_http: 80 +ansible.builtin.systemd:: + debian: apache2 + rhel: httpd +``` + +Il peut également être ajouté dynamiquement avec l'utilisation du module `include_vars` : + +``` +- name: Include secrets. + ansible.builtin.include_vars: + file: vault.yml +``` + +### Afficher une variable + +Pour afficher une variable, vous devez activer le module `debug` comme suit : + +``` +- ansible.builtin.debug: + var: service['debian'] +``` + +Vous pouvez également utiliser la variable à l'intérieur d'un texte : + +``` +- ansible.builtin.debug: + msg: "Print a variable in a message : {{ service['debian'] }}" +``` + +### Enregistrer le retour d'une tâche + +Pour enregistrer le retour d'une tâche et pouvoir y accéder plus tard, vous devez utiliser le mot clé `register` dans la tâche elle-même. + +Utilisation d'une variable stockée : + +``` +- name: /home content + shell: ls /home + register: homes + +- name: Print the first directory name + ansible.builtin.debug: + var: homes.stdout_lines[0] + +- name: Print the first directory name + ansible.builtin.debug: + var: homes.stdout_lines[1] +``` + +!!! note "Remarque" + + La variable `homes.stdout_lines` est une liste de variables de type string, un moyen d'organiser des variables que nous n'avions pas encore rencontrées. + +Les chaînes qui composent la variable stockée peuvent être accédées via la valeur `stdout` (qui vous permet de faire des choses comme `homes.stdout.find("core") != -1`), pour les exploiter en utilisant une boucle (voir `loop`) ou simplement par leurs indices tels que ce qui est illustré dans l'exemple précédent. + +### Exercices + +* Écrire un playbook `play-vars.yml` qui affiche le nom de la distribution de la cible avec sa version majeure, en utilisant des variables globales. + +* Écrivez un playbook en utilisant le dictionnaire suivant pour afficher les services qui seront installés : + +``` +service: + web: + name: apache + rpm: httpd + db: + name: mariadb + rpm: mariadb-server +``` + +Le type par défaut doit être "web". + +* Remplacer la valeur de la variable `type` en utilisant la ligne de commande + +* Externaliser les variables dans un fichier `vars.yml` + +## Gestion de boucles + +Avec l'aide d'une boucle, vous pouvez itérer une tâche sur une liste, un hachage ou un dictionnaire par exemple. + +!!! note "Remarque" + + Plus d'informations peuvent être [trouvées ici](https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html). + +Exemple d'utilisation simple, création de 4 utilisateurs : + +``` +- name: add users + user: + name: "{{ item }}" + state: present + groups: "users" + loop: + - antoine + - patrick + - steven + - xavier +``` + +À chaque itération de la boucle, la valeur de la liste utilisée est stockée dans la variable `item` accessible dans le code de la boucle. + +Bien sûr, une liste peut être définie dans un fichier externe : + +``` +users: + - antoine + - patrick + - steven + - xavier +``` + +et être utilisé dans la tâche comme ceci (après avoir inclus le fichier vars) : + +``` +- name: add users + user: + name: "{{ item }}" + state: present + groups: "users" + loop: "{{ users }}" +``` + +Nous pouvons utiliser l'exemple vu lors de l'étude des variables stockées pour l'améliorer. Utilisation d'une variable stockée : + +``` +- name: /home content + shell: ls /home + register: homes + +- name: Print the directories name + ansible.builtin.debug: + msg: "Directory => {{ item }}" + loop: "{{ homes.stdout_lines }}" +``` + +Un dictionnaire peut également être utilisé dans une boucle. + +Dans ce cas, vous devrez transformer le dictionnaire en un élément avec ce que l'on appelle un filtre **jinja** (jinja est le moteur utilisé par Ansible) : `| dict2items`. + +Dans la boucle, il devient possible d'utiliser `item.key` qui correspond à la clé de dictionnaire et `item.value` qui correspond à la valeur de la clé. + +Voyons cela à travers un exemple concret, montrant la gestion des utilisateurs du système : + +``` +--- +- hosts: rocky8 + become: true + become_user: root + vars: + users: + antoine: + group: users + state: present + steven: + group: users + state: absent + + tasks: + + - name: Manage users + user: + name: "{{ item.key }}" + group: "{{ item.value.group }}" + state: "{{ item.value.state }}" + loop: "{{ users | dict2items }}" +``` + +!!! note "Remarque" + + Beaucoup de choses peuvent être faites avec les boucles. Vous découvrirez les possibilités qu'offrent les boucles au fur et à mesure que votre utilisation d'Ansible vous pousse à les utiliser de manière plus complexe. + +### Exercices + +* Afficher le contenu de la variable `service` de l'exercice précédent en utilisant une boucle. + +!!! note "Remarque" + + Vous devrez transformer votre variable `service`, qui est un dictionnaire, en une liste avec l'aide du filtre jinja `list` comme ceci : + + ``` + {{ service.values() | list }} + ``` + +## Conditionals + +!!! note "Remarque" + + Pour plus d'informations veuillez consulter la documentation [ici](https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html). + +L'instruction `when` est très utile dans de nombreux cas : ne pas effectuer certaines actions sur certains types de serveurs, si un fichier ou un utilisateur n'existe pas, ... + +!!! note "Remarque" + + Derrière l'instruction `when` les variables n'ont pas besoin de doubles accolades (ce sont en fait des expressions Jinja2...). + +``` +- name: "Reboot only Debian servers" + reboot: + when: ansible_os_family == "Debian" +``` + +Les conditions peuvent être regroupées avec des parenthèses : + +``` +- name: "Reboot only CentOS version 6 and Debian version 7" + reboot: + when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or + (ansible_distribution == "Debian" and ansible_distribution_major_version == "7") +``` + +Les conditions correspondant à un ET logique peuvent être fournies en tant que liste : + +``` +- name: "Reboot only CentOS version 6" + reboot: + when: + - ansible_distribution == "CentOS" + - ansible_distribution_major_version == "6" +``` + +Vous pouvez tester la valeur d'un booléen et vérifier qu'il est vrai : + +``` +- name: check if directory exists + stat: + path: /home/ansible + register: directory + +- ansible.builtin.debug: + var: directory + +- ansible.builtin.debug: + msg: The directory exists + when: + - directory.stat.exists + - directory.stat.isdir +``` + +Vous pouvez également tester que ce n'est pas vrai : + +``` + when: + - file.stat.exists + - not file.stat.isdir +``` + +Vous devrez probablement tester qu'une variable existe pour éviter les erreurs d'exécution : + +``` + when: myboolean is defined and myboolean +``` + +### Exercices + +* Afficher la valeur de `service.web` uniquement lorsque `type` est égal à `web`. + +## Gestion des changements : les `handler`s + +!!! note "Remarque" + + Vous trouverez de plus amples informations [ici](https://docs.ansible.com/ansible/latest/user_guide/playbooks_handlers.html). + +Les handlers permettent de lancer des opérations, comme redémarrer un service, lorsque des changements se produisent. + +Un module, étant idempotent, un playbook peut détecter qu'il y a eu un changement significatif sur un système distant, et donc déclencher une opération en réaction à ce changement. Une notification est envoyée à la fin d'un bloc de tâches du playbook, et l'opération de réaction ne sera déclenchée qu'une seule fois même si plusieurs tâches envoient la même notification. + +![Handlers](images/handlers.png) + +Par exemple, plusieurs tâches peuvent indiquer que le service `httpd` doit être redémarré en raison d'un changement dans ses fichiers de configuration. Mais le service ne sera redémarré qu'une seule fois pour éviter de multiples démarrages inutiles. + +``` +- name: template configuration file + template: + src: template-site.j2 + dest: /etc/httpd/sites-availables/test-site.conf + notify: + - restart memcached + - restart httpd +``` + +Un handler est une sorte de tâche référencée par un nom global unique : + +* Il est activé par un ou plusieurs notifiers. +* Il ne commence pas immédiatement, mais attend que toutes les tâches soient terminées pour être exécuté. + +Exemple de handler : + +``` +handlers: + + - name: restart memcached + systemd: + name: memcached + state: restarted + + - name: restart httpd + systemd: + name: httpd + state: restarted +``` + +Depuis la version 2.2 de l'Ansible, les handlers peuvent également écouter directement : + +``` +handlers: + + - name: restart memcached + systemd: + name: memcached + state: restarted + listen: "web services restart" + + - name: restart apache + systemd: + name: apache + state: restarted + listen: "web services restart" + +tasks: + - name: restart everything + command: echo "this task will restart the web services" + notify: "web services restart" +``` + +## Tâches asynchrones + +!!! note "Remarque" + + Plus d'informations sont disponibles [ici](https://docs.ansible.com/ansible/latest/user_guide/playbooks_async.html). + +Par défaut, les connexions SSH aux hôtes restent ouvertes pendant l'exécution de diverses tâches du playbook sur tous les nœuds. + +Cela peut causer des problèmes, en particulier : + +* si le temps d'exécution de la tâche est plus long que le délai de connexion SSH +* si la connexion est interrompue pendant l'action (redémarrage du serveur par exemple) + +Dans ce cas, vous devrez passer en mode asynchrone et spécifier un temps d'exécution maximum ainsi que la fréquence (par défaut 10) avec laquelle vous allez vérifier le statut de l'hôte. + +En spécifiant une valeur de 0, Ansible exécute la tâche et continue sans se soucier du résultat. + +Voici un exemple utilisant des tâches asynchrones, qui vous permet de redémarrer un serveur et d'attendre que le port 22 soit à nouveau joignable : + +``` +# Wait 2s and launch the reboot +- name: Reboot system + shell: sleep 2 && shutdown -r now "Ansible reboot triggered" + async: 1 + poll: 0 + ignore_errors: true + become: true + changed_when: False + + # Wait the server is available + - name: Waiting for server to restart (10 mins max) + wait_for: + host: "{{ inventory_hostname }}" + port: 22 + delay: 30 + state: started + timeout: 600 + delegate_to: localhost +``` + +Vous pouvez également décider de lancer une tâche longue durée et de l'oublier (feu et oublier) parce que l'exécution n'a pas d'importance dans le playbook. + +## Résultats de l'exercice + +* Écrire un playbook `play-vars.yml` qui affiche le nom de la distribution de la cible avec sa version majeure, en utilisant des variables globales. + +``` +--- +- hosts: ansible_clients + + tasks: + + - name: Print globales variables + debug: + msg: "The distribution is {{ ansible_distribution }} version {{ ansible_distribution_major_version }}" +``` + +``` +$ ansible-playbook play-vars.yml + +PLAY [ansible_clients] ********************************************************************************* + +TASK [Gathering Facts] ********************************************************************************* +ok: [192.168.1.11] + +TASK [Print globales variables] ************************************************************************ +ok: [192.168.1.11] => { + "msg": "The distribution is Rocky version 8" +} + +PLAY RECAP ********************************************************************************************* +192.168.1.11 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +``` + +* Écrire un playbook en utilisant le dictionnaire suivant pour afficher les services qui seront installés : + +``` +service: + web: + name: apache + rpm: httpd + db: + name: mariadb + rpm: mariadb-server +``` + +Le type par défaut doit être "web". + +``` +--- +- hosts: ansible_clients + vars: + type: web + service:ɓ + web: + name: apache + rpm: httpd + db: + name: mariadb + rpm: mariadb-server + + tasks: + + - name: Print a specific entry of a dictionary + debug: + msg: "The {{ service[type]['name'] }} will be installed with the packages {{ service[type].rpm }}" +``` + +``` +$ ansible-playbook display-dict.yml + +PLAY [ansible_clients] ********************************************************************************* + +TASK [Gathering Facts] ********************************************************************************* +ok: [192.168.1.11] + +TASK [Print a specific entry of a dictionnaire] ******************************************************** +ok: [192.168.1.11] => { + "msg": "The apache will be installed with the packages httpd" +} + +PLAY RECAP ********************************************************************************************* +192.168.1.11 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +``` + +* Remplacer la valeur de la variable `type` en utilisant la ligne de commande : + +``` +ansible-playbook --extra-vars "type=db" display-dict.yml + +PLAY [ansible_clients] ********************************************************************************* + +TASK [Gathering Facts] ********************************************************************************* +ok: [192.168.1.11] + +TASK [Print a specific entry of a dictionary] ******************************************************** +ok: [192.168.1.11] => { + "msg": "The mariadb will be installed with the packages mariadb-server" +} + +PLAY RECAP ********************************************************************************************* +192.168.1.11 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +* Externaliser les variables dans un fichier `vars.yml` + +``` +type: web +service: + web: + name: apache + rpm: httpd + db: + name: mariadb + rpm: mariadb-server +``` + +``` +--- +- hosts: ansible_clients + vars_files: + - vars.yml + + tasks: + + - name: Print a specific entry of a dictionary + debug: + msg: "The {{ service[type]['name'] }} will be installed with the packages {{ service[type].rpm }}" +``` + + +* Afficher le contenu de la variable `service` de l'exercice précédent en utilisant une boucle. + +!!! note "Remarque" + + Vous devrez transformer votre variable `service`, qui est un dictionnaire, en un élément ou une liste avec l'aide du filtre jinja `dict2items` ou `list` ainsi : + + ``` + {{ service | dict2items }} + ``` + + ``` + {{ service.values() | list }} + ``` + +Avec `dict2items` : + +``` +--- +- hosts: ansible_clients + vars_files: + - vars.yml + + tasks: + + - name: Print a dictionary variable with a loop + debug: + msg: "{{item.key }} | The {{ item.value.name }} will be installed with the packages {{ item.value.rpm }}" + loop: "{{ service | dict2items }}" +``` + +``` +$ ansible-playbook display-dict.yml + +PLAY [ansible_clients] ********************************************************************************* + +TASK [Gathering Facts] ********************************************************************************* +ok: [192.168.1.11] + +TASK [Print a dictionary variable with a loop] ******************************************************** +ok: [192.168.1.11] => (item={'key': 'web', 'value': {'name': 'apache', 'rpm': 'httpd'}}) => { + "msg": "web | The apache will be installed with the packages httpd" +} +ok: [192.168.1.11] => (item={'key': 'db', 'value': {'name': 'mariadb', 'rpm': 'mariadb-server'}}) => { + "msg": "db | The mariadb will be installed with the packages mariadb-server" +} + +PLAY RECAP ********************************************************************************************* +192.168.1.11 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +``` + +Avec `list` : + +``` +--- +- hosts: ansible_clients + vars_files: + - vars.yml + + tasks: + + - name: Print a dictionary variable with a loop + debug: + msg: "The {{ item.name }} will be installed with the packages {{ item.rpm }}" + loop: "{{ service.values() | list}}" +~ +``` + +``` +$ ansible-playbook display-dict.yml + +PLAY [ansible_clients] ********************************************************************************* + +TASK [Gathering Facts] ********************************************************************************* +ok: [192.168.1.11] + +TASK [Print a dictionary variable with a loop] ******************************************************** +ok: [192.168.1.11] => (item={'name': 'apache', 'rpm': 'httpd'}) => { + "msg": "The apache will be installed with the packages httpd" +} +ok: [192.168.1.11] => (item={'name': 'mariadb', 'rpm': 'mariadb-server'}) => { + "msg": "The mariadb will be installed with the packages mariadb-server" +} + +PLAY RECAP ********************************************************************************************* +192.168.1.11 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +* Afficher la valeur de `service.web` uniquement lorsque `type` équivaut à `web`. + +``` +--- +- hosts: ansible_clients + vars_files: + - vars.yml + + tasks: + + - name: Print a dictionary variable + debug: + msg: "The {{ service.web.name }} will be installed with the packages {{ service.web.rpm }}" + when: type == "web" + + + - name: Print a dictionary variable + debug: + msg: "The {{ service.db.name }} will be installed with the packages {{ service.db.rpm }}" + when: type == "db" +``` + +``` +$ ansible-playbook display-dict.yml + +PLAY [ansible_clients] ********************************************************************************* + +TASK [Gathering Facts] ********************************************************************************* +ok: [192.168.1.11] + +TASK [Print a dictionary variable] ******************************************************************** +ok: [192.168.1.11] => { + "msg": "The apache will be installed with the packages httpd" +} + +TASK [Print a dictionary variable] ******************************************************************** +skipping: [192.168.1.11] + +PLAY RECAP ********************************************************************************************* +192.168.1.11 : ok=2 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 + +$ ansible-playbook --extra-vars "type=db" display-dict.yml + +PLAY [ansible_clients] ********************************************************************************* + +TASK [Gathering Facts] ********************************************************************************* +ok: [192.168.1.11] + +TASK [Print a dictionary variable] ******************************************************************** +skipping: [192.168.1.11] + +TASK [Print a dictionary variable] ******************************************************************** +ok: [192.168.1.11] => { + "msg": "The mariadb will be installed with the packages mariadb-server" +} + +PLAY RECAP ********************************************************************************************* +192.168.1.11 : ok=2 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 +``` From 817c0c8627d4720c9fd0e5dd0cf96a227f0bf05c Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:31:44 -0500 Subject: [PATCH 10/22] New translations 04-ansible-galaxy.md (French) --- docs/books/learning_ansible/04-ansible-galaxy.fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/books/learning_ansible/04-ansible-galaxy.fr.md b/docs/books/learning_ansible/04-ansible-galaxy.fr.md index b14bc7636a..1103bd1e41 100644 --- a/docs/books/learning_ansible/04-ansible-galaxy.fr.md +++ b/docs/books/learning_ansible/04-ansible-galaxy.fr.md @@ -200,7 +200,7 @@ PLAY RECAP ********************************************************************* 192.168.1.11 : ok=31 changed=1 unreachable=0 failed=0 skipped=4 rescued=0 ignored=0 ``` -Trop facile pour un processus aussi complexe, n'est-ce pas? +Trop facile pour un processus aussi complexe, n'est-ce pas ? Ce n'est qu'un exemple de ce qui peut être fait en utilisant les rôles mis à disposition par la communauté. Jetez un œil à [galaxy.ansible.com](https://galaxy.ansible.com/) pour découvrir les rôles qui pourraient vous être utiles ! From 0c98be14f05735b7a2875d0f22562588328d646c Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:31:45 -0500 Subject: [PATCH 11/22] New translations 04-ansible-galaxy.md (German) --- docs/books/learning_ansible/04-ansible-galaxy.de.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/books/learning_ansible/04-ansible-galaxy.de.md b/docs/books/learning_ansible/04-ansible-galaxy.de.md index 12a9f6c907..9b16f7f4f1 100644 --- a/docs/books/learning_ansible/04-ansible-galaxy.de.md +++ b/docs/books/learning_ansible/04-ansible-galaxy.de.md @@ -200,7 +200,7 @@ PLAY RECAP ********************************************************************* 192.168.1.11 : ok=31 changed=1 unreachable=0 failed=0 skipped=4 rescued=0 ignored=0 ``` -Ziemlich einfach für einen so komplizierter Prozess, oder? +Ziemlich einfach für einen so komplizierten Prozess, oder? Dies ist nur ein Beispiel dafür, was mit Hilfe von Rollen, die von der Community zur Verfügung gestellt werden, getan werden kann. Werfen Sie einen Blick auf [galaxy.ansible.com](https://galaxy.ansible.com/) um die Rollen zu entdecken, die für Sie nützlich sein könnten! From 6cd182aa4be59d46d60076c0d33c59aa755a5142 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:31:46 -0500 Subject: [PATCH 12/22] New translations 04-ansible-galaxy.md (Italian) --- docs/books/learning_ansible/04-ansible-galaxy.it.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/books/learning_ansible/04-ansible-galaxy.it.md b/docs/books/learning_ansible/04-ansible-galaxy.it.md index 77c4d100a1..f950e3ef1a 100644 --- a/docs/books/learning_ansible/04-ansible-galaxy.it.md +++ b/docs/books/learning_ansible/04-ansible-galaxy.it.md @@ -1,5 +1,5 @@ --- -title: Galassia Ansible +title: Ansible Galaxy --- # Galassia Ansibile: Collezioni e Ruoli From fcfb0dd3a6d8503d935c91677112797b5737175d Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:31:56 -0500 Subject: [PATCH 13/22] New translations 06-large-scale-infrastructure.md (French) --- .../06-large-scale-infrastructure.fr.md | 332 ++++++++++++++++++ 1 file changed, 332 insertions(+) create mode 100644 docs/books/learning_ansible/06-large-scale-infrastructure.fr.md diff --git a/docs/books/learning_ansible/06-large-scale-infrastructure.fr.md b/docs/books/learning_ansible/06-large-scale-infrastructure.fr.md new file mode 100644 index 0000000000..a56ea9f90e --- /dev/null +++ b/docs/books/learning_ansible/06-large-scale-infrastructure.fr.md @@ -0,0 +1,332 @@ +--- +title: Infrastructure à Grande Échelle +--- + +# Ansible - Infrastructure à Grande Échelle + +Dans ce chapitre vous allez apprendre à échelonner votre système de gestion de configuration. + +**** + +**Objectifs** : Dans ce chapitre, vous apprendrez à : + +:heavy_check_mark: Organiser votre code pour gérer une grande infrastructure ; +:heavy_check_mark: Appliquer une partie ou le tout de votre gestionnaire de configuration à un groupe de nœuds ; + +:checkered_flag: **ansible**, **config management**, **scale** + +**Connaissances** : :star: :star: :star: +**Complexité** : :star: :star: :star: :star: + +**Temps de lecture** : 31 minutes + +**** + +Nous avons vu dans les chapitres précédents comment organiser notre code sous forme de rôles, mais aussi comment utiliser certains rôles pour la gestion des mises à jour (patch management) ou le déploiement de code. + +Qu'en est-il de la gestion de la configuration ? Comment gérer la configuration de dizaines, de centaines ou même de milliers de machines virtuelles en utilisant Ansible ? + +L'avènement du cloud a un peu changé les méthodes traditionnelles. La machine virtuelle est configurée lors du déploiement. Si la configuration n'est plus conforme, elle est supprimée et remplacée par une nouvelle. + +L'organisation du système de gestion de configuration présentée dans ce chapitre répondra à ces deux modes de provisionnement : utilisation « one-shot » ou « reconfiguration » normale d'un parc de serveurs. + +Cependant, attention : utiliser Ansible pour assurer la conformité d'un parc nécessite de changer les habitudes de travail. Il n'est plus possible de modifier une configuration de gestion de services sans voir les changements annullés au cours du prochain provisionnement avec Ansible. + +!!! note "Remarque" + + Ce que nous allons mettre en œuvre ci-dessous n'est pas le terrain de prédilection d'Ansible. Des technologies comme Puppet ou bien Salt sont mieux adaptées. Rappelons qu'Ansible est un couteau suisse de l'automatisation et est dépourvu d'agent sur le client, ce qui explique les différences de performances. + +!!! note "Note" + + Des informations plus détaillées sont disponibles [ici](https://docs.ansible.com/ansible/latest/user_guide/sample_setup.html) + +## Stockage des Variables + +La première chose dont nous devrions parler est la séparation entre les données et le code Ansible. + +Au fur et à mesure que le code devient plus complexe, il sera de plus en plus difficile de modifier les variables qu'il contient. + +Pour assurer la maintenabilité de votre site, le plus important est de séparer correctement les variables du code Ansible. + +Nous n'en avons pas encore parlé jusqu'à maintenant, mais il faut savoir qu'Ansible peut charger automatiquement les variables qu'il trouve dans des dossiers spécifiques en fonction du nom d'inventaire du nœud géré ou de ses groupes membres. + +La documentation d'Ansible suggère d'organiser notre code comme suit : + +``` +inventories/ + production/ + hosts # inventory file for production servers + group_vars/ + group1.yml # here we assign variables to particular groups + group2.yml + host_vars/ + hostname1.yml # here we assign variables to particular systems + hostname2.yml +``` + +Si le nœud de destination est `hostname1` du groupe `group1`, les variables contenues dans les fichiers `hostname1.yml` et `group1.yml` seront automatiquement chargées. C'est une méthode efficace d'enregistrer tous les paramètres des roles au même endroit. + +De cette façon, le fichier d'inventaire de votre serveur devient pratiquement sa carte d'identité. Il contient toutes les variables qui diffèrent des variables par défaut pour votre serveur. + +Dans une optique de centralisation des variables, il est souhaitable d'organiser le nommage des variables dans les rôles en les préfixant par exemple par le nom du rôle. Il est ainsi conseillé d'utiliser de simples noms de variables plutôt que des dictionaires. + +Par exemple, si vous voulez enregistrer la valeur `PermitRootLogin` dans le fichier `sshd_config`, le nom `sshd_config_permitrootlogin` pour la variable serait adéquat (plutôt que `sshd.config.permitrootlogin`). + +## À propos des tags d'Ansible + +L'utilisation de balises d'Ansible vous permet d'exécuter ou ignorer partiellement une partie du code des tâches. + +!!! note "Remarque" + + Des informations plus détaillées sont disponibles [ici](https://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html). + +Par exemple, modifions notre tâche de création d'utilisateur : + +``` +- name: add users + user: + name: "{{ item }}" + state: present + groups: "users" + loop: + - antoine + - patrick + - steven + - xavier + tags: users +``` + +Vous pouvez maintenant exécuter seulement les tâches indiquées par la balise `users` en utilisant l'option de `ansible-playbook` `--tags` : + +``` +ansible-playbook -i inventories/production/hosts --tags users site.yml +``` + +Vous pouvez aussi essayer l'option `--skip-tags`. + +## À propos de la structure du répertoire + +Nous allons nous concentrer sur une proposition d'organisation des fichiers et répertoires nécessaires au bon fonctionnement d'un système de gestion de contenu (CMS). + +Le fichier `site.yml` sera notre point de départ. Ce fichier est en quelque sorte le chef d'orchestre du système CMS en intégrant les rôles nécessaires pour les nœuds de destination si besoin est : + +``` +--- +- name: "Config Management for {{ target }}" + hosts: "{{ target }}" + + roles: + + - role: roles/functionality1 + + - role: roles/functionality2 +``` + +Bien sûr, ces rôles doivent être enregistrés dans le répertoire `roles` au même niveau que le fichier `site.yml`. + +Les variables globales peuvent être gérées dans un fichier `vars/global_vars.yml`, même si il serait possible de les enregistrer dans le fichier `inventories/production/group_vars/all.yml` + +``` +--- +- name: "Config Management for {{ target }}" + hosts: "{{ target }}" + vars_files: + - vars/global_vars.yml + roles: + + - role: roles/functionality1 + + - role: roles/functionality2 +``` + +On peut aussi garder la possibilité de déactiver une fonctionnalité. Ainsi nous inclurons les rôles avec une condition et une valeur par défaut comme suit : + +``` +--- +- name: "Config Management for {{ target }}" + hosts: "{{ target }}" + vars_files: + - vars/global_vars.yml + roles: + + - role: roles/functionality1 + when: + - enable_functionality1|default(true) + + - role: roles/functionality2 + when: + - enable_functionality2|default(false) +``` + +N'oubliez pas d'utiliser les balises : + + +``` +- name: "Config Management for {{ target }}" + hosts: "{{ target }}" + vars_files: + - vars/global_vars.yml + roles: + + - role: roles/functionality1 + when: + - enable_functionality1|default(true) + tags: + - functionality1 + + - role: roles/functionality2 + when: + - enable_functionality2|default(false) + tags: + - functionality2 +``` + +Vous devriez obtenir quelque chose de similaire à ce qui suit : + +``` +$ tree cms +cms +├── inventories +│   └── production +│   ├── group_vars +│   │   └── plateform.yml +│   ├── hosts +│   └── host_vars +│   ├── client1.yml +│   └── client2.yml +├── roles +│   ├── functionality1 +│   │   ├── defaults +│   │   │   └── main.yml +│   │   └── tasks +│   │   └── main.yml +│   └── functionality2 +│   ├── defaults +│   │   └── main.yml +│   └── tasks +│   └── main.yml +├── site.yml +└── vars + └── global_vars.yml +``` + +!!! note "Remarque" + + Vous êtes libre d'intégrer vos rôles dans une collection + +## Tests + +Lançons le playbook pour éxécuter quelques tests : + +``` +$ ansible-playbook -i inventories/production/hosts -e "target=client1" site.yml + +PLAY [Config Management for client1] **************************************************************************** + +TASK [Gathering Facts] ****************************************************************************************** +ok: [client1] + +TASK [roles/functionality1 : Task in functionality 1] ********************************************************* +ok: [client1] => { + "msg": "You are in functionality 1" +} + +TASK [roles/functionality2 : Task in functionality 2] ********************************************************* +skipping: [client1] + +PLAY RECAP ****************************************************************************************************** +client1 : ok=2 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 +``` + +Comme vous pouvez le constater, par défaut, seulement les tâches du rôle `functionality1` seront exécutées. + +Activons dans l'inventaire `functionality2` pour notre nœud de destination et réexécutons le playbook : + +``` +$ vim inventories/production/host_vars/client1.yml +--- +enable_functionality2: true +``` + + +``` +$ ansible-playbook -i inventories/production/hosts -e "target=client1" site.yml + +PLAY [Config Management for client1] **************************************************************************** + +TASK [Gathering Facts] ****************************************************************************************** +ok: [client1] + +TASK [roles/functionality1 : Task in functionality 1] ********************************************************* +ok: [client1] => { + "msg": "You are in functionality 1" +} + +TASK [roles/functionality2 : Task in functionality 2] ********************************************************* +ok: [client1] => { + "msg": "You are in functionality 2" +} + +PLAY RECAP ****************************************************************************************************** +client1 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +Essayons de d'appliquer uniquement `functionality2` : + +``` +$ ansible-playbook -i inventories/production/hosts -e "target=client1" --tags functionality2 site.yml + +PLAY [Config Management for client1] **************************************************************************** + +TASK [Gathering Facts] ****************************************************************************************** +ok: [client1] + +TASK [roles/functionality2 : Task in functionality 2] ********************************************************* +ok: [client1] => { + "msg": "You are in functionality 2" +} + +PLAY RECAP ****************************************************************************************************** +client1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +Lançons l'inventaire complet : + +``` +$ ansible-playbook -i inventories/production/hosts -e "target=plateform" site.yml + +PLAY [Config Management for plateform] ************************************************************************** + +TASK [Gathering Facts] ****************************************************************************************** +ok: [client1] +ok: [client2] + +TASK [roles/functionality1 : Task in functionality 1] ********************************************************* +ok: [client1] => { + "msg": "You are in functionality 1" +} +ok: [client2] => { + "msg": "You are in functionality 1" +} + +TASK [roles/functionality2 : Task in functionality 2] ********************************************************* +ok: [client1] => { + "msg": "You are in functionality 2" +} +skipping: [client2] + +PLAY RECAP ****************************************************************************************************** +client1 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +client2 : ok=2 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 +``` + +Comme vous pouvez le constater, seulement le rôle `functionality2` est exécuté sur la destination `client1`. + +## Avantages + +En suivant les conseils donnés dans la documentation d'Ansible, vous allez rapidement obtenir : + +* un code source facile à gérer, même si il contient un grand nombre de rôles +* un système de conformité relativement rapide et reproductible que vous pouvez appliquer partiellement ou complètement +* peut être adapté sur une base cas par cas et pour chaque serveur +* les particularités de votre système sont séparées du code, facilement soumises à un audit et centralisées dans les fichiers d'inventaire de votre gestionnaire de configuration. From 7f1c475c0874694edf7cb9f163c43d0b770dd7dd Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:31:57 -0500 Subject: [PATCH 14/22] New translations 06-large-scale-infrastructure.md (German) --- .../06-large-scale-infrastructure.de.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/books/learning_ansible/06-large-scale-infrastructure.de.md b/docs/books/learning_ansible/06-large-scale-infrastructure.de.md index 2e90154110..e24ee49241 100644 --- a/docs/books/learning_ansible/06-large-scale-infrastructure.de.md +++ b/docs/books/learning_ansible/06-large-scale-infrastructure.de.md @@ -18,7 +18,7 @@ In diesem Kapitel erfahren Sie, wie Sie Ihr Konfigurationsmanagementsystem skali **Vorkenntnisse**: :star: :star: :star: **Schwierigkeitsgrad**: :star: :star: :star: :star: -**Lesezeit**: 30 Minuten +**Lesezeit**: 31 Minuten **** @@ -26,9 +26,9 @@ Wir haben in den vorherigen Kapiteln gesehen, wie wir unseren Code in Form von R Wie sieht es mit der Konfigurationsverwaltung aus? Wie verwaltet man die Konfiguration von zehn, Hunderten oder sogar Tausenden virtuellen Maschinen mit Ansible? -Das Aufkommen der Cloud hat die herkömmlichen Methoden ein wenig verändert. Die VM wird zum Zeitpunkt der Bereitstellung konfiguriert. Stimmt seine Konfiguration nicht mehr überein, wird es gelöscht und durch eine neue ersetzt. +Das Aufkommen der Cloud hat die herkömmlichen Methoden ein wenig verändert. Die VM wird zum Zeitpunkt der Bereitstellung konfiguriert. Stimmt die Konfiguration nicht mehr überein, wird es gelöscht und durch eine neue ersetzt. -Die in diesem Kapitel vorgestellte Konfigurationsmanagementsystem-Organisation wird auf diese beiden Arten des IT-Verbrauchs reagieren: „einmalige Nutzung“ oder regelmäßige „Neukonfiguration“ eines Pools von Servern. +The organization of the configuration management system presented in this chapter will respond to these two ways of consuming IT: "one-shot" use or regular "re-configuration" of a pool of servers. Seien Sie jedoch vorsichtig: Um die Konformität eines Serverpools mit Ansible zu gewährleisten, müssen Sie Ihre Arbeitsgewohnheiten ändern. Es ist nicht mehr möglich, die Konfiguration eines Service Managers manuell zu ändern, ohne dass diese Änderungen bei der nächsten Ausführung von Ansible überschrieben werden. @@ -68,7 +68,7 @@ Wenn der ausgewählte Knoten `hostname1` von `group1` ist, werden die in den Dat Auf diese Weise wird die Inventardatei Ihres Servers zu seiner Identitätskarte. Sie enthält alle Variablen, die von den Standardvariablen für Ihren Server abweichen. -Aus Sicht der Variablenzentralisierung ist es wichtig, die Namen ihrer Variablen in Rollen zu organisieren, indem ihnen beispielsweise der Name der Rolle vorangestellt wird. Es wird außerdem empfohlen, flache Variablennamen anstelle von Wörterbüchern zu verwenden. +Aus Sicht der Variablenzentralisierung ist es wichtig, die Namen ihrer Variablen in Rollen zu organisieren, indem ihnen beispielsweise der Name der Rolle vorangestellt wird. Es wird außerdem empfohlen, flache Variablennamen anstelle von Dictionaries zu verwenden. Wenn Sie beispielsweise den Wert `PermitRootLogin` in der Datei `sshd_config` zu einer Variablen machen möchten, könnte ein guter Variablenname `sshd_config_permitrootlogin` sein (anstelle von `sshd.config.permitrootlogin`, was auch ein guter Variablenname sein könnte). @@ -212,7 +212,7 @@ cms !!! Note - Es steht Ihnen frei, Ihre eigenen Rollen innerhalb einer Collection zu entwickeln + Es steht Ihnen frei, Ihre eigenen Rollen innerhalb einer Kollektion zu integrieren ## Tests @@ -271,7 +271,7 @@ PLAY RECAP ********************************************************************* client1 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ``` -Versuchen Sie, nur `functionality2` anzuwenden: +Lass uns versuchen, nur `functionality2` anzuwenden: ``` $ ansible-playbook -i inventories/production/hosts -e "target=client1" --tags functionality2 site.yml From f85f0ff4e734868da0c5125c6f0962e10b058b31 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:32:01 -0500 Subject: [PATCH 15/22] New translations 07-working-with-filters.md (French) --- .../07-working-with-filters.fr.md | 483 ++++++++++++++++++ 1 file changed, 483 insertions(+) create mode 100644 docs/books/learning_ansible/07-working-with-filters.fr.md diff --git a/docs/books/learning_ansible/07-working-with-filters.fr.md b/docs/books/learning_ansible/07-working-with-filters.fr.md new file mode 100644 index 0000000000..fe2b55eed6 --- /dev/null +++ b/docs/books/learning_ansible/07-working-with-filters.fr.md @@ -0,0 +1,483 @@ +--- +title: Travailler avec les Filtres +author: Antoine Le Morvan +contributors: Steven Spencer +--- + +# Ansible - Utilisation de filtres + +Dans ce chapitre vous allez apprendre comment transformer les données grâce aux filtres jinja. + +**** + +**Objectifs** : Dans ce chapitre, vous apprendrez à : + +:heavy_check_mark: Transformer les structures de données en dictionnaires ou en listes ; +:heavy_check_mark: Transformer des variables ; + +:checkered_flag: **ansible**, **jinja**, **filtres** + +**Compétences** : :star: :star: :star: +**Difficulté** : :star: :star: :star: :star: + +**Temps de lecture : **23 minutes + +**** + +Nous avons déjà eu la possibilité, dans les chapitres précédents, d'utiliser les filtres Jinja. + +Ces filtres, écrits en Python, nous permettent de manipuler et de transformer nos variables Ansible. + +!!! note "Remarque" + + Plus d'informations sont disponible [ici] (https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html). + +Tout au long de ce chapitre, nous utiliserons le playbook suivant pour tester les différents filtres présentés : + +``` +- name: Manipulating the data + hosts: localhost + gather_facts: false + vars: + zero: 0 + zero_string: "0" + non_zero: 4 + true_booleen: True + true_non_booleen: "True" + false_boolean: False + false_non_boolean: "False" + whatever: "It's false!" + user_name: antoine + my_dictionary: + key1: value1 + key2: value2 + my_simple_list: + - value_list_1 + - value_list_2 + - value_list_3 + my_simple_list_2: + - value_list_3 + - value_list_4 + - value_list_5 + my_list: + - element: element1 + value: value1 + - element: element2 + value: value2 + + tasks: + - name: Print an integer + debug: + var: zero +``` + +!!! note "Note" + + La liste ci-dessous est une liste non exhaustive de filtres que vous serez souvent amené à voir ou à utiliser. + Heureusement, il en existe plein d'autres. Vous pouvez aussi en créer vous-même ! + +Le playbook sera exécuté comme suit : + +``` +ansible-playbook play-filter.yml +``` + +## Convertir des données + +Les données peuvent être converties d'un type à un autre. + +Pour connaitre le type de données (le type d'après le langage Python), vous devez utiliser le filtre `type_debug`. + +Exemple : + +``` +- name: Display the type of a variable + debug: + var: true_boolean|type_debug +``` + +ce qui nous donne : + +``` +TASK [Display the type of a variable] ****************************************************************** +ok: [localhost] => { + "true_boolean|type_debug": "bool" +} +``` + +Il est possible de transformer un nombre entier en chaine de caractère : + +``` +- name: Transforming a variable type + debug: + var: zero|string +``` + +``` +TASK [Transforming a variable type] *************************************************************** +ok: [localhost] => { + "zero|string": "0" +} +``` + +Transformer une chaine de caractères en nombre entier : + +``` +- name: Transforming a variable type + debug: + var: zero_string|int +``` + +ou une variable en booleen : + +``` +- name: Display an integer as a boolean + debug: + var: non_zero | bool + +- name: Display a string as a boolean + debug: + var: true_non_boolean | bool + +- name: Display a string as a boolean + debug: + var: false_non_boolean | bool + +- name: Display a string as a boolean + debug: + var: whatever | bool + +``` + +Une chaine de caractères peut être changée en majuscules ou minuscules : + +``` +- name: Lowercase a string of characters + debug: + var: whatever | lower + +- name: Upercase a string of characters + debug: + var: whatever | upper +``` + +ce qui nous donne : + +``` +TASK [Lowercase a string of characters] ***************************************************** +ok: [localhost] => { + "whatever | lower": "it's false!" +} + +TASK [Upercase a string of characters] ***************************************************** +ok: [localhost] => { + "whatever | upper": "IT'S FALSE!" +} +``` + +Le filtre `replace` vous permet de remplacer des caractères par d'autres. + +Ici, nous supprimons des espaces ou même remplacons un mot : + +``` +- name: Replace a character in a string + debug: + var: whatever | replace(" ", "") + +- name: Replace a word in a string + debug: + var: whatever | replace("false", "true") +``` + +ce qui nous donne : + +``` +TASK [Replace a character in a string] ***************************************************** +ok: [localhost] => { + "whatever | replace(\" \", \"\")": "It'sfalse!" +} + +TASK [Replace a word in a string] ***************************************************** +ok: [localhost] => { + "whatever | replace(\"false\", \"true\")": "It's true !" +} +``` + +Le filtre `split` une chaîne en une liste basée sur un caractère : + +``` +- name: Cutting a string of characters + debug: + var: whatever | split(" ", "") +``` + + +``` +TASK [Cutting a string of characters] ***************************************************** +ok: [localhost] => { + "whatever | split(\" \")": [ + "It's", + "false!" + ] +} +``` + +## Joindre les éléments d'une liste + +Il est fréquent de devoir joindre les différents éléments dans une seule chaîne. Nous pouvons alors spécifier un caractère ou une chaîne à insérer entre chaque élément. + +``` +- name: Joining elements of a list + debug: + var: my_simple_list|join(",") + +- name: Joining elements of a list + debug: + var: my_simple_list|join(" | ") +``` + +ce qui nous donne : + +``` +TASK [Joining elements of a list] ***************************************************************** +ok: [localhost] => { + "my_simple_list|join(\",\")": "value_list_1,value_list_2,value_list_3" +} + +TASK [Joining elements of a list] ***************************************************************** +ok: [localhost] => { + "my_simple_list|join(\" | \")": "value_list_1 | value_list_2 | value_list_3" +} + +``` + +## Transformer des dictionnaires en listes (et vice versa) + +Les filtres `dict2items` et `itemstodict`, un peu plus complexe à implémenter, sont fréquemment utilisés, en particulier dans les boucles. + +Notez qu'il est possible de spécifier le nom de la clé et de la valeur à utiliser dans la transformation. + +``` +- name: Display a dictionary + debug: + var: my_dictionary + +- name: Transforming a dictionary into a list + debug: + var: my_dictionary | dict2items + +- name: Transforming a dictionary into a list + debug: + var: my_dictionary | dict2items(key_name='key', value_name='value') + +- name: Transforming a list into a dictionary + debug: + var: my_list | items2dict(key_name='element', value_name='value') +``` + +``` +TASK [Display a dictionary] ************************************************************************* +ok: [localhost] => { + "my_dictionary": { + "key1": "value1", + "key2": "value2" + } +} + +TASK [Transforming a dictionary into a list] ************************************************************* +ok: [localhost] => { + "my_dictionary | dict2items": [ + { + "key": "key1", + "value": "value1" + }, + { + "key": "key2", + "value": "value2" + } + ] +} + +TASK [Transforming a dictionary into a list] ************************************************************* +ok: [localhost] => { + "my_dictionary | dict2items (key_name = 'key', value_name = 'value')": [ + { + "key": "key1", + "value": "value1" + }, + { + "key": "key2", + "value": "value2" + } + ] +} + +TASK [Transforming a list into a dictionary] ************************************************************ +ok: [localhost] => { + "my_list | items2dict(key_name='element', value_name='value')": { + "element1": "value1", + "element2": "value2" + } +} +``` + +## Travailler avec des listes + +Il est possible de fusioner ou de filtrer des données à partir d'une ou plusieurs listes : + +``` +- name: Merger of two lists + debug: + var: my_simple_list | union(my_simple_list_2) +``` + +``` +ok: [localhost] => { + "my_simple_list | union(my_simple_list_2)": [ + "value_list_1", + "value_list_2", + "value_list_3", + "value_list_4", + "value_list_5" + ] +} +``` + +Pour garder uniquement l'intersection des deux listes (c'est-à-dire les éléments appartenant à la fois aux deux listes) : + +``` +- name: Merger of two lists + debug: + var: my_simple_list | intersect(my_simple_list_2) +``` + +``` +TASK [Merger of two lists] ******************************************************************************* +ok: [localhost] => { + "my_simple_list | intersect(my_simple_list_2)": [ + "value_list_3" + ] +} +``` + +Ou bien au contraire garder uniquement la différence (c'est-à-dire les éléments d'une liste n'appartenant pas à la deuxième) : + +``` +- name: Merger of two lists + debug: + var: my_simple_list | difference(my_simple_list_2) +``` + +``` +TASK [Merger of two lists] ******************************************************************************* +ok: [localhost] => { + "my_simple_list | difference(my_simple_list_2)": [ + "value_list_1", + "value_list_2", + ] +} +``` + +Si votre liste contient des valeurs multiples, vous pouvez aussi utiliser le filtre `unique` : + +``` +- name: Unique value in a list + debug: + var: my_simple_list | unique +``` + +## Transformation json/yaml + +Vous pouvez avoir à importer des données json (à partir d'une API par exemple) ou bien exporter des données au format yaml ou json. + +``` +- name: Display a variable in yaml + debug: + var: my_list | to_nice_yaml(indent=4) + +- name: Display a variable in json + debug: + var: my_list | to_nice_json(indent=4) +``` + +``` +TASK [Display a variable in yaml] ******************************************************************** +ok: [localhost] => { + "my_list | to_nice_yaml(indent=4)": "- element: element1\n value: value1\n- element: element2\n value: value2\n" +} + +TASK [Display a variable in json] ******************************************************************** +ok: [localhost] => { + "my_list | to_nice_json(indent=4)": "[\n {\n \"element\": \"element1\",\n \"value\": \"value1\"\n },\n {\n \"element\": \"element2\",\n \"value\": \"value2\"\n }\n]" +} +``` + +## Valeurs par défaut, variables en option, variables protégées + +Vous serez rapidement confronté à des erreurs dans l'exécution de vos playbooks si vous ne fournissez pas de valeurs par défaut pour vos variables ou si vous ne les protégez pas. + +La valeur d'une variable peut être remplacée par une autre si elle n'existe pas avec le filtre `default`: + +``` +- name: Default value + debug: + var: variablethatdoesnotexists | default(whatever) +``` + +``` +TASK [Default value] ******************************************************************************** +ok: [localhost] => { + "variablethatdoesnotexists | default(whatever)": "It's false!" +} +``` + +Notez la présence de l'apostrophe `'` qui doit être protégée, par exemple, si vous utilisez le module `shell`: + +``` +- name: Default value + debug: + var: variablethatdoesnotexists | default(whatever| quote) +``` + +``` +TASK [Default value] ******************************************************************************** +ok: [localhost] => { + "variablethatdoesnotexists | default(whatever|quote)": "'It'\"'\"'s false!'" +} +``` + +Enfin une variable optionnelle dans un module peut être ignorée si elle n'existe pas avec le mot clé `omit` dans le filtre `default`, ce qui vous permettra d'éviter une erreur à l'exécution. + +``` +- name: Add a new user + ansible.builtin.user: + name: "{{ user_name }}" + comment: "{{ user_comment | default(omit) }}" +``` + +## Associer une valeur en fonction d'une autre (`ternary`) + +Parfois, vous devez utiliser une condition pour assigner une valeur à une variable, auquel cas il est courant de passer par une étape `set_fact`. + +Ceci peut être évité en utilisant le filtre `ternary` : + +``` +- name: Default value + debug: + var: (user_name == 'antoine') | ternary('admin', 'normal_user') +``` + +``` +TASK [Default value] ******************************************************************************** +ok: [localhost] => { + "(user_name == 'antoine') | ternary('admin', 'normal_user')": "admin" +} +``` + +## D'autres filtres + + * `{{ 10000 | random }}` : comme son nom l'indique, produit une valeur aléatoire. + * `{{ my_simple_list | first }}` : extrait le premier élément de la liste. + * `{{ my_simple_list | length }}` : donne la longueur (d'une liste ou d'une chaîne). + * `{{ ip_list | ansible.netcommon.ipv4 }}` : n'affiche que les adresses IPv4. Without dwelling on this, if you need, there are many filters dedicated to the network. + * `{{ user_password | password_hash('sha512') }}` : génère un mot de passe haché en sha512. From 88254c94525c7173c1a2f4e512f1c11f38e393ab Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:32:02 -0500 Subject: [PATCH 16/22] New translations 07-working-with-filters.md (German) --- .../07-working-with-filters.de.md | 483 ++++++++++++++++++ 1 file changed, 483 insertions(+) create mode 100644 docs/books/learning_ansible/07-working-with-filters.de.md diff --git a/docs/books/learning_ansible/07-working-with-filters.de.md b/docs/books/learning_ansible/07-working-with-filters.de.md new file mode 100644 index 0000000000..0f6949d620 --- /dev/null +++ b/docs/books/learning_ansible/07-working-with-filters.de.md @@ -0,0 +1,483 @@ +--- +title: Arbeiten mit Filtern +author: Antoine Le Morvan +contributors: Steven Spencer, Ganna Zhyrnova +--- + +# Ansible - Arbeiten mit Filtern + +In diesem Kapitel lernen Sie, wie Sie Daten mit jinja-Filtern umwandeln. + +**** + +**Ziele**: In diesem Kapitel werden Sie Folgendes lernen: + +:heavy_check_mark: Umwandlung von Datenstrukturen als Dictionary oder Listen; +:heavy_check_mark: Umwandlung von Variablen. + +:checkered_flag: **Ansible**, **jinja**, **Filters** + +**Vorkenntnisse**: :star: :star: :star: +**Komplexität**: :star: :star: :star: :star: + +**Lesezeit**: 23 Minuten + +**** + +Wir hatten bereits die Gelegenheit, in den vorhergehenden Kapiteln die jinja-Filter zu verwenden. + +Mit diesen in Python geschriebenen Filtern können wir unsere Ansible-Variablen bearbeiten und transformieren. + +!!! note "Anmerkung" + + Weitere Informationen finden Sie [hier](https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html). + +Während dieses Kapitels werden wir das folgende Playbook verwenden, um die verschiedenen vorgestellten Filter zu testen: + +``` +- name: Manipulating the data + hosts: localhost + gather_facts: false + vars: + zero: 0 + zero_string: "0" + non_zero: 4 + true_booleen: True + true_non_booleen: "True" + false_boolean: False + false_non_boolean: "False" + whatever: "It's false!" + user_name: antoine + my_dictionary: + key1: value1 + key2: value2 + my_simple_list: + - value_list_1 + - value_list_2 + - value_list_3 + my_simple_list_2: + - value_list_3 + - value_list_4 + - value_list_5 + my_list: + - element: element1 + value: value1 + - element: element2 + value: value2 + + tasks: + - name: Print an integer + debug: + var: zero +``` + +!!! note "Anmerkung" + + Das folgende ist eine exemplarische Liste von Filtern, die Sie am ehesten begegnen oder benötigen werden. + Zum Glück gibt es viele andere. Sie könnten sogar Ihre eigene implementieren! + +Das Playbook wird wie folgt abgespielt: + +``` +ansible-playbook play-filter.yml +``` + +## Daten-Konvertierung + +Daten können von einem Typ in einen anderen umgewandelt werden. + +Um den Typ der Daten (der Typ in der Python-Sprache) zu erfahren, müssen Sie den `type_debug` Filter verwenden. + +Beispiel: + +``` +- name: Display the type of a variable + debug: + var: true_boolean|type_debug +``` + +dies ergibt: + +``` +TASK [Display the type of a variable] ****************************************************************** +ok: [localhost] => { + "true_boolean|type_debug": "bool" +} +``` + +Es ist möglich, einen Integer in einen String umzuwandeln: + +``` +- name: Transforming a variable type + debug: + var: zero|string +``` + +``` +TASK [Transforming a variable type] *************************************************************** +ok: [localhost] => { + "zero|string": "0" +} +``` + +Einen String in eine Ganzzahl umwandeln: + +``` +- name: Transforming a variable type + debug: + var: zero_string|int +``` + +oder eine Variable in Boolean: + +``` +- name: Display an integer as a boolean + debug: + var: non_zero | bool + +- name: Display a string as a boolean + debug: + var: true_non_boolean | bool + +- name: Display a string as a boolean + debug: + var: false_non_boolean | bool + +- name: Display a string as a boolean + debug: + var: whatever | bool + +``` + +Ein String kann in Groß- oder Kleinschreibung umgewandelt werden: + +``` +- name: Lowercase a string of characters + debug: + var: whatever | lower + +- name: Upercase a string of characters + debug: + var: whatever | upper +``` + +dies ergibt: + +``` +TASK [Lowercase a string of characters] ***************************************************** +ok: [localhost] => { + "whatever | lower": "it's false!" +} + +TASK [Upercase a string of characters] ***************************************************** +ok: [localhost] => { + "whatever | upper": "IT'S FALSE!" +} +``` + +Der `replace`-Filter erlaubt es Ihnen, Zeichen durch andere zu ersetzen. + +Hier entfernen wir Leerzeichen oder ersetzen sogar ein Wort: + +``` +- name: Replace a character in a string + debug: + var: whatever | replace(" ", "") + +- name: Replace a word in a string + debug: + var: whatever | replace("false", "true") +``` + +dies ergibt: + +``` +TASK [Replace a character in a string] ***************************************************** +ok: [localhost] => { + "whatever | replace(\" \", \"\")": "It'sfalse!" +} + +TASK [Replace a word in a string] ***************************************************** +ok: [localhost] => { + "whatever | replace(\"false\", \"true\")": "It's true !" +} +``` + +Der `split`-Filter teilt einen String in eine Liste basierend auf einem Zeichen auf: + +``` +- name: Cutting a string of characters + debug: + var: whatever | split(" ", "") +``` + + +``` +TASK [Cutting a string of characters] ***************************************************** +ok: [localhost] => { + "whatever | split(\" \")": [ + "It's", + "false!" + ] +} +``` + +## Die Elemente einer Liste zusammensetzen + +Häufig müssen die verschiedenen Elemente einer Liste in einem einzigen String zusammengefasst werden. Wir können dann ein Zeichen oder einen String angeben, der zwischen den Elementen eingefügt werden soll. + +``` +- name: Joining elements of a list + debug: + var: my_simple_list|join(",") + +- name: Joining elements of a list + debug: + var: my_simple_list|join(" | ") +``` + +dies ergibt: + +``` +TASK [Joining elements of a list] ***************************************************************** +ok: [localhost] => { + "my_simple_list|join(\",\")": "value_list_1,value_list_2,value_list_3" +} + +TASK [Joining elements of a list] ***************************************************************** +ok: [localhost] => { + "my_simple_list|join(\" | \")": "value_list_1 | value_list_2 | value_list_3" +} + +``` + +## Umwandlung von Dictionaries in Listen (und umgekehrt) + +Die Filter `dict2items` und `itemstodict`, etwas komplexer zu implementieren, werden häufig verwendet, besonders in Schleifen. + +Beachten Sie, dass es möglich ist, den Namen des Schlüssels und des Wertes für die Transformation anzugeben. + +``` +- name: Display a dictionary + debug: + var: my_dictionary + +- name: Transforming a dictionary into a list + debug: + var: my_dictionary | dict2items + +- name: Transforming a dictionary into a list + debug: + var: my_dictionary | dict2items(key_name='key', value_name='value') + +- name: Transforming a list into a dictionary + debug: + var: my_list | items2dict(key_name='element', value_name='value') +``` + +``` +TASK [Display a dictionary] ************************************************************************* +ok: [localhost] => { + "my_dictionary": { + "key1": "value1", + "key2": "value2" + } +} + +TASK [Transforming a dictionary into a list] ************************************************************* +ok: [localhost] => { + "my_dictionary | dict2items": [ + { + "key": "key1", + "value": "value1" + }, + { + "key": "key2", + "value": "value2" + } + ] +} + +TASK [Transforming a dictionary into a list] ************************************************************* +ok: [localhost] => { + "my_dictionary | dict2items (key_name = 'key', value_name = 'value')": [ + { + "key": "key1", + "value": "value1" + }, + { + "key": "key2", + "value": "value2" + } + ] +} + +TASK [Transforming a list into a dictionary] ************************************************************ +ok: [localhost] => { + "my_list | items2dict(key_name='element', value_name='value')": { + "element1": "value1", + "element2": "value2" + } +} +``` + +## Mit Listen arbeiten + +Es ist möglich, Daten aus einer oder mehreren Listen zusammenzuführen oder zu filtern: + +``` +- name: Merger of two lists + debug: + var: my_simple_list | union(my_simple_list_2) +``` + +``` +ok: [localhost] => { + "my_simple_list | union(my_simple_list_2)": [ + "value_list_1", + "value_list_2", + "value_list_3", + "value_list_4", + "value_list_5" + ] +} +``` + +Um nur den Durchschnitt der beiden Listen zu behalten (die Werte sind in beiden Listen vorhanden): + +``` +- name: Merger of two lists + debug: + var: my_simple_list | intersect(my_simple_list_2) +``` + +``` +TASK [Merger of two lists] ******************************************************************************* +ok: [localhost] => { + "my_simple_list | intersect(my_simple_list_2)": [ + "value_list_3" + ] +} +``` + +Oder im Gegenteil nur die Differenz (die Werte, die nicht in der zweiten Liste vorhanden sind): + +``` +- name: Merger of two lists + debug: + var: my_simple_list | difference(my_simple_list_2) +``` + +``` +TASK [Merger of two lists] ******************************************************************************* +ok: [localhost] => { + "my_simple_list | difference(my_simple_list_2)": [ + "value_list_1", + "value_list_2", + ] +} +``` + +Wenn Ihre Liste nicht eindeutige Werte enthält, ist es auch möglich, diese mit `unique` zu filtern. + +``` +- name: Unique value in a list + debug: + var: my_simple_list | unique +``` + +## Transformation json/yaml + +Möglicherweise müssen Sie json-Daten importieren (zum Beispiel von einer API), oder Daten in yaml oder json exportieren. + +``` +- name: Display a variable in yaml + debug: + var: my_list | to_nice_yaml(indent=4) + +- name: Display a variable in json + debug: + var: my_list | to_nice_json(indent=4) +``` + +``` +TASK [Display a variable in yaml] ******************************************************************** +ok: [localhost] => { + "my_list | to_nice_yaml(indent=4)": "- element: element1\n value: value1\n- element: element2\n value: value2\n" +} + +TASK [Display a variable in json] ******************************************************************** +ok: [localhost] => { + "my_list | to_nice_json(indent=4)": "[\n {\n \"element\": \"element1\",\n \"value\": \"value1\"\n },\n {\n \"element\": \"element2\",\n \"value\": \"value2\"\n }\n]" +} +``` + +## Default-Werte, optionale Variablen und Variablen schützen + +Sie werden schnell mit Fehlern bei der Ausführung Ihrer Playbooks konfrontiert, wenn Sie keine Default-Werte für Ihre Variablen angeben oder wenn Sie sie nicht schützen. + +Der Wert einer Variable kann durch eine andere ersetzt werden, wenn sie nicht mit dem Filter `default` existiert: + +``` +- name: Default value + debug: + var: variablethatdoesnotexists | default(whatever) +``` + +``` +TASK [Default value] ******************************************************************************** +ok: [localhost] => { + "variablethatdoesnotexists | default(whatever)": "It's false!" +} +``` + +Beachten Sie das Vorhandensein der Apostrophe `'` die geschützt werden sollte, zum Beispiel, wenn Sie das `shell` Modul verwenden: + +``` +- name: Default value + debug: + var: variablethatdoesnotexists | default(whatever| quote) +``` + +``` +TASK [Default value] ******************************************************************************** +ok: [localhost] => { + "variablethatdoesnotexists | default(whatever|quote)": "'It'\"'\"'s false!'" +} +``` + +Schließlich kann eine optionale Variable in einem Modul ignoriert werden, wenn sie nicht mit dem Schlüsselwort `omit` im Filter `default` vorhanden ist, was Ihnen einen Fehler bei der Laufzeit erspart. + +``` +- name: Add a new user + ansible.builtin.user: + name: "{{ user_name }}" + comment: "{{ user_comment | default(omit) }}" +``` + +## Einen Wert mit einem anderen (`ternary`) verbinden + +Manchmal müssen Sie eine Bedingung verwenden, um einer Variable einen Wert zuzuweisen, in diesem Fall ist es üblich, einen `set_fact` Schritt zu durchlaufen. + +Dies kann durch Verwendung des `ternary` Filter vermieden werden: + +``` +- name: Default value + debug: + var: (user_name == 'antoine') | ternary('admin', 'normal_user') +``` + +``` +TASK [Default value] ******************************************************************************** +ok: [localhost] => { + "(user_name == 'antoine') | ternary('admin', 'normal_user')": "admin" +} +``` + +## Einige andere Filter + + * `{{ 10000 | random }}`: Wie der Name andeutet, gibt einen zufälligen Wert an. + * `{{ my_simple_list | first }}`: Extrahiert das erste Element der Liste. + * `{{ my_simple_list | length }}`: gibt die Länge (einer Liste oder einer Zeichenkette) an. + * `{{ ip_list | ansible.netcommon.ipv4 }}`: zeigt nur IPv4-Adressen an. Ohne auf das Thema einzugehen, gibt es bei Bedarf viele Filter, die dem Netzwerk gewidmet sind. + * `{{ user_password | password_hash('sha512') }}`: generiert ein Passwort in sha512. From bbc1e87bb067ce746cf9bd9b3835c79668926052 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:32:31 -0500 Subject: [PATCH 17/22] New translations 07_rsync_unison_use.md (Chinese Simplified) --- docs/books/learning_rsync/07_rsync_unison_use.zh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/books/learning_rsync/07_rsync_unison_use.zh.md b/docs/books/learning_rsync/07_rsync_unison_use.zh.md index c0208e9c6d..f440ee7acd 100644 --- a/docs/books/learning_rsync/07_rsync_unison_use.zh.md +++ b/docs/books/learning_rsync/07_rsync_unison_use.zh.md @@ -96,7 +96,7 @@ src/unison **我们的需求是 —— Rocky Linux 8的 /dir1/ 目录自动同步到Fedora 34的 /dir2/ 目录 ;同时Fedora 34的 /dir2/ 目录自动同步到Rocky Linux 8 的 /dir1/ 目录** -### 配置Rcoky Linux 8 +### 配置 Rocky Linux 8 ```bash [root@Rocky ~]# mkdir /dir1 From 493c5f96900149c5470a775ffcab8d24ade355d5 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:32:33 -0500 Subject: [PATCH 18/22] New translations index.md (German) --- docs/books/index.de.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 docs/books/index.de.md diff --git a/docs/books/index.de.md b/docs/books/index.de.md new file mode 100644 index 0000000000..36e0caa41d --- /dev/null +++ b/docs/books/index.de.md @@ -0,0 +1,11 @@ +--- +title: Bücher +author: Steven Spencer +contributors: '@fromoz, Ganna Zhyrnova' +--- + +# Rocky Linux Schulungs-Bücher + +Sie haben den Abschnitt **Bücher** der Rocky Linux Dokumentation gefunden. Hier werden ausführliche Dokumente untergebracht. Diese Dokumente werden in Kapiteln aufgeteilt, um sie leichter abarbeiten zu können und Ihren Fortschritt verfolgen zu können. Diese Dokumente werden von Leute wie Sie verfasst, die sich für besondere Themen interessieren. + +Sie möchten es auch versuchen und selber Bücher verfassen? Großartig! Machen Sie einfach mit, Sie sind im [Mattermost Documentation Channel](https://chat.rockylinux.org/rocky-linux/channels/documentation) willkommen. From 8d40fb9be7d4f88461f958638e276472f40f5257 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:36:44 -0500 Subject: [PATCH 19/22] New translations 8_6_installation.md (Ukrainian) --- docs/guides/8_6_installation.uk.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/8_6_installation.uk.md b/docs/guides/8_6_installation.uk.md index 872bcba799..6a685bf1c4 100644 --- a/docs/guides/8_6_installation.uk.md +++ b/docs/guides/8_6_installation.uk.md @@ -101,7 +101,7 @@ Rocky-8.9-x86_64-minimal.iso: OK Цей розділ використовується для налаштування елементів, пов’язаних із системою. Це включає – клавіатуру, підтримку мови, час і дату. -#### Клавіатура +#### Keyboard У нашій демонстраційній системі в цьому посібнику ми приймаємо значення за умовчанням (*English US*) і не вносимо жодних змін. From ef1f6f59a41234bb51498bd2033b5ece30fa9ee2 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:39:24 -0500 Subject: [PATCH 20/22] New translations 9_2.md (Chinese Simplified) --- docs/release_notes/9_2.zh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release_notes/9_2.zh.md b/docs/release_notes/9_2.zh.md index eaed325286..f59d81ca2e 100644 --- a/docs/release_notes/9_2.zh.md +++ b/docs/release_notes/9_2.zh.md @@ -144,7 +144,7 @@ Vagrant 镜像可用于 x86_64 和 arch64,容器镜像可用于所有 4 arches 有关此类别更改的详细清单,请参阅 [此处的上游链接](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/9.2_release_notes/new-features#new-features-compilers-and-development-tools)。 -#### 更新的系统工具链 +#### 更新了的系统工具链 更新了以下系统工具链组件: From e1842afc4ad73a14cdb19240de7c08f6f49409f0 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:39:29 -0500 Subject: [PATCH 21/22] New translations index.md (French) --- docs/books/nvchad/plugins/index.fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/books/nvchad/plugins/index.fr.md b/docs/books/nvchad/plugins/index.fr.md index e56d2352cc..79984aec96 100644 --- a/docs/books/nvchad/plugins/index.fr.md +++ b/docs/books/nvchad/plugins/index.fr.md @@ -5,7 +5,7 @@ contributors: Steven Spencer, Ganna Zhyrnova tested_with: 8.7, 9.1 tags: - nvchad - - extensions + - plugiciels - éditeur --- From a9fda0ac706351dc57a8911a230c07adbcb3f94e Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:40:30 -0500 Subject: [PATCH 22/22] New translations 9_3.md (Chinese Simplified) --- docs/release_notes/9_3.zh.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/release_notes/9_3.zh.md b/docs/release_notes/9_3.zh.md index faae7a2fc6..65bbaf5737 100644 --- a/docs/release_notes/9_3.zh.md +++ b/docs/release_notes/9_3.zh.md @@ -8,11 +8,11 @@ tags: # Rocky Linux 9.3 发布说明 -您可以在 [此处的上游发布说明](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/9.3_release_notes/index) 中找到大多数变更的完整清单 +您可以在 [此处的上游发布说明](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/9.3_release_notes/index) 中找到大多数变更的完整清单。 ## 系统升级 -您可以通过执行 `sudo dnf -y upgrade` 来完成从 Rocky Linux 9.x 到 Rocky Linux 9.3 的升级 +您可以通过执行 `sudo dnf -y upgrade` 来完成从 Rocky Linux 9.x 到 Rocky Linux 9.3 的升级。 !!! note "说明"