Wie kopiert man Dateien zwischen entfernten Hosts in Ansible

  • 0

Wie kopiert man Dateien zwischen entfernten Servern in Ansible?. ist der Zweck hinter diesem Artikel. Jeder Artikel, den ich gelesen habe, hat mir Vorschläge gemacht, aber nichts Praktisches. Ich wollte einfach Ansible rsync machen. Ich wollte rsync zwischen Remote-Hosts ausführen und Dateien zwischen Remote-Hosts kopieren.

So hier ist das Beispiel orientierten Artikel. In diesem Beitrag werden wir die beiden Hauptoptionen besprechen, die zum Kopieren von Dateien zwischen Remote-Servern oder von Remote zu Remote zur Verfügung stehen.

Wenn wir Dateien von einem Host auf einen anderen Host kopieren wollen, kommt uns in der Regel als erstes SCP in den Sinn, und Ansible hat ein eigenes Modul mit dem gleichen Namen COPY

Wenn Sie eine Datei von einem Ansible Control Master auf Remote-Hosts kopieren wollen, wäre das COPY (scp)-Modul genau richtig. Aber wir brauchen etwas mehr, wenn wir die Dateien zwischen den Remote-Hosts oder von Remote zu Remote kopieren wollen.

Wir werden einige der Ansible-Module wie copy, fetch, synchronize verwenden, um die Anforderung des Kopierens von Dateien zwischen Hosts in Ansible zu erfüllen.

Während wir bereits wissen, wofür das Ansible Copy-Modul verwendet wird.

Hier ist die einfache Einführung in Ansible Fetch und Ansible Synchronize.

Ansible Fetch dient dazu, die Dateien vom Remote-Server auf den Kontrollrechner zu ziehen.

Ansible Synchronize wird verwendet, um die Dateien zwischen Remote-Servern (oder) Zielhosts zu kopieren. Dies ist mehr wie die Durchführung von RSYNC mit Hilfe von Ansible.

Inhaltsverzeichnis

Der Index

  1. Der Plan / Die Anforderung
  2. Methode1: Kopieren von Dateien zwischen entfernten Hosts mit Hilfe des fetch-Moduls
  3. Methode2: Kopieren von Dateien zwischen entfernten Hosts mit Hilfe des synchronize-Moduls
    1. Synchronize Push
    2. Synchronize Pull
  4. Das Ergebnis der Ausführung
  5. Referenzen und andere verwandte Artikel.

Der Plan / Die Anforderung

Um zu beginnen, lassen Sie uns einige Anforderungen selbst definieren, damit wir uns darauf beziehen und auf derselben Seite stehen können.

Wir haben zwei Server mit folgenden Namen

  1. mwiappi01
  2. mwiapp02

Die Anforderung ist, eine Datei von mwiapp01 nach mwiapp02 zu kopieren. Bevor wir fortfahren: Dies ist das Infrastrukturdiagramm unseres Setups.

Lassen Sie sich durch den Namen Master nicht verwirren. Es ist nur eine Kontrollmaschine. Denken Sie daran, dass Ansible agentenlos ist, also gibt es keinen Master und keinen Slave.

Methode1: Kopieren von app01 nach app02 unter Verwendung des Fetch-Moduls

Für diese Methode ist KEINE SSH-Authentifizierung zwischen den entfernten Knoten erforderlich

Dies ist die beste und einfachste Option, um Dateien zwischen den entfernten Knoten zu übertragen, wenn Sie keine SSH-Schlüssel-basierte Authentifizierung zwischen den entfernten Knoten aktiviert haben. Allerdings ist dies nicht der kürzeste Weg. Es funktioniert gut, wenn unser Hauptaugenmerk darauf liegt, die Aufgabe zu erledigen, wie auch immer der Ansatz sein mag.

Es ist ein zweistufiger Prozess, wenn es um diese Methode geht.

Schritt1: Holen der Datei vom Remote-Server (Quelle) zum Ansible-Master

Schritt2: Push (Kopieren) der Datei vom Ansible-Master zum Remote-Server (Ziel)

Hier fungiert der Master wie ein Puffer, in dem die Dateien zwischengespeichert und dann übertragen werden.

Betrachten Sie das folgende Playbook, das die beiden oben genannten Aufgaben ausführt.

--- - hosts: app tasks: - name: Fetch the file from the mwiapp01 to master run_once: yes fetch: src=/tmp/app01-to-app02.jar dest=buffer/ flat=yes when: "{{ inventory_hostname == 'mwiapp01' }}" - name: Kopiere die Datei von master nach mwiapp02 copy: src=buffer/app01-to-app02.jar dest=/tmp/ when: "{{ inventory_hostname == 'mwiapp02' }}"

Hier verwenden wir "when" , um die bedingungsbasierte Ausführung durchzuführen und inventory_hostname ist die eingebaute Variable von Ansible, die den Remote-Hostnamen der aktuellen Ausführung angibt.

Manchmal kann es erforderlich sein, ansible_hostname anstelle von inventory_hostname

Wir weisen Ansible im Grunde an, die Aufgabe „Fetch“ nur auf dem Server mwiapp01 und die Aufgabe „Copy“ nur auszuführen, wenn mwiapp02 der aktuelle Remote-Ausführungshost ist.

Methode 2: Kopieren von app01 nach app02 mit dem Synchronize-Modul

SSH-Schlüsselbasierte Authentifizierung muss zwischen Remote-Hosts aktiviert sein

Damit das Synchronize-Modul problemlos funktioniert, muss die SSH-Schlüsselbasierte Authentifizierung zwischen Remote-Knoten aktiviert sein. Andernfalls bleibt die Synchronisierungsaufgabe stecken und damit auch Ihr Ansible-Spiel.

Mit anderen Worten, die entfernten Knoten sollten in der Lage sein, sich gegenseitig anzumelden, ohne das Passwort manuell eingeben zu müssen. Dies erreichen wir meist mit Hilfe eines SSH-Schlüssels.

Wie bereits erwähnt. Ansible Synchronize ist mehr wie Ansible RSYNC. das typische rsync Feature von Linux.

Um zu wissen, wie man die schlüsselbasierte Authentifizierung in Sekundenschnelle aktivieren kann, lesen Sie den folgenden Artikel

Aktivieren Sie die SSH-Schlüssel-basierte Authentifizierung mit Ansible

Wenn wir mit der SSH-Schlüssel-basierten Authentifizierung fertig sind. Wir sind bereit, das Stück zu spielen. ( playbook).

Es gibt zwei Methoden, um Dateien mit dem Synchronize-Modul zu kopieren

  1. Synchronize Pull
  2. Synchronize Push

Betrachten Sie das folgende Playbook, das die Datei von mwiapp01 nach mwiapp02 kopiert und dabei sowohl die Synchronize Pull- als auch die Synchronize Push-Methode verwendet

Synchronize Pull

Ziel: Source Server (mwiapp01)

Delegiert an und Ausgeführt auf: Zielserver (mwiapp02)

Erläuterung: Da es auf dem Zielserver ausgeführt wird, wo die Datei ankommen soll. Die Aufgabe besteht darin, die Datei vom Ursprungs- (oder) Quellserver zu ziehen.

Hier ist das Playbook, das auf dem Zielserver mwiapp02 mit Hilfe der Delegation ausgeführt wird und pulls die Datei von mwiapp01 zu mwiapp02

---- name: Sync Pull task - Executed on the Destination host "{{groups}}" hosts: "{{groups}}" user: wlsusr tasks: - name: Kopiere die Datei von mwiapp01 nach mwiapp02 mit Methode Pull tags: sync-pull synchronize: src: "{{ item }}" dest: "{{ item }}" mode: pull delegate_to: "{{groups}}" register: syncfile run_once: true with_items: - "/tmp/app01-to-app02.jar"

Man könnte meinen, dass das Playbook so eingestellt ist, dass es auf dem ersten Server ausgeführt wird, da die hosts Direktive auf den ersten Server abzielt. hosts: "{{group}}" mwiapp01

Aber Sie müssen feststellen, dass wir diese Aufgabe tatsächlich auf dem zweiten Server mwiapp02 mit Hilfe von delegate_to

Betrachten Sie den folgenden Bildschirmeintrag, um dies besser zu verstehen.

Synchronize Push

Targeted to: Destination Server (mwiapp02)

Delegiert an und Ausgeführt auf: Source Server (mwiapp01)

Erläuterung: Da es auf dem Quellserver ausgeführt wird, wo die Datei bereits vorhanden ist. Die Aufgabe besteht darin, die Datei auf den Zielserver zu schieben

Hier ist das Playbook, das auf dem Quellserver mwiapp01 ausgeführt wird und pushes die Datei von 01 auf 02 verschiebt

- Name: Sync Push task - Executed on source host "{{groups}}" hosts: "{{groups}}" user: wlsusr tasks: - name: Copy the file from mwiapp01 to mwiapp02 using Method Push tags: sync-push synchronize: src: "{{ item }}" dest: "{{ item }}" mode: push delegate_to: "{{groups}}" register: syncfile with_items: - "/tmp/app01-to-app02.jar"

Man könnte meinen, dass das Playbook so eingestellt ist, dass es auf dem zweiten Server ausgeführt wird, da die hosts Direktive auf den ersten Server abzielt. hosts: "{{group}}" mwiapp02

Aber Sie müssen beachten, dass wir diese Aufgabe tatsächlich auf dem ersten Server mwiapp01 mit Hilfe von delegate_to

Das Playbook besteht aus zwei hostbasierten Aufgaben. Die erste, die mit Synchronize Pull ausgeführt wird, läuft auf mwiapp02 und die zweite mit Synchronize Push auf mwiapp01

Das Playbook ist zwar verständlich (einfach zu verstehen). Ich denke, es gibt einige merkwürdige Zeilen, die mehr Erklärung benötigen, wie "{{groups}}"

Es stellt das erste Element (oder) Server der Host-Gruppe namens „app“ genau wie ein Array

Hoffe, das folgende Bild würde es klar machen.

Weitere zwei wichtige Zeilen in der Datei sind wie folgt

  • Modus Es stellt das Modell der Synchronize. Entweder Synchronize pull oder Synchronize push
  • delegate_to Es sagt ansible, wo der Task (oder) Befehl eigentlich ausgeführt werden soll.

Hoffentlich hast du es jetzt verstanden. delegate_to und hosts zusammen mit mode in ansible-playbook, arbeiten zusammen, um die Remote-Ausführung (oder) Kopieren zwischen Remote-Knoten möglich zu machen.

Ausführung Output

In dem vorhergehenden Screenshot haben wir 3 Befehle ausgeführt. Der erste und der letzte ist ein Ansible-Ad-hoc-Befehl, um die Verfügbarkeit der Datei unter dem /tmpVerzeichnis in mwiapp02Server

zu prüfen, wir verwenden --limit, um den Befehl in nur einem Server auszuführen, obwohl wir die Hostgruppe verwenden, die zwei Server enthält.

Wir haben erfolgreich eine Datei von mwiapp01 auf mwiapp02 kopiert, indem wir die beiden Module Fetch und Synchronize verwendet haben.

Abschluss

In diesem Beitrag haben wir erfolgreich gelernt und ausgeführt, wie man Dateien zwischen entfernten Hosts mit den Modulen Ansible Copy und Fetch kopiert. Wir haben zwei Methoden zum Kopieren von Dateien zwischen Hosts mit ansible gelernt.

Hoffentlich finden Sie diesen Artikel hilfreich.

  1. Referenz des Moduls Ansible Copy
  2. Referenz des Moduls Ansible Fetch
  3. Referenz des Moduls Ansible Synchronize
  4. Wie kopiere oder tausche ich den SSH-Schlüssel zwischen mehreren Hosts – Ansible
  5. Wie tausche ich die IP aus und aktualisiere die Datei /etc/hosts auf mehreren Hosts – Ansible

Hoffe, dass dieser Artikel hilft. Wenn Sie diesen Artikel mögen, teilen Sie ihn bitte