it-swarm.com.de

So kopieren Sie Dateien mit ansible zwischen zwei Knoten

Ich muss die Datei von Maschine A auf Maschine B kopieren, wohingegen meine Steuerungsmaschine, von der aus ich alle meine Aufgaben ausführen kann, Maschine C (lokale Maschine) ist.

Ich habe Folgendes versucht:

Verwenden Sie den Befehl scp im Shell-Modul von ansible

hosts: machine2
user: user2
tasks:
  - name: Copy file from machine1 to machine2 
    Shell: scp [email protected]:/path-of-file/file1 /home/user2/file1

Dieser Ansatz geht immer weiter und endet nie.

benutze Fetch & Copy Module

hosts: machine1
user: user1
tasks:
  - name: copy file from machine1 to local
    fetch: src=/path-of-file/file1 dest=/path-of-file/file1

hosts: machine2
user: user2
tasks:
  - name: copy file from local to machine2
    copy: src=/path-of-file/file1 dest=/path-of-file/file1

Dieser Ansatz wirft mir einen Fehler wie folgt:

error while accessing the file /Users/<myusername>/.ansible/cp/ansible-ssh-machine2-22-<myusername>, error was: [Errno 102] Operation not supported on socket: u'/Users/<myusername>/.ansible/cp/ansible-ssh-machine2-22-<myusername>'

Anregungen wären hilfreich.

83
user3228188

Zum Kopieren von Remote-zu-Remote-Dateien können Sie das Modul synchronisieren mit 'delegate_to: source-server' Stichwort:

- hosts: serverB
  tasks:    
   - name: Copy Remote-To-Remote (from serverA to serverB)
     synchronize: src=/copy/from_serverA dest=/copy/to_serverB
     delegate_to: serverA

Dieses Playbook kann von Ihrem Computer aus ausgeführt werden.

89
ant31

Wie bereits angedeutet, können Sie hierfür das Modul synchronize verwenden. Standardmäßig überträgt das Modul Dateien zwischen dem Steuergerät und dem aktuellen Remote-Host (inventory_Host), dies kann jedoch mit dem delegate_to Parameter (es ist wichtig zu beachten, dass dies ein Parameter der Aufgabe ist, nicht des Moduls).

Sie können die Aufgabe entweder auf ServerA oder ServerB platzieren, müssen jedoch die Übertragungsrichtung entsprechend anpassen (mithilfe des Parameters mode von synchronize). .

Platzieren der Aufgabe auf ServerB

- hosts: ServerB
  tasks:
    - name: Transfer file from ServerA to ServerB
      synchronize:
        src: /path/on/server_a
        dest: /path/on/server_b
      delegate_to: ServerA

Dies verwendet die Standardeinstellung mode: Push, damit die Datei vom Delegaten (ServerA) an die aktuelle Gegenstelle (ServerB) übertragen wird.

Dies mag seltsam klingen, da die Aufgabe auf ServerB gestellt wurde (über hosts: ServerB). Es ist jedoch zu beachten, dass die Aufgabe tatsächlich auf dem delegierten Host ausgeführt wird, in diesem Fall ServerA. Drücken (von ServerA nach ServerB) ist also in der Tat die richtige Richtung. Denken Sie auch daran, dass wir uns nicht einfach dafür entscheiden können, überhaupt nicht zu delegieren, da dies bedeuten würde, dass die Übertragung zwischen control machine und ServerB erfolgt.

Platzieren der Aufgabe auf ServerA

- hosts: ServerA
  tasks:
    - name: Transfer file from ServerA to ServerB
      synchronize:
        src: /path/on/server_a
        dest: /path/on/server_b
        mode: pull
      delegate_to: ServerB

Dies verwendet mode: pull, um die Übertragungsrichtung umzukehren. Denken Sie auch hier daran, dass die Aufgabe tatsächlich auf ServerB ausgeführt wird, also ist Ziehen die richtige Wahl.

82
Florian Brucker

Wenn Sie Dateien zwischen zwei entfernten Knoten über ansible synchronisieren müssen, können Sie dies verwenden:

- name: synchronize between nodes
  environment:
    RSYNC_PASSWORD: "{{ input_user_password_if_needed }}"
  synchronize:
    src: rsync://[email protected]_server:/module/
    dest: /destination/directory/
    // if needed
    rsync_opts:
       - "--include=what_needed"
       - "--exclude=**/**"
    mode: pull
    delegate_to: "{{ inventory_hostname }}"

wenn sie auf remote_server Sie müssen Rsync mit Daemon-Modus starten. Einfaches Beispiel:

pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsync.log
port = port

[module]
path = /path/to/needed/directory/
uid = nobody
gid = nobody
read only = yes
list = yes
auth users = user
secrets file = /path/to/secret/file
2
CrusaderX

Ich war in der Lage, dieses Problem zu lösen, indem ich local_action verwendete, um die Datei von Maschine A auf Maschine C zu scpen und dann auf Maschine B zu kopieren.

2
user3228188

Sie können deletgate auch mit scp verwenden:

- name: Copy file to another server
  become: true
  Shell: "scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null [email protected]{{ inventory_hostname }}:/tmp/file.yml /tmp/file.yml"
  delegate_to: other.example.com

Wegen delegate wird der Befehl auf dem anderen Server ausgeführt und es ist scp die Datei für sich.

0
Kris

Wenn Sie rsync ausführen und einen benutzerdefinierten Benutzer und einen benutzerdefinierten SSH-Schlüssel verwenden möchten, müssen Sie diesen Schlüssel in die rsync-Optionen schreiben.

---
 - name: rsync
   hosts: serverA,serverB,serverC,serverD,serverE,serverF
   gather_facts: no
   vars:
     ansible_user: Oracle
     ansible_ssh_private_key_file: ./mykey
     src_file: "/path/to/file.txt"
   tasks:
     - name: Copy Remote-To-Remote from serverA to server{B..F}
       synchronize:
           src:  "{{ src_file }}"
           dest: "{{ src_file }}"
           rsync_opts:
              - "-e ssh -i /remote/path/to/mykey"
       delegate_to: serverA
0
Sasha Golikov

Eine einfache Möglichkeit, mit dem Kopiermodul die Datei von einem Server auf einen anderen zu übertragen

Hier ist ein Spielbuch

---
- hosts: machine1 {from here file will be transferred to another remote machine}
  tasks:
  - name: transfer data from machine1 to machine2

    copy:
     src=/path/of/machine1

     dest=/path/of/machine2

    delegate_to: machine2 {file/data receiver machine}
0