Sichere Dateiübertragung: Verwendung der Ansible Copy- und Fetch-Module
Verwenden Sie Ansible Copy- und Fetch-Ad-hoc-Befehle, um Dateien auf verwaltete Knoten zu übertragen und Logs oder Konfigurationen zurück auf Ihren Steuerknoten abzurufen.
Sichere Dateiübertragung: Verwendung der Ansible Copy- und Fetch-Module
Das Verschieben von Dateien ist eine der ersten praktischen Ansible-Aufgaben, die Sie benötigen: eine Konfiguration auf Ihre Server übertragen, eine Logdatei sammeln oder eine entfernte Datei vor einer Änderung sichern. Die Module copy und fetch behandeln diese beiden Richtungen klar.
Diese Anleitung verwendet Ad-hoc-Befehle, sodass Sie einmalige Übertragungen durchführen können, ohne ein vollständiges Playbook schreiben zu müssen. Dieselben Modulargumente funktionieren auch in Playbooks, wenn die Aufgabe wiederholbar sein soll.
Voraussetzungen
Bevor Sie die folgenden Beispiele ausführen, stellen Sie sicher, dass Folgendes vorhanden ist:
- Ansible-Steuerknoten: Ein Rechner mit installiertem Ansible.
- Inventardatei: Eine funktionsfähige Inventardatei (z. B.
/etc/ansible/hosts), die Ihre verwalteten Knoten definiert. - Konnektivität: SSH-Schlüsselzugriff, der für Ihre entfernten Hosts konfiguriert ist.
Alle Beispiele gehen davon aus, dass die Zielgruppe im Inventar webservers heißt.
Ad-hoc-Befehle für die Dateiübertragung verstehen
Ad-hoc-Befehle sind einzeilige Befehle, die direkt vom Terminal aus ausgeführt werden. Sie sind ideal für schnelle Aufgaben, die kein dauerhaftes Playbook rechtfertigen. Die grundlegende Struktur ist:
ansible <host-gruppe> -m <modul-name> -a "key=value key2=value2 ..."
Für die Dateiübertragung verwenden wir die Modulnamen -m copy oder -m fetch und übergeben die erforderlichen Argumente mit dem Flag -a.
Das copy-Modul: Dateien auf entfernte Knoten übertragen
Das copy-Modul wird verwendet, um eine Datei, die sich auf dem Ansible-Steuerrechner befindet, auf einen oder mehrere verwaltete Knoten zu übertragen. Dies ist die Standardmethode zum Bereitstellen von Konfigurationsdateien, Skripten oder kleinen Assets.
Wichtige Argumente für copy
Das copy-Modul erfordert zwei wesentliche Argumente und akzeptiert mehrere optionale Argumente für die Konfigurationsverwaltung:
| Argument | Beschreibung | Erforderlich? | Beispielwert |
|---|---|---|---|
src |
Der lokale Dateipfad auf dem Ansible-Steuerrechner. Absolute Pfade sind für Ad-hoc-Befehle am klarsten. | Ja | /tmp/config.conf |
dest |
Der Pfad, an dem die Datei auf dem entfernten verwalteten Knoten abgelegt wird. | Ja | /etc/app/config.conf |
owner |
Name des Benutzers, dem die Datei auf dem entfernten Knoten gehören soll. | Nein | nginx |
group |
Name der Gruppe, der die Datei auf dem entfernten Knoten gehören soll. | Nein | www-data |
mode |
Berechtigungen (oktal), die für die Zieldatei festgelegt werden sollen. | Nein | 0644 |
backup |
Wenn yes, wird vor dem Überschreiben der Originaldatei eine Sicherungsdatei erstellt. |
Nein | yes |
Beispiel 1: Einfache Dateibereitstellung
Angenommen, Sie haben eine benutzerdefinierte Tagesmeldungsdatei (motd) lokal und möchten sie auf alle Webserver übertragen.
# Lokaler Dateipfad: /home/user/ansible/motd_banner
# Entferntes Ziel: /etc/motd
ansible webservers -m copy -a "src=/home/user/ansible/motd_banner dest=/etc/motd"
Beispiel 2: Berechtigungen und Eigentümerschaft festlegen
Wenn Sie eine sichere Konfigurationsdatei bereitstellen, müssen Sie den Besitzer, die Gruppe und eingeschränkte Berechtigungen angeben (z. B. nur der Besitzer kann lesen/schreiben).
# Bereitstellen einer Anwendungskonfigurationsdatei, die 'app_user' gehört, Gruppe 'devops',
# mit Lese-/Schreibberechtigungen nur für den Besitzer (0600).
ansible webservers -m copy -b -a "src=/tmp/app_settings.yaml dest=/etc/app/settings.yaml owner=app_user group=devops mode=0600"
Hinweis zu
-b: Das Flag-b(oder--become) ist erforderlich, wenn das entfernte Ziel erhöhte Berechtigungen erfordert (z. B. Schreiben nach/etc).
Das fetch-Modul: Dateien von entfernten Knoten abrufen
Das fetch-Modul führt die umgekehrte Operation von copy aus: Es ruft eine Datei vom verwalteten Knoten zurück zum Ansible-Steuerrechner ab. Dies ist nützlich zum Sichern von Konfigurationsdateien, Abrufen von Logs oder Sammeln von Diagnoseinformationen.
Wichtige Argumente für fetch
Das fetch-Modul erfordert die Quelldatei auf dem entfernten Knoten und ein Zielverzeichnis auf dem Steuerrechner.
| Argument | Beschreibung | Erforderlich? | Beispielwert |
|---|---|---|---|
src |
Der absolute Pfad zur Datei auf dem entfernten verwalteten Knoten. | Ja | /var/log/nginx/error.log |
dest |
Der absolute Pfad zum Verzeichnis auf dem Steuerrechner, in dem die Dateien gespeichert werden. | Ja | /tmp/backups/logs |
flat |
Wenn yes, enthält der resultierende Dateiname nicht die Hostnamenstruktur (nicht empfohlen beim Abrufen von mehreren Hosts). |
Nein | no (Standard) |
Kritischer Unterschied: Zielstruktur
Im Gegensatz zum copy-Modul erstellt das fetch-Modul automatisch einen strukturierten Unterverzeichnispfad basierend auf dem entfernten Hostnamen, um Dateinamenskollisionen beim Abrufen von Dateien von mehreren Servern zu vermeiden.
Der resultierende Pfad auf dem Steuerrechner sieht wie folgt aus:
<dest>/<hostname>/<src>
Zum Beispiel führt das Abrufen von /etc/nginx/nginx.conf von host1 nach /tmp/backups zu:
/tmp/backups/host1/etc/nginx/nginx.conf
Beispiel 3: Entfernte Konfigurationssicherungen abrufen
Um die laufende Konfigurationsdatei von allen Webservern in ein lokales Sicherungsverzeichnis abzurufen:
# nginx.conf von allen Webservern in das lokale Verzeichnis /tmp/config_backups abrufen
ansible webservers -m fetch -a "src=/etc/nginx/nginx.conf dest=/tmp/config_backups"
Nachdem Sie diesen Befehl ausgeführt haben, würde Ihre lokale Verzeichnisstruktur, wenn Sie webserver1 und webserver2 als Ziel hatten, wie folgt aussehen:
/tmp/config_backups/
├── webserver1
│ └── etc
│ └── nginx
│ └── nginx.conf
└── webserver2
└── etc
└── nginx
└── nginx.conf
Beispiel 4: Eine einzelne Datei ohne Hoststruktur abrufen (flat=yes)
Wenn Sie absolut sicher sind, dass Sie eine Datei nur von einem einzelnen Host abrufen, oder wenn Sie nur den Inhalt der Datei (nicht die Ursprungsstruktur) benötigen, können Sie flat=yes verwenden. Dies führt dazu, dass die Datei direkt im Zielordner abgelegt wird, benannt nach der ursprünglichen entfernten Datei.
# Einen lokalen Gesundheitsstatusbericht von einem einzelnen Host abrufen und direkt speichern.
ansible webserver1 -m fetch -a "src=/tmp/health_status.txt dest=/tmp/reports flat=yes"
# Resultierender Pfad: /tmp/reports/health_status.txt
Warnung: Verwenden Sie
flat=yesnur, wenn Sie einen einzelnen Host als Ziel haben oder wenn Sie beabsichtigen, die Datei bei nachfolgenden Ausführungen zu überschreiben, da Ansible Konflikte nicht verhindert.
Best Practices und Sicherheitsüberlegungen
Kleine Fehler bei der Dateiübertragung können zu Produktionsvorfällen führen, insbesondere wenn Dateien in /etc landen oder Geheimnisse enthalten.
Berechtigungen immer mit copy festlegen
Übertragen Sie niemals eine Konfigurationsdatei, ohne explizit den mode und owner zu definieren. Wenn Sie sich auf die Standard-Umask des entfernten Systems verlassen, könnten sensible Dateien (wie SSH-Schlüssel oder Datenbankanmeldeinformationen) mit übermäßig freizügigen Zugriffsrechten enden.
# Schlechte Praxis (Modus von Umask abgeleitet)
- name: Unsicheren Schlüssel bereitstellen
ansible.builtin.copy:
src: private.key
dest: /etc/app/private.key
# Gute Praxis (Zugriff explizit einschränken)
- name: Sicheren Schlüssel bereitstellen
ansible.builtin.copy:
src: private.key
dest: /etc/app/private.key
mode: '0600'
owner: root
backup=yes für kritische Änderungen verwenden
Wenn Sie mit copy eine vorhandene, kritische Datei (z. B. /etc/sudoers) überschreiben, fügen Sie backup=yes hinzu. Ansible erstellt eine mit einem Zeitstempel versehene Sicherungskopie auf dem entfernten Knoten, bevor die Datei überschrieben wird, und bietet so eine einfache Rollback-Option.
synchronize für große Übertragungen in Betracht ziehen
Während copy und fetch für schnelle Operationen und kleine Dateien gut geeignet sind, verwenden Sie ansible.posix.synchronize für große Verzeichnisbäume oder effiziente Delta-Übertragungen. Es kapselt rsync, daher benötigen der Steuerknoten und die Zielumgebung den richtigen rsync- und SSH-Zugriff.
Fazit
Verwenden Sie copy, wenn sich die Quelle auf Ihrem Steuerknoten und das Ziel auf dem verwalteten Knoten befindet. Verwenden Sie fetch, wenn sich die Quelle auf dem verwalteten Knoten befindet und Sie die Datei lokal speichern möchten.
| Modul | Richtung | Ad-hoc-Befehlsbeispiel |
|---|---|---|
copy |
Steuerknoten -> Verwalteter Knoten | ansible all -m copy -a "src=/local/file dest=/remote/path mode=0644" |
fetch |
Verwalteter Knoten -> Steuerknoten | ansible all -m fetch -a "src=/remote/file dest=/local/dir" |
Für einen einzelnen Server kann flat=yes abgerufene Dateien lesbarer machen. Für eine Gruppe von Servern behalten Sie die standardmäßige hostbasierte Verzeichnisstruktur bei, damit das Log eines Hosts nicht das eines anderen überschreibt.