Einführung
Ansible ist ein leistungsstarkes IT-Automatisierungswerkzeug, das die Infrastrukturverwaltung vereinfacht. In diesem praktischen Lab lernen Sie, wie Sie Ansible verwenden, um Dateien mit spezifischem Inhalt auf Zielsystemen zu erstellen. Am Ende dieses Labs werden Sie die Grundlagen der Ansible-Dateiverwaltung verstehen und in der Lage sein, die automatisierte Dateierstellung in Ihrer eigenen Infrastruktur zu implementieren.
Installation und Einrichtung von Ansible
Bevor wir mit Ansible Dateien erstellen können, müssen wir es auf unserem System installieren und konfigurieren. Richten wir unsere Umgebung ein:
Installation von Ansible
Zuerst aktualisieren wir die Paketlisten und installieren Ansible auf unserem Ubuntu 22.04 System:
sudo apt update
sudo apt install -y ansible
Nachdem Sie diese Befehle ausgeführt haben, sollten Sie eine Ausgabe sehen, die anzeigt, dass Ansible erfolgreich installiert wurde. Überprüfen wir die Installation:
ansible --version
Sie sollten eine ähnliche Ausgabe wie diese sehen:
ansible [core 2.12.0]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
ansible collection location = /home/labex/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.10.x (default, ...) [GCC 11.2.0]
jinja version = 3.0.3
libyaml = True
Erstellen eines einfachen Ansible-Inventars
Ansible verwendet eine Inventardatei, um die Hosts zu definieren, die es verwalten soll. Für dieses Lab erstellen wir ein lokales Inventar, das unsere eigene Maschine enthält:
- Erstellen Sie ein neues Verzeichnis für unser Ansible-Projekt:
mkdir -p ~/project/ansible-files
cd ~/project/ansible-files
- Erstellen Sie eine Inventardatei mit VSCode:
- Klicken Sie auf das Explorer-Symbol in der WebIDE
- Navigieren Sie zum Verzeichnis
~/project/ansible-files - Klicken Sie mit der rechten Maustaste und wählen Sie "Neue Datei"
- Benennen Sie die Datei
inventory - Fügen Sie der Datei den folgenden Inhalt hinzu:
[local]
localhost ansible_connection=local
Diese Inventardatei weist Ansible an, Befehle auf der lokalen Maschine auszuführen, ohne SSH zu verwenden.
- Erstellen Sie eine einfache
ansible.cfg-Datei im selben Verzeichnis:- Klicken Sie auf das Explorer-Symbol in der WebIDE
- Navigieren Sie zum Verzeichnis
~/project/ansible-files - Klicken Sie mit der rechten Maustaste und wählen Sie "Neue Datei"
- Benennen Sie die Datei
ansible.cfg - Fügen Sie der Datei den folgenden Inhalt hinzu:
[defaults]
inventory = ./inventory
host_key_checking = False
- Überprüfen wir unsere Einrichtung, indem wir einen einfachen Ansible-Befehl ausführen:
cd ~/project/ansible-files
ansible local -m ping
Sie sollten eine ähnliche Ausgabe wie diese sehen:
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
Dies bestätigt, dass Ansible korrekt installiert und konfiguriert ist, um Befehle auf Ihrer lokalen Maschine auszuführen.
Erstellen von Dateien mit Inhalt mithilfe von Ansible Playbooks
Nachdem wir Ansible eingerichtet haben, lernen wir nun, wie man Dateien mit Inhalt erstellt. Ansible bietet mehrere Module für die Dateiverwaltung, und wir konzentrieren uns in diesem Schritt auf das copy-Modul.
Verstehen von Ansible Playbooks
Ansible Playbooks sind YAML-Dateien, die eine Reihe von Aufgaben beschreiben, die auf Ziel-Hosts ausgeführt werden sollen. Jede Aufgabe verwendet ein spezifisches Ansible-Modul, um eine Aktion auszuführen.
Erstellen wir unser erstes Playbook, um eine Datei mit Inhalt zu erstellen:
- Erstellen Sie in der WebIDE eine neue Datei im Verzeichnis
~/project/ansible-files:- Klicken Sie mit der rechten Maustaste auf das Verzeichnis und wählen Sie "Neue Datei"
- Benennen Sie die Datei
create_file.yml - Fügen Sie den folgenden Inhalt hinzu:
---
- name: Create a file with content
hosts: local
tasks:
- name: Create a simple text file
copy:
dest: "~/project/hello.txt"
content: |
Hello from Ansible!
This file was created using the Ansible copy module.
Current date: {{ ansible_date_time.date }}
Lassen Sie uns verstehen, was dieses Playbook tut:
- Die Zeile
hosts: localgibt an, dass dieses Playbook auf den Hosts in der Gruppelocalaus unserem Inventar ausgeführt wird. - Der Abschnitt
tasksenthält eine Liste der auszuführenden Aufgaben. - Das
copy-Modul wird verwendet, um eine Datei mit Inhalt zu erstellen. - Der Parameter
destgibt den Zielpfad für die Datei an. - Der Parameter
contententhält den Textinhalt, der in die Datei geschrieben wird. {{ ansible_date_time.date }}ist eine Variable, die beim Ausführen des Playbooks durch das aktuelle Datum ersetzt wird.
- Führen wir nun das Playbook aus:
cd ~/project/ansible-files
ansible-playbook create_file.yml
Sie sollten eine ähnliche Ausgabe wie diese sehen:
PLAY [Create a file with content] ***********************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create a simple text file] ***********************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- Überprüfen wir, ob die Datei erstellt wurde und den erwarteten Inhalt enthält:
cat ~/project/hello.txt
Sie sollten eine ähnliche Ausgabe wie diese sehen:
Hello from Ansible!
This file was created using the Ansible copy module.
Current date: 2023-08-15
Das Datum spiegelt das aktuelle Datum wider, an dem Sie das Playbook ausführen.
Idempotenz in Ansible
Idempotenz ist eine Schlüsselfunktion von Ansible – das mehrmalige Ausführen desselben Playbooks sollte dasselbe Ergebnis liefern. Führen wir das Playbook erneut aus, um die Idempotenz in Aktion zu sehen:
ansible-playbook create_file.yml
Dieses Mal sollten Sie sehen, dass die Anzahl der "changed" 0 ist:
PLAY [Create a file with content] ***********************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create a simple text file] ***********************************************
ok: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Dies zeigt, dass Ansible erkennt, dass die Datei bereits mit dem korrekten Inhalt existiert, und sie daher nicht erneut modifiziert.
Verwenden von Variablen und Vorlagen in Ansible
In diesem Schritt werden wir untersuchen, wie man Variablen und Vorlagen verwendet, um mit Ansible dynamischere Dateien zu erstellen.
Arbeiten mit Variablen
Variablen machen Ihre Playbooks flexibler und wiederverwendbarer. Erstellen wir ein Playbook, das Variablen verwendet, um eine Konfigurationsdatei zu erstellen:
- Erstellen Sie in der WebIDE eine neue Datei im Verzeichnis
~/project/ansible-files:- Klicken Sie mit der rechten Maustaste auf das Verzeichnis und wählen Sie "Neue Datei"
- Benennen Sie die Datei
variables_demo.yml - Fügen Sie den folgenden Inhalt hinzu:
---
- name: Create files using variables
hosts: local
vars:
app_name: "MyApplication"
app_version: "1.0.0"
port_number: 8080
log_level: "INFO"
tasks:
- name: Create config file with variables
copy:
dest: "~/project/app_config.ini"
content: |
## Configuration for {{ app_name }}
## Generated by Ansible
[application]
name = {{ app_name }}
version = {{ app_version }}
[server]
port = {{ port_number }}
log_level = {{ log_level }}
In diesem Playbook:
- Der Abschnitt
varsdefiniert Variablen, die im gesamten Playbook verwendet werden können. - Auf die Variablen wird mit der Syntax
{{ variable_name }}verwiesen. - Das
copy-Modul wird verwendet, um eine Datei mit Inhalt zu erstellen, der diese Variablen enthält.
- Führen wir nun das Playbook aus:
cd ~/project/ansible-files
ansible-playbook variables_demo.yml
Sie sollten eine ähnliche Ausgabe wie diese sehen:
PLAY [Create files using variables] ********************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create config file with variables] ***************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- Untersuchen wir den Inhalt der generierten Datei:
cat ~/project/app_config.ini
Sie sollten eine ähnliche Ausgabe wie diese sehen:
## Configuration for MyApplication
## Generated by Ansible
[application]
name = MyApplication
version = 1.0.0
[server]
port = 8080
log_level = INFO
Verwenden von Jinja2-Vorlagen
Für komplexere Dateiinhalte unterstützt Ansible Jinja2-Vorlagen. Erstellen wir eine Vorlagendatei und verwenden sie in einem Playbook:
- Erstellen Sie ein Vorlagenverzeichnis:
mkdir -p ~/project/ansible-files/templates
- Erstellen Sie eine Vorlagendatei in der WebIDE:
- Navigieren Sie zum Verzeichnis
~/project/ansible-files/templates - Klicken Sie mit der rechten Maustaste und wählen Sie "Neue Datei"
- Benennen Sie die Datei
web_config.j2 - Fügen Sie den folgenden Inhalt hinzu:
- Navigieren Sie zum Verzeichnis
## Web Server Configuration
## Generated by Ansible on {{ ansible_date_time.date }}
server {
listen {{ web_port }};
server_name {{ server_name }};
location / {
root {{ doc_root }};
index index.html;
}
{% if enable_ssl %}
## SSL Configuration
ssl_certificate {{ ssl_cert }};
ssl_certificate_key {{ ssl_key }};
{% endif %}
}
- Erstellen Sie nun ein Playbook, das diese Vorlage verwendet:
- Navigieren Sie zum Verzeichnis
~/project/ansible-files - Klicken Sie mit der rechten Maustaste und wählen Sie "Neue Datei"
- Benennen Sie die Datei
template_demo.yml - Fügen Sie den folgenden Inhalt hinzu:
- Navigieren Sie zum Verzeichnis
---
- name: Create files using templates
hosts: local
vars:
web_port: 80
server_name: "example.com"
doc_root: "/var/www/html"
enable_ssl: true
ssl_cert: "/etc/ssl/certs/example.com.crt"
ssl_key: "/etc/ssl/private/example.com.key"
tasks:
- name: Create web server config from template
template:
src: templates/web_config.j2
dest: ~/project/web_server.conf
In diesem Playbook:
- Das
template-Modul wird anstelle voncopyverwendet. - Der Parameter
srcverweist auf unsere Vorlagendatei. - Der Parameter
destgibt an, wo die Ausgabedatei erstellt werden soll. - Die im Abschnitt
varsdefinierten Variablen werden in der Vorlage verwendet.
- Führen Sie das Playbook aus:
cd ~/project/ansible-files
ansible-playbook template_demo.yml
Sie sollten eine ähnliche Ausgabe wie diese sehen:
PLAY [Create files using templates] ********************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create web server config from template] **********************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- Untersuchen wir die generierte Konfigurationsdatei:
cat ~/project/web_server.conf
Sie sollten eine ähnliche Ausgabe wie diese sehen:
## Web Server Configuration
## Generated by Ansible on 2023-08-15
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
## SSL Configuration
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
}
Beachten Sie, wie die Jinja2-Vorlage mit unseren Variablen gerendert wurde und der bedingte Abschnitt für SSL enthalten war, da enable_ssl auf true gesetzt war.
Erweiterte Dateiverwaltung mit Ansible
In diesem letzten Schritt werden wir einige fortgeschrittene Dateiverwaltungstechniken mit Ansible untersuchen, einschließlich Dateiberechtigungen, bedingter Dateierstellung und der Verwendung mehrerer dateibezogener Module.
Festlegen von Dateiberechtigungen und Eigentumsverhältnissen
Beim Erstellen von Dateien müssen Sie häufig bestimmte Berechtigungen und Eigentumsverhältnisse festlegen. Erstellen wir ein Playbook, das dies demonstriert:
- Erstellen Sie in der WebIDE eine neue Datei:
- Navigieren Sie zum Verzeichnis
~/project/ansible-files - Klicken Sie mit der rechten Maustaste und wählen Sie "Neue Datei"
- Benennen Sie die Datei
file_permissions.yml - Fügen Sie den folgenden Inhalt hinzu:
- Navigieren Sie zum Verzeichnis
---
- name: Manage file permissions and ownership
hosts: local
tasks:
- name: Create a script file with execute permissions
copy:
dest: ~/project/script.sh
content: |
#!/bin/bash
echo "This script was created by Ansible"
echo "Current user: $(whoami)"
echo "Current directory: $(pwd)"
mode: "0755"
- name: Create a read-only configuration file
copy:
dest: ~/project/readonly.conf
content: |
## This is a read-only configuration file
setting1 = value1
setting2 = value2
mode: "0444"
In diesem Playbook:
- Der Parameter
modewird verwendet, um Dateiberechtigungen festzulegen. 0755bedeutet Lesen, Schreiben und Ausführen für den Eigentümer sowie Lesen und Ausführen für Gruppe und Andere.0444bedeutet schreibgeschützt für alle.
- Führen Sie das Playbook aus:
cd ~/project/ansible-files
ansible-playbook file_permissions.yml
Sie sollten eine ähnliche Ausgabe wie diese sehen:
PLAY [Manage file permissions and ownership] **********************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create a script file with execute permissions] **************************
changed: [localhost]
TASK [Create a read-only configuration file] **********************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- Überprüfen wir die Berechtigungen der erstellten Dateien:
ls -l ~/project/script.sh ~/project/readonly.conf
Sie sollten eine ähnliche Ausgabe wie diese sehen:
-rwxr-xr-x 1 labex labex 118 Aug 15 12:34 /home/labex/project/script.sh
-r--r--r-- 1 labex labex 73 Aug 15 12:34 /home/labex/project/readonly.conf
- Überprüfen wir, ob das Skript ausgeführt werden kann:
~/project/script.sh
Sie sollten eine ähnliche Ausgabe wie diese sehen:
This script was created by Ansible
Current user: labex
Current directory: /home/labex/project/ansible-files
Bedingte Dateierstellung
Manchmal müssen Sie Dateien nur erstellen, wenn bestimmte Bedingungen erfüllt sind. Erstellen wir ein Playbook, das die bedingte Dateierstellung demonstriert:
- Erstellen Sie in der WebIDE eine neue Datei:
- Navigieren Sie zum Verzeichnis
~/project/ansible-files - Klicken Sie mit der rechten Maustaste und wählen Sie "Neue Datei"
- Benennen Sie die Datei
conditional_file.yml - Fügen Sie den folgenden Inhalt hinzu:
- Navigieren Sie zum Verzeichnis
---
- name: Conditional file creation
hosts: local
vars:
environment: "development"
create_debug_file: true
create_backup: false
tasks:
- name: Create environment-specific configuration
copy:
dest: "~/project/{{ environment }}_config.yml"
content: |
## Configuration for {{ environment }} environment
debug: {{ 'enabled' if environment == 'development' else 'disabled' }}
log_level: {{ 'DEBUG' if environment == 'development' else 'INFO' }}
- name: Create debug log file
copy:
dest: ~/project/debug.log
content: |
## Debug log file
## Created: {{ ansible_date_time.iso8601 }}
mode: "0644"
when: create_debug_file
- name: Create backup directory
file:
path: ~/project/backup
state: directory
mode: "0755"
when: create_backup
In diesem Playbook:
- Die Direktive
whenwird für die bedingte Ausführung von Aufgaben verwendet. - Jinja2-Bedingungen werden im Dateiinhalt verwendet, um Werte basierend auf Variablen zu ändern.
- Das
file-Modul wird verwendet, um ein Verzeichnis zu erstellen.
- Führen Sie das Playbook aus:
cd ~/project/ansible-files
ansible-playbook conditional_file.yml
Sie sollten eine ähnliche Ausgabe wie diese sehen:
PLAY [Conditional file creation] **********************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create environment-specific configuration] ******************************
changed: [localhost]
TASK [Create debug log file] **************************************************
changed: [localhost]
TASK [Create backup directory] ************************************************
skipped: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
Beachten Sie, dass die Aufgabe "Create backup directory" übersprungen wurde, da create_backup auf false gesetzt war.
- Untersuchen wir die erstellten Dateien:
cat ~/project/development_config.yml
cat ~/project/debug.log
ls -la ~/project/ | grep backup
Sie sollten den Inhalt der beiden erstellten Dateien sehen und bestätigen, dass kein Sicherungsverzeichnis erstellt wurde.
Verwenden mehrerer dateibezogener Module
Ansible bietet mehrere Module für die Dateiverwaltung. Erstellen wir ein Playbook, das die Verwendung mehrerer dateibezogener Module demonstriert:
- Erstellen Sie in der WebIDE eine neue Datei:
- Navigieren Sie zum Verzeichnis
~/project/ansible-files - Klicken Sie mit der rechten Maustaste und wählen Sie "Neue Datei"
- Benennen Sie die Datei
file_modules.yml - Fügen Sie den folgenden Inhalt hinzu:
- Navigieren Sie zum Verzeichnis
---
- name: Demonstrate file-related modules
hosts: local
tasks:
- name: Create a directory
file:
path: ~/project/ansible_demo
state: directory
mode: "0755"
- name: Create a file using the copy module
copy:
dest: ~/project/ansible_demo/copied.txt
content: "This file was created using the copy module.\n"
- name: Create a symbolic link
file:
src: ~/project/ansible_demo/copied.txt
dest: ~/project/ansible_demo/link_to_copied.txt
state: link
- name: Create a file with blockinfile module
blockinfile:
path: ~/project/ansible_demo/block.txt
create: true
block: |
This is a block of text
that will be inserted
as a single unit.
marker: "## {mark} ANSIBLE MANAGED BLOCK"
In diesem Playbook:
- Das
file-Modul wird mitstate: directoryverwendet, um ein Verzeichnis zu erstellen. - Das
file-Modul wird mitstate: linkverwendet, um einen symbolischen Link zu erstellen. - Das
blockinfile-Modul wird verwendet, um eine Datei mit einem Textblock zu erstellen, der von Markierungskommentaren umgeben ist.
- Führen Sie das Playbook aus:
cd ~/project/ansible-files
ansible-playbook file_modules.yml
Sie sollten eine ähnliche Ausgabe wie diese sehen:
PLAY [Demonstrate file-related modules] ***************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create a directory] *****************************************************
changed: [localhost]
TASK [Create a file using the copy module] ************************************
changed: [localhost]
TASK [Create a symbolic link] *************************************************
changed: [localhost]
TASK [Create a file with blockinfile module] **********************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- Überprüfen wir die Ergebnisse:
ls -la ~/project/ansible_demo/
cat ~/project/ansible_demo/copied.txt
cat ~/project/ansible_demo/link_to_copied.txt
cat ~/project/ansible_demo/block.txt
Sie sollten Folgendes sehen:
- Ein Verzeichnis namens
ansible_demo - Eine Datei namens
copied.txtmit dem angegebenen Inhalt - Einen symbolischen Link namens
link_to_copied.txt, der aufcopied.txtverweist - Eine Datei namens
block.txtmit einem Textblock, der von Markierungskommentaren umgeben ist
Die Ausgabe des letzten Befehls sollte in etwa so aussehen:
## BEGIN ANSIBLE MANAGED BLOCK
This is a block of text
that will be inserted
as a single unit.
## END ANSIBLE MANAGED BLOCK
Dies demonstriert die Vielseitigkeit der Dateiverwaltungsfunktionen von Ansible.
Zusammenfassung
Herzlichen Glückwunsch zum Abschluss dieses Ansible-Dateiverwaltungs-Labs. Sie haben mehrere wichtige Konzepte und Techniken gelernt:
- Wie man Ansible für grundlegende Automatisierungsaufgaben installiert und konfiguriert
- Erstellen von Dateien mit spezifischem Inhalt mithilfe des
copy-Moduls - Verwenden von Variablen, um Ihren Dateiinhalt dynamisch zu gestalten
- Arbeiten mit Jinja2-Vorlagen für komplexere Dateigenerierung
- Festlegen von Dateiberechtigungen und Eigentumsverhältnissen
- Implementieren der bedingten Dateierstellung basierend auf Variablen
- Verwenden verschiedener Ansible-Module für unterschiedliche Dateiverwaltungsaufgaben
Diese Fähigkeiten bilden eine solide Grundlage für die Automatisierung von Dateiverwaltungsaufgaben in Ihrer Infrastruktur. Mit Ansible können Sie konsistenten Dateiinhalt über mehrere Server hinweg sicherstellen, Änderungen kontrolliert anwenden und eine prüfbare Aufzeichnung Ihrer Konfiguration führen.
Um Ihre Ansible-Lernreise fortzusetzen, sollten Sie sich mit fortgeschritteneren Themen wie Rollen, Playbook-Organisation und der Integration von Ansible mit anderen DevOps-Tools befassen.


