Einführung
In diesem Lab lernen Sie grundlegende Techniken zur Verwaltung von Variablen, Fakten und Geheimnissen innerhalb von Ansible-Playbooks auf einem Red Hat Enterprise Linux (RHEL)-System kennen. Sie werden erforschen, wie Sie Ihre Automatisierung flexibler und leistungsfähiger gestalten können, indem Sie Playbook-Variablen verwenden, Systeminformationen mit integrierten und benutzerdefinierten Ansible-Fakten sammeln und sensible Daten wie Passwörter mit Ansible Vault schützen.
Durch eine Reihe praktischer Schritte erstellen Sie ein Playbook zur Bereitstellung und Konfiguration eines Apache-Webservers. Sie beginnen mit der Definition einfacher Variablen für den Paketnamen und die Webinhalte, nutzen dann benutzerdefinierte Fakten, um die Konfiguration des Webservers dynamisch zu aktualisieren. Abschließend verwenden Sie Ansible Vault, um sicher einen neuen Systembenutzer mit einem verschlüsselten Passwort zu erstellen, führen das vollständige Playbook aus und überprüfen, ob alle Konfigurationen erfolgreich angewendet wurden.
Playbook-Variablen definieren und zur Bereitstellung eines Apache-Webservers verwenden
In diesem Schritt lernen Sie, wie Sie Variablen in einem Ansible-Playbook verwenden. Variablen sind entscheidend, um Ihre Automatisierung flexibel, wiederverwendbar sowie leichter lesbar und wartbar zu machen. Anstatt Werte wie Paketnamen oder Dateipfade direkt in Ihre Aufgaben (Tasks) fest zu kodieren, können Sie diese als Variablen definieren und im gesamten Playbook referenzieren. Wir erstellen ein einfaches Playbook, das Variablen verwendet, um den Apache-Webserver (httpd) zu installieren und eine grundlegende Webseite bereitzustellen.
In das Projektverzeichnis navigieren
Stellen Sie zunächst sicher, dass Sie sich im richtigen Arbeitsverzeichnis befinden. Ihre gesamte Arbeit für dieses Lab erfolgt im Verzeichnis
~/project, das bereits für Sie erstellt wurde.cd ~/projectInstallieren Sie das Paket
ansible-core.sudo dnf install -y ansible-coreDas Ansible-Playbook erstellen
Lassen Sie uns nun unsere Playbook-Datei erstellen. Wir nennen sie
playbook.yml. Sie können einen Befehlszeilen-Texteditor wienanoverwenden, um die Datei zu erstellen und zu bearbeiten.nano playbook.ymlDieser Befehl öffnet eine leere Datei im
nano-Editor. Fügen Sie nun den ersten Teil des Playbooks hinzu. Dieser Abschnitt definiert den Namen des Plays, den Ziel-Host (localhost, da wir es auf derselben Maschine ausführen) und einenvars-Abschnitt, in dem wir unsere Variablen definieren.--- - name: Deploy Apache using variables hosts: localhost become: true vars: web_pkg: httpd web_content: "Hello from Ansible Variables"Hier ist eine Aufschlüsselung der Playbook-Struktur:
hosts: localhost: Gibt an, dass das Playbook auf der lokalen Maschine ausgeführt werden soll.become: true: Weist Ansible an, eine Privilegieneskalation (entsprichtsudo) für die Aufgaben zu verwenden, was für die Installation von Software erforderlich ist.vars: Dies ist ein Dictionary, in dem wir unsere Schlüssel-Wert-Paare für Variablen definieren. Wir habenweb_pkgfür den Paketnamen undweb_contentfür den Inhalt unserer Test-Webseite definiert.
Aufgaben zum Playbook hinzufügen
Fügen Sie als Nächstes unterhalb des
vars-Abschnitts dietaskshinzu, die diese Variablen verwenden werden. Die erste Aufgabe installiert das Apache-Paket, und die zweite erstellt eineindex.html-Datei. Fügen Sie den folgendentasks-Block zu Ihrerplaybook.yml-Datei hinzu, während Sie sich noch imnano-Editor befinden.tasks: - name: Install the latest version of Apache ansible.builtin.dnf: name: "{{ web_pkg }}" state: latest - name: Create a basic index.html file ansible.builtin.copy: content: "{{ web_content }}" dest: /var/www/html/index.htmlBeachten Sie, wie wir
{{ variable_name }}verwenden, um auf die zuvor definierten Variablen zu verweisen. Dies ist Jinja2-Templating, das Ansible für Variablen verwendet. Dies macht die Aufgabendefinitionen generisch; wenn Sie stattdessen Nginx installieren wollten, müssten Sie nur die Variableweb_pkgändern, nicht die Aufgabe selbst.Das Playbook überprüfen und speichern
Ihre vollständige
playbook.yml-Datei sollte nun wie folgt aussehen. Überprüfen Sie den Inhalt und die Einrückung, da YAML sehr empfindlich auf Abstände reagiert.--- - name: Deploy Apache using variables hosts: localhost become: true vars: web_pkg: httpd web_content: "Hello from Ansible Variables" tasks: - name: Install the latest version of Apache ansible.builtin.dnf: name: "{{ web_pkg }}" state: latest - name: Create a basic index.html file ansible.builtin.copy: content: "{{ web_content }}" dest: /var/www/html/index.htmlUm die Datei in
nanozu speichern, drücken SieCtrl+X, dannY, um die Änderungen zu bestätigen, und schließlichEnter, um die Datei unter dem Namenplaybook.ymlzu schreiben.Die Playbook-Syntax überprüfen
Bevor Sie ein Playbook ausführen, ist es immer eine gute Praxis, dessen Syntax auf Fehler zu prüfen.
ansible-playbook --syntax-check playbook.ymlWenn die Syntax korrekt ist, sehen Sie den Dateipfad des Playbooks als Ausgabe, was bestätigt, dass es gültig ist:
playbook: playbook.ymlFalls Sie Fehler sehen, öffnen Sie die Datei erneut mit
nano playbook.ymlund beheben Sie diese. Achten Sie besonders auf die korrekte Einrückung (normalerweise zwei Leerzeichen).Das Playbook ausführen
Führen Sie nun das Playbook aus. Ansible verbindet sich mit
localhost, liest die Variablen und führt die Aufgaben aus.ansible-playbook playbook.ymlSie sollten eine Ausgabe sehen, die die erfolgreiche Ausführung jeder Aufgabe anzeigt. Der Status
changedbedeutet, dass Ansible eine Änderung am System vorgenommen hat, wie z. B. die Installation eines Pakets oder das Erstellen einer Datei.PLAY [Deploy Apache using variables] ******************************************* TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Install the latest version of Apache] ************************************ changed: [localhost] TASK [Create a basic index.html file] ****************************************** changed: [localhost] PLAY RECAP ********************************************************************* localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0Wenn Sie das Playbook ein zweites Mal ausführen, sollten die Aufgaben
okanstelle vonchangedmelden, da das Paket bereits installiert ist und die Datei bereits den korrekten Inhalt hat. Dies demonstriert die Idempotenz von Ansible.Die Konfiguration manuell überprüfen
Obwohl das Playbook abgeschlossen ist, können Sie manuell überprüfen, ob die Aufgaben wie erwartet funktioniert haben. Überprüfen Sie zunächst, ob das Paket
httpdinstalliert wurde:rpm -q httpdDie Ausgabe sollte den Paketnamen und die Version anzeigen:
httpd-2.4.57-7.el9.x86_64Überprüfen Sie als Nächstes den Inhalt der Datei
index.html:cat /var/www/html/index.htmlDie Ausgabe sollte mit dem Wert Ihrer
web_content-Variable übereinstimmen:Hello from Ansible VariablesSie haben erfolgreich Variablen in einem Ansible-Playbook verwendet, um ein System zu konfigurieren.
Systeminformationen mit Ansible Facts anzeigen
In diesem Schritt erkunden Sie Ansible Facts. Facts sind Informationen, die Ansible über die von ihm verwalteten Systeme (in diesem Fall localhost) sammelt. Diese Informationen umfassen Details wie das Betriebssystem, Netzwerkschnittstellen, Arbeitsspeicher und vieles mehr. Standardmäßig sammelt Ansible Facts zu Beginn jedes Plays und stellt sie in einer speziellen Variable namens ansible_facts zur Verfügung. Die Verwendung von Facts ermöglicht es Ihnen, dynamische Playbooks zu erstellen, die sich an die Umgebung anpassen, in der sie ausgeführt werden.
In das Projektverzeichnis navigieren
Stellen Sie zunächst sicher, dass Sie sich im Verzeichnis
~/projectbefinden, in dem Sie das neue Playbook erstellen werden.cd ~/projectEin Playbook zum Anzeigen aller Facts erstellen
Beginnen wir mit der Erstellung eines Playbooks, das einfach alle Facts anzeigt, die Ansible über Ihr System sammeln kann. Dies gibt Ihnen eine Vorstellung von der enormen Menge an verfügbaren Informationen. Verwenden Sie
nano, um eine neue Datei namensdisplay_facts.ymlzu erstellen.nano display_facts.ymlFügen Sie im
nano-Editor den folgenden Inhalt hinzu. Dieses Playbook zielt auflocalhostab und verwendet das Modulansible.builtin.debug, um den Inhalt der Variableansible_factsauszugeben.--- - name: Display all Ansible facts hosts: localhost tasks: - name: Print all available facts ansible.builtin.debug: var: ansible_factsSpeichern Sie die Datei und beenden Sie
nanodurch Drücken vonCtrl+X, dannYundEnter.Das Playbook ausführen
Führen Sie nun das Playbook aus, um das Ergebnis zu sehen.
ansible-playbook display_facts.ymlDie Ausgabe wird sehr lang sein, da Ansible viele Daten sammelt. Es wird eine große JSON-Struktur sein, die alle Systemdetails enthält. Dies ist zu erwarten.
PLAY [Display all Ansible facts] *********************************************** TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Print all available facts] *********************************************** ok: [localhost] => { "ansible_facts": { "ansible_all_ipv4_addresses": [ "172.17.0.2" ], "ansible_all_ipv6_addresses": [ "fe80::42:acff:fe11:2" ], "ansible_apparmor": { "status": "disabled" }, "ansible_architecture": "x86_64", "ansible_bios_date": "01/01/2011", "ansible_bios_version": "1.0", "ansible_cmdline": { "BOOT_IMAGE": "/boot/vmlinuz-5.14.0-427.16.1.el9_4.x86_64", "root": "UUID=...", "ro": true }, "ansible_date_time": { "date": "2024-05-21", "day": "21", "epoch": "1716298855", ... }, "ansible_distribution": "RedHat", "ansible_distribution_major_version": "9", "ansible_distribution_version": "9.4", ... } } PLAY RECAP ********************************************************************* localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0Ein Playbook zum Anzeigen spezifischer Facts erstellen
Das Anzeigen aller Facts ist nützlich für die Erkundung, aber in den meisten Fällen benötigen Sie nur bestimmte Informationen. Lassen Sie uns ein weiteres Playbook,
display_specific_facts.yml, erstellen, um eine formatierte Nachricht mit nur wenigen Schlüsselfakten anzuzeigen.nano display_specific_facts.ymlFügen Sie den folgenden Inhalt hinzu. Dieses Playbook verwendet den Parameter
msgdesdebug-Moduls, um eine benutzerdefinierte Zeichenfolge auszugeben. Wir greifen auf einzelne Facts mithilfe der Klammernotation zu, wieansible_facts['distribution'].--- - name: Display specific Ansible facts hosts: localhost tasks: - name: Print a summary of system facts ansible.builtin.debug: msg: > The operating system is {{ ansible_facts['distribution'] }} version {{ ansible_facts['distribution_major_version'] }}. It has {{ ansible_facts['processor_cores'] }} processor cores and {{ ansible_facts['memtotal_mb'] }} MB of total memory.Das Zeichen
>inmsg: >ist ein YAML-Feature, das es Ihnen ermöglicht, eine mehrzeilige Zeichenfolge sauberer zu schreiben. Speichern Sie die Datei und beenden Sienano.Das Playbook für spezifische Facts ausführen
Führen Sie nun dieses neue Playbook aus.
ansible-playbook display_specific_facts.ymlDie Ausgabe wird viel sauberer und lesbarer sein und nur die von Ihnen angeforderten Informationen anzeigen.
PLAY [Display specific Ansible facts] ****************************************** TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Print a summary of system facts] ***************************************** ok: [localhost] => { "msg": "The operating system is RedHat version 9. It has 2 processor cores and 3925 MB of total memory." } PLAY RECAP ********************************************************************* localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0Dies zeigt, wie Sie Ansible Facts nutzen können, um Ihre Playbooks auf die Umgebung aufmerksam zu machen, in der sie ausgeführt werden, was eine intelligentere und bedingte Automatisierung ermöglicht.
Webserver mit benutzerdefinierten Fakten vom verwalteten Host konfigurieren
In diesem Schritt lernen Sie, wie Sie benutzerdefinierte Fakten (Custom Facts) verwenden. Während Ansible automatisch eine breite Palette von Standard-Facts sammelt, können Sie auch Ihre eigenen definieren. Diese werden als "lokale Fakten" oder "benutzerdefinierte Fakten" bezeichnet. Dies ist ein leistungsstarkes Feature, das es Ihnen ermöglicht, spezifische Informationen von einem verwalteten Host an Ihre Playbooks zu übermitteln, wie z. B. Anwendungseinstellungen oder hardwarespezifische Daten, die Ansible nicht standardmäßig sammelt.
Ansible sucht auf dem verwalteten Host im Verzeichnis /etc/ansible/facts.d nach benutzerdefinierten Fakten. Jede Datei in diesem Verzeichnis mit der Endung .fact wird verarbeitet. Diese Dateien können einfache Textdateien im INI-Stil oder JSON-Dateien sein.
Das Verzeichnis für benutzerdefinierte Fakten erstellen
Zuerst müssen Sie das Verzeichnis erstellen, in dem Ansible nach benutzerdefinierten Faktendateien sucht. Da es sich um ein Systemverzeichnis handelt, müssen Sie
sudoverwenden, um es zu erstellen.sudo mkdir -p /etc/ansible/facts.dDas Flag
-pstellt sicher, dass der Befehl keinen Fehler zurückgibt, falls das Verzeichnis bereits existiert.Eine benutzerdefinierte Faktendatei erstellen
Lassen Sie uns nun eine benutzerdefinierte Faktendatei erstellen, um eine Willkommensnachricht für unseren Webserver zu definieren. Wir erstellen eine Datei im INI-Format namens
web_config.factim Verzeichnis/etc/ansible/facts.d.sudo nano /etc/ansible/facts.d/web_config.factFügen Sie den folgenden Inhalt zur Datei hinzu. Dies definiert einen Abschnitt
[webserver]mit einem Schlüsselwelcome_message.[webserver] welcome_message = Welcome to the server configured by Custom Facts!Speichern Sie die Datei und beenden Sie
nanodurch Drücken vonCtrl+X, dannYundEnter.Ein Playbook zur Verwendung des benutzerdefinierten Fakts erstellen
Mit dem benutzerdefinierten Fakt an Ort und Stelle können wir nun ein Playbook erstellen, das diesen Fakt liest und ihn zur Konfiguration der Startseite unseres Webservers verwendet. Erstellen Sie in Ihrem Verzeichnis
~/projectein neues Playbook namensconfigure_web.yml.cd ~/project nano configure_web.ymlFügen Sie den folgenden Inhalt zum Playbook hinzu. Dieses Playbook aktualisiert die Datei
/var/www/html/index.htmlmit der Nachricht, die in unserem benutzerdefinierten Fakt definiert ist.--- - name: Configure web server using custom facts hosts: localhost become: true tasks: - name: Update index.html with custom message ansible.builtin.copy: content: "{{ ansible_facts.ansible_local.web_config.webserver.welcome_message }}" dest: /var/www/html/index.htmlLassen Sie uns die Variable
{{ ansible_facts.ansible_local.web_config.webserver.welcome_message }}aufschlüsseln:ansible_facts: Das Root-Dictionary für alle Fakten.ansible_local: Der Schlüssel, unter dem alle benutzerdefinierten Fakten gespeichert sind.web_config: Der Name unserer Faktendatei (web_config.fact), ohne die Erweiterung.webserver: Der Abschnittsname[webserver]aus unserer INI-Datei.welcome_message: Der Schlüssel für den Wert, den wir verwenden möchten.
Speichern Sie die Datei und beenden Sie
nano.Das Konfigurations-Playbook ausführen
Führen Sie nun das Playbook aus, um die Konfiguration anzuwenden.
ansible-playbook configure_web.ymlDie Ausgabe sollte zeigen, dass die
copy-Aufgabe die Dateiindex.htmlchangedhat.PLAY [Configure web server using custom facts] ********************************* TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Update index.html with custom message] *********************************** changed: [localhost] PLAY RECAP ********************************************************************* localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0Das Ergebnis überprüfen
Überprüfen wir abschließend, ob die Webseite korrekt aktualisiert wurde. Verwenden Sie den Befehl
cat, um den Inhalt der Dateiindex.htmlanzuzeigen.cat /var/www/html/index.htmlDie Ausgabe sollte nun die Nachricht aus Ihrer benutzerdefinierten Faktendatei anzeigen:
Welcome to the server configured by Custom Facts!Sie haben erfolgreich einen benutzerdefinierten Fakt auf dem verwalteten Host erstellt und ihn innerhalb eines Playbooks verwendet, um einen Dienst dynamisch zu konfigurieren. Diese Technik ist unglaublich nützlich, um Ihre Automatisierung flexibler und datengesteuerter zu gestalten.
Einen Systembenutzer mit verschlüsselten Variablen mittels Ansible Vault erstellen
In diesem Schritt lernen Sie, wie Sie sensible Daten wie Passwörter oder API-Schlüssel mit Ansible Vault verwalten. Das Speichern sensibler Informationen im Klartext innerhalb Ihrer Playbooks stellt ein großes Sicherheitsrisiko dar. Ansible Vault bietet eine Möglichkeit, Dateien oder einzelne Variablen zu verschlüsseln und Ihre Geheimnisse sicher aufzubewahren. Sie können diese verschlüsselten Dateien dann in Ihren Playbooks verwenden, und Ansible entschlüsselt sie zur Laufzeit, wenn Sie das korrekte Passwort angeben.
Wir erstellen eine verschlüsselte Datei, die einen Benutzernamen und ein gehashtes Passwort enthält, und verwenden dann ein Playbook, um einen neuen Systembenutzer mit diesen Anmeldeinformationen zu erstellen.
In das Projektverzeichnis navigieren
Stellen Sie sicher, dass Sie sich für diese Aufgabe im Verzeichnis
~/projectbefinden.cd ~/projectEine verschlüsselte Vault-Datei erstellen
Wir verwenden den Befehl
ansible-vault create, um eine neue, verschlüsselte YAML-Datei namenssecrets.ymlzu erstellen. Dieser Befehl fordert Sie auf, ein Passwort für den Vault zu erstellen. Dieses Passwort ist erforderlich, um die Datei später zu öffnen, zu bearbeiten oder zu verwenden.Lassen Sie uns zunächst den Editor auf
nanosetzen, um die Arbeit zu erleichtern:export EDITOR=nanoErstellen Sie nun die Vault-Datei:
ansible-vault create secrets.ymlGeben Sie bei Aufforderung ein Passwort für Ihren Vault ein. Verwenden wir für dieses Lab
labexals Vault-Passwort, um es einfach zu halten. Sie müssen es zweimal eingeben.New Vault password: Confirm New Vault password:Nachdem Sie das Passwort bestätigt haben, öffnet der Befehl die Datei
secrets.ymlim Texteditornano.Geheime Variablen zur Vault-Datei hinzufügen
Fügen Sie im
nano-Editor, der nun die verschlüsselte Dateisecrets.ymlbearbeitet, die folgenden Variablen hinzu. Wir definieren einen Benutzernamen und ein vor-gehashtes Passwort für einen neuen Benutzer. Die Verwendung eines gehashten Passworts ist wesentlich sicherer als das Speichern eines Passworts im Klartext.username: myappuser pwhash: $6$mysalt$QwMzWSEyCAGmz7tzVrAi5o.8k4d05i2QsfGGwmPtlJsWhGjSjCW6yFCH/OEqEsHk7GMSxqYNXu5sshxPmWyxo0username: Der Name des Systembenutzers, den wir erstellen möchten.pwhash: Ein sicher gehashtes Passwort. Dieser spezifische Hash entspricht dem PasswortAnsibleUserP@ssw0rdund liegt in einem Format vor, das das Modulansible.builtin.userversteht.
Speichern Sie die Datei und beenden Sie
nano(Ctrl+X, dannY, dannEnter). Die Dateisecrets.ymlin Ihrem Verzeichnis~/projectist nun verschlüsselt. Wenn Sie versuchen, sie mitcat secrets.ymlanzuzeigen, sehen Sie nur verschlüsselten Text.Ein Playbook zur Verwendung der Vault-Datei erstellen
Erstellen Sie nun ein neues Playbook namens
create_user.yml, das die Variablen aus Ihrer verschlüsseltensecrets.yml-Datei verwendet.nano create_user.ymlFügen Sie den folgenden Inhalt hinzu. Die Anweisung
vars_filesweist Ansible an, Variablen aus der angegebenen Datei zu laden.--- - name: Create a user from secret variables hosts: localhost become: true vars_files: - secrets.yml tasks: - name: Create the {{ username }} user ansible.builtin.user: name: "{{ username }}" password: "{{ pwhash }}" state: presentDieses Playbook erstellt einen Benutzer mit dem Namen und dem Passwort-Hash, die in
secrets.ymldefiniert sind. Speichern Sie die Datei und beenden Sienano.Das Playbook mit dem Vault-Passwort ausführen
Um ein Playbook auszuführen, das eine Vault-Datei verwendet, müssen Sie das Vault-Passwort angeben. Sie können dies interaktiv mit dem Flag
--ask-vault-passtun.ansible-playbook --ask-vault-pass create_user.ymlAnsible wird Sie nach dem Vault-Passwort fragen. Geben Sie
labexein (das Passwort, das Sie in Schritt 2 festgelegt haben).Vault password:Nachdem Sie das korrekte Passwort angegeben haben, entschlüsselt Ansible die Datei im Speicher und führt das Playbook aus. Sie sollten die folgende Ausgabe sehen, die anzeigt, dass der Benutzer erstellt wurde.
PLAY [Create a user from secret variables] ************************************* TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Create the myappuser user] *********************************************** changed: [localhost] PLAY RECAP ********************************************************************* localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0Überprüfen, ob der Benutzer erstellt wurde
Sie können bestätigen, dass der
myappusererfolgreich auf dem System erstellt wurde, indem Sie den Befehlidverwenden.id myappuserWenn der Benutzer existiert, sehen Sie seine Benutzer-ID (uid) und Gruppen-ID (gid)-Informationen.
uid=1002(myappuser) gid=1002(myappuser) groups=1002(myappuser)Dies bestätigt, dass Sie Ansible Vault erfolgreich zur Verwaltung sensibler Daten für Ihre Automatisierungsaufgaben eingesetzt haben.
Ein Playbook mit einer Vault-Passwortdatei ausführen, um Konfigurationen anzuwenden
In diesem Schritt lernen Sie eine automatisiertere Methode kennen, um das Vault-Passwort an Ansible zu übermitteln. Im vorherigen Schritt haben Sie --ask-vault-pass verwendet, um das Passwort interaktiv einzugeben. Obwohl dies sicher ist, ist es für automatisierte Umgebungen wie CI/CD-Pipelines, in denen kein Benutzer anwesend ist, um ein Passwort einzugeben, nicht geeignet.
Die Lösung besteht darin, eine Vault-Passwortdatei zu verwenden. Dies ist eine einfache Textdatei, die das Vault-Passwort enthält. Sie können dann beim Ausführen Ihres Playbooks auf diese Datei verweisen, und Ansible liest das Passwort automatisch daraus. Aus Sicherheitsgründen ist es entscheidend, die Berechtigungen dieser Passwortdatei so einzuschränken, dass nur autorisierte Benutzer sie lesen können.
In das Projektverzeichnis navigieren
Stellen Sie sicher, dass Sie sich im Verzeichnis
~/projectbefinden, in dem sich Ihr Playbook und Ihre Vault-Datei befinden.cd ~/projectDie Vault-Passwortdatei erstellen
Lassen Sie uns eine Datei erstellen, um unser Vault-Passwort zu speichern. Wir nennen sie
vault_pass.txt. Wir können den Befehlechoverwenden, um die Datei zu erstellen und das Passwort (labex) in einem einzigen Schritt hineinzuschreiben.echo "labex" > vault_pass.txtSie können den Inhalt der Datei mit
catüberprüfen:cat vault_pass.txtDie Ausgabe sollte sein:
labexDie Passwortdatei sichern
Das Speichern eines Passworts in einer Klartextdatei ist riskant. Sie müssen die Dateiberechtigungen einschränken, um sie zu schützen. Der Befehl
chmodermöglicht es Ihnen, Dateiberechtigungen zu ändern. Wir setzen die Berechtigungen auf600, was bedeutet, dass nur der Dateieigentümer (in diesem Fall der Benutzerlabex) Lese- und Schreibberechtigungen hat. Kein anderer Benutzer auf dem System kann darauf zugreifen.chmod 600 vault_pass.txtSie können die neuen Berechtigungen mit dem Befehl
ls -lüberprüfen:ls -l vault_pass.txtDie Ausgabe sollte mit
-rw-------beginnen, was die eingeschränkten Berechtigungen bestätigt.-rw-------. 1 labex labex 6 May 21 14:30 vault_pass.txtDas Playbook ändern, um einen Benutzer zu einer Gruppe hinzuzufügen
Lassen Sie uns unser Playbook
create_user.ymländern, um eine zusätzliche Aktion auszuführen. Wir fügen denmyappuserzur Gruppewheelhinzu, was auf vielen Systemen administrative (sudo) Privilegien gewährt. Dies demonstriert die Ausführung eines Playbooks, das eine Änderung an einer bestehenden Konfiguration vornimmt.Öffnen Sie zunächst das Playbook
create_user.ymlzur Bearbeitung.nano create_user.ymlÄndern Sie die Aufgabe
ansible.builtin.user, um die Parametergroupsundappendeinzubeziehen.--- - name: Create a user from secret variables hosts: localhost become: true vars_files: - secrets.yml tasks: - name: Create the {{ username }} user and add to wheel group ansible.builtin.user: name: "{{ username }}" password: "{{ pwhash }}" state: present groups: wheel append: truegroups: wheel: Gibt die Gruppe an, zu der der Benutzer hinzugefügt werden soll.append: true: Stellt sicher, dass der Benutzer zu dieser Gruppe hinzugefügt wird, ohne ihn aus anderen Gruppen zu entfernen, denen er möglicherweise angehört.
Speichern Sie die Datei und beenden Sie
nano.Das Playbook mit der Vault-Passwortdatei ausführen
Führen Sie nun das Playbook erneut aus. Verwenden Sie diesmal anstelle von
--ask-vault-passdie Option--vault-password-file(oder ihren kürzeren Alias--vault-pass-file), um den Pfad zu Ihrer Passwortdatei anzugeben.ansible-playbook --vault-password-file vault_pass.txt create_user.ymlAnsible wird nun ausgeführt, ohne nach einem Passwort zu fragen, da es dieses direkt aus
vault_pass.txtliest. Sie sollten eine Ausgabe sehen, die anzeigt, dass die Konfiguration des Benutzers geändert wurde.PLAY [Create a user from secret variables] ************************************* TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Create the myappuser user and add to wheel group] ************************ changed: [localhost] PLAY RECAP ********************************************************************* localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0Der Status
changedbestätigt, dass Ansible den Benutzer durch Hinzufügen zur Gruppewheelmodifiziert hat.Die Gruppenzugehörigkeit des Benutzers überprüfen
Überprüfen Sie abschließend, ob
myappusernun Mitglied der Gruppewheelist. Sie können dies mit dem Befehlgroupstun.groups myappuserDie Ausgabe sollte sowohl die primäre Gruppe des Benutzers (
myappuser) als auch die Gruppewheelanzeigen.myappuser : myappuser wheelSie haben erfolgreich eine Vault-Passwortdatei verwendet, um ein Playbook nicht-interaktiv auszuführen – eine Schlüsselkompetenz für die Automatisierung sicherer Workflows.
Webserver- und Benutzerkonfiguration überprüfen
In diesem letzten Schritt festigen Sie Ihr Wissen, indem Sie ein dediziertes Verifizierungs-Playbook erstellen. Bisher haben Sie die Ergebnisse Ihrer Playbooks manuell mit Standard-Linux-Befehlen wie cat, id und groups überprüft. Ein leistungsfähigerer und wiederholbarer Ansatz ist die Verwendung von Ansible selbst, um den Zustand Ihres Systems zu prüfen und zu validieren.
Dieses Playbook fungiert als Testsuite, die programmatisch überprüft, ob der Webserver installiert ist, die Webseite den korrekten Inhalt hat und der Systembenutzer mit der richtigen Gruppenzugehörigkeit existiert. Dies demonstriert, wie Ansible nicht nur für das Konfigurationsmanagement, sondern auch für Compliance und Zustandsvalidierung verwendet werden kann.
In das Projektverzeichnis navigieren
Stellen Sie zunächst sicher, dass Sie sich im Verzeichnis
~/projectbefinden.cd ~/projectDas Verifizierungs-Playbook erstellen
Lassen Sie uns ein neues Playbook namens
verify_config.ymlerstellen. Dieses Playbook enthält eine Reihe von Aufgaben, die die Konfigurationen überprüfen, die Sie in den vorherigen Schritten angewendet haben.nano verify_config.ymlAufgaben zur Überprüfung der Konfiguration hinzufügen
Fügen Sie im
nano-Editor den folgenden Inhalt hinzu. Wir bauen dieses Playbook mit mehreren Aufgaben auf, von denen jede darauf ausgelegt ist, sicherzustellen, dass eine bestimmte Bedingung wahr ist. Wenn eine Zusicherung (Assertion) fehlschlägt, stoppt das Playbook und meldet einen Fehler, der Ihnen sofort mitteilt, was falsch ist.--- - name: Verify system configuration hosts: localhost become: true tasks: - name: Check if httpd package is installed ansible.builtin.dnf: list: httpd register: httpd_pkg_info - name: Assert that httpd is installed ansible.builtin.assert: that: - httpd_pkg_info.results | length > 0 fail_msg: "Apache (httpd) package is not installed." success_msg: "Apache (httpd) package is installed." - name: Read the content of the index.html file ansible.builtin.slurp: src: /var/www/html/index.html register: index_file - name: Assert that the web page content is correct ansible.builtin.assert: that: - "'Custom Facts' in (index_file.content | b64decode)" fail_msg: "Web page content is incorrect." success_msg: "Web page content is correct." - name: Check if myappuser exists ansible.builtin.getent: database: passwd key: myappuser register: user_info - name: Assert that myappuser exists ansible.builtin.assert: that: - user_info.ansible_facts.getent_passwd['myappuser'] is defined fail_msg: "User 'myappuser' does not exist." success_msg: "User 'myappuser' exists." - name: Query the wheel group members ansible.builtin.getent: database: group key: wheel register: wheel_group_info - name: Assert that myappuser is in the wheel group ansible.builtin.assert: that: - "'myappuser' in (wheel_group_info.ansible_facts.getent_group['wheel'][2] | default('') | split(','))" fail_msg: "User 'myappuser' is not in the wheel group." success_msg: "User 'myappuser' is in the wheel group."Lassen Sie uns die hier verwendeten Schlüsselmodule überprüfen:
ansible.builtin.dnfmitlist: Dies prüft auf ein Paket undregistert das Ergebnis.ansible.builtin.slurp: Dies "saugt" den gesamten Inhalt einer Datei vom Remote-Host auf. Der Inhalt ist für den sicheren Transport base64-kodiert.ansible.builtin.getent: Dies ist eine sichere Methode, um Systemdatenbanken wiepasswdundgroupabzufragen. Die Ergebnisse werden unteransible_factsgespeichert, daher greifen Sie über Schlüssel wieuser_info.ansible_facts.getent_passwdauf die zurückgegebenen Daten zu.ansible.builtin.assert: Dies ist der Kern unserer Verifizierung. Es prüft, ob eine gegebene Bedingung wahr ist. Wenn nicht, schlägt das Play fehl. Wir stellen benutzerdefinierte Erfolgs- und Fehlermeldungen bereit.b64decode: Dies ist ein Jinja2-Filter, der verwendet wird, um den base64-Inhalt zu dekodieren, den wir vomslurp-Modul erhalten haben.
Beachten Sie, dass wir die Datenbanken
passwdundgroupseparat abfragen. Dies hält die Überprüfung der Benutzerexistenz und die Überprüfung der Gruppenzugehörigkeit zurwheel-Gruppe im Einklang mit den tatsächlichen Daten, die vongetentzurückgegeben werden.Speichern Sie die Datei und beenden Sie
nano(Ctrl+X,Y,Enter).Das Verifizierungs-Playbook ausführen
Führen Sie nun Ihr Verifizierungs-Playbook aus. Da es keine Vault-Dateien verwendet, müssen Sie kein Passwort angeben.
ansible-playbook verify_config.ymlWenn alle Ihre vorherigen Schritte korrekt abgeschlossen wurden, wird das Playbook erfolgreich ausgeführt, und Sie sehen die benutzerdefinierte Erfolgsmeldung für jede Zusicherung.
PLAY [Verify system configuration] ********************************************* TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Check if httpd package is installed] ************************************* ok: [localhost] TASK [Assert that httpd is installed] ****************************************** ok: [localhost] => { "changed": false, "msg": "Apache (httpd) package is installed." } TASK [Read the content of the index.html file] ********************************* ok: [localhost] TASK [Assert that the web page content is correct] ***************************** ok: [localhost] => { "changed": false, "msg": "Web page content is correct." } TASK [Check if myappuser exists] *********************************************** ok: [localhost] TASK [Assert that myappuser exists] ******************************************** ok: [localhost] => { "changed": false, "msg": "User 'myappuser' exists." } TASK [Query the wheel group members] ******************************************* ok: [localhost] TASK [Assert that myappuser is in the wheel group] ***************************** ok: [localhost] => { "changed": false, "msg": "User 'myappuser' is in the wheel group." } PLAY RECAP ********************************************************************* localhost : ok=9 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0Herzlichen Glückwunsch! Sie haben erfolgreich Ansible verwendet, um Variablen zu definieren, Systemfakten zu sammeln, Geheimnisse mit Vault zu verwalten und schließlich den Zustand Ihres Systems auf automatisierte Weise zu überprüfen.
Zusammenfassung
In diesem Lab haben Sie gelernt, verschiedene Datentypen innerhalb von Ansible-Playbooks zu verwalten, um ein RHEL-System zu konfigurieren. Sie begannen damit, Standard-Playbook-Variablen zu definieren und zu verwenden, um flexibel einen Apache-Webserver zu installieren und zu konfigurieren. Anschließend haben Sie erforscht, wie Sie die integrierten Fakten von Ansible nutzen können, um Systeminformationen anzuzeigen, was eine Grundlage für die Erstellung dynamischer und host-bewusster Automatisierungsaufgaben bildet.
Darauf aufbauend haben Sie den Webserver weiter konfiguriert, indem Sie benutzerdefinierte Fakten vom verwalteten Host erstellt und genutzt haben. Um sensible Informationen sicher zu handhaben, haben Sie Ansible Vault verwendet, um ein Benutzerpasswort zu verschlüsseln, einen neuen Systembenutzer mit dieser verschlüsselten Variable erstellt und das Playbook nicht-interaktiv mit einer Vault-Passwortdatei ausgeführt. Das Lab schloss mit der Überprüfung ab, dass sowohl der Webserver als auch der neue Systembenutzer korrekt konfiguriert wurden, was die erfolgreiche Anwendung aller erlernten Konzepte bestätigt.


