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:

  1. Ansible-Steuerknoten: Ein Rechner mit installiertem Ansible.
  2. Inventardatei: Eine funktionsfähige Inventardatei (z. B. /etc/ansible/hosts), die Ihre verwalteten Knoten definiert.
  3. 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=yes nur, 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.