Yanıtlayıcı kullanarak iki düğüm arasında dosya kopyalama


101

A makinesinden B makinesine dosya kopyalamam gerekiyor, oysa tüm yanıtlanabilir görevlerimi çalıştırdığım kontrol makinem C makinesidir (yerel makine)

Aşağıdakileri denedim:

Ansible'ın kabuk modülünde scp komutunu kullanın

hosts: machine2
user: user2
tasks:
  - name: Copy file from machine1 to machine2 
    shell: scp user1@machine1:/path-of-file/file1 /home/user2/file1

Bu yaklaşım devam eder ve asla bitmez.

getirme ve kopyalama modüllerini kullan

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

Bu yaklaşım bana aşağıdaki gibi bir hata veriyor:

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>'

Herhangi bir öneri yardımcı olacaktır.


1. Bu, kontrol makinesi daha uzakta olabileceği zaman ağ erişimlerini kaydetmek için kullanışlı bir özelliktir; 2. github.com/ansible/ansible/pull/16756 jctanner birleştirilmiş commit 0d94d39 ile ansible: devel: 23 Eylül 2016
AnneTheAgile

Yanıtlar:


102

Uzaktan uzaktaki dosyaları kopyalamak için senkronizasyon modülünü ' delegate_to: source-server' anahtar kelimesi ile kullanabilirsiniz :

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

Bu başucu kitabı, makinenizden çalıştırılabilirC.


iyi cevap! Maalesef bunu çoklu sanal makinelerle bir Vagrant ortamında çalıştırmadım. Görünüşe göre Vagrant orada özel bir şey yapıyor.
therealmarv

Rsync kullanıyor, vm'de kurulu mu?
ant31

2
Vagrant 1.7.x ile başlayarak, makineye bağlı olarak farklı özel anahtarlar kullanır. Bkz . Github.com/mitchellh/vagrant/issues/4967 Vagrant'ı tüm makinelere erişmek için ONE insecure_key'i kullanmaya zorlamak için aşağıdaki satırı Vagrantfile'a ekleyin config.ssh.insert_key = false. Ama şimdi bir hata mesajı bile almıyorum (sonsuza kadar bekler). Ayrıca hata github.com/ansible/ansible/issues/7250 , uzaktan kumandadan uzaktan kumandaya kopyalamanın mümkün olmadığını söylüyor.
therealmarv

9
Bu aslında dosyaları sunucuB'den sunucuA'ya kopyalar. Bunları A sunucusundan B sunucusuna kopyalamak istiyorsanız, kullanın mode=push(veya delegate_to: serverBikisini birden değil).
Marius Gedminas

2
@MariusGedminas doğru, mode=pushkullanılmalı, ancak bu durumda delegate_to: serverBkullanılamaz, çünkü bu serverBkaynak ve hedef olacaktır.
Strahinja Kustudic

96

Ant31'in daha önce belirttiği gibi, synchronizemodülü bunun için kullanabilirsiniz . Varsayılan olarak, modül dosyaları kontrol makinesi ile geçerli uzak ana bilgisayar ( inventory_host) arasında aktarır , ancak bu görevin delegate_toparametresi kullanılarak değiştirilebilir (bunun modülün değil , görevin bir parametresi olduğunu unutmamak önemlidir ).

Görevi ServerAveya üzerine yerleştirebilirsiniz ServerB, ancak aktarım yönünü buna göre ayarlamanız gerekir ( modeparametresini kullanarak synchronize).

Görevi yerleştirmek 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

Bu, varsayılanı kullanır mode: push, böylece dosya temsilciden ( ServerA) geçerli uzaktan kumandaya ( ServerB) aktarılır .

Görev ServerB(aracılığıyla hosts: ServerB) üzerine yerleştirildiği için bu kulağa garip gelebilir . Bununla birlikte, görevin gerçekte temsilci olarak atanan ana bilgisayarda yürütüldüğü unutulmamalıdır, bu durumda bu doğrudur ServerA. (İterek Yani ServerAiçin ServerB) gerçekten de doğru yönde olduğunu. Ayrıca, hiçbir şekilde yetkilendirmemeyi seçemeyeceğimizi de unutmayın, çünkü bu, transferin kontrol makinesi ile arasında gerçekleşeceği anlamına gelir ServerB.

Görevi yerleştirmek 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

Bu mode: pull, transfer yönünü tersine çevirmek için kullanılır. Yine, görevin aslında yerine getirildiğini unutmayın ServerB, bu nedenle çekmek doğru seçimdir.


8
Bu o kadar iyi bir cevap ki Ansible belgelerinin bir parçası olmalı . Oradaki örneklerin hiçbiri bunu bu kadar açık bir şekilde açıklamıyor. Teşekkürler!
ssc

2
Bunu çeşitli şekillerde denedim, ancak beni hayal kırıklığına uğrattı Warning: Identity file /Users/myuser/.ssh/id_servers not accessible.
orotemo

@orotemo: Daha fazla bilgi olmadan sadece tahmin edebilirim, ancak bu SSH kurulumunuzda bir sorun gibi görünüyor. Lütfen hata mesajında ​​verilen kimlik dosyasını kullanmak için SSH veya Ansible'ı yapılandırıp yapılandırmadığınızı ve bu dosyanın var olup olmadığını ve doğru izinlere sahip olup olmadığını kontrol edin.
Florian Brucker

2
@WilliamTurrell Transfer yönünü daha detaylı açıklamak için cevabımı güncelledim. Modül gerçekten biraz kafa karıştırıcı.
Florian Brucker

1
Teşekkürler. @ Orotemo'nun sorunu olan herhangi biri için, olası çözüm, A ve B sunucuları arasında yalnızca açık anahtar erişiminizin olmaması veya bulduğum gibi, onu yalnızca bir yönde - yanlış yönde - çalışacak şekilde ayarlamış olmanızdır. Sunucu A'daki .ssh dizininizde herhangi bir anahtar çifti olmaması durumunda, yerel makinenizin ana dizinini kullanmak için yanıtlanabilir girişimler (bu, örneğin bir Mac ise ve farklı bir hesap adına sahip olabilir)
William Turrell

3

Dosyaları iki uzak düğüm arasında ansible aracılığıyla senkronize etmeniz gerekiyorsa, bunu kullanabilirsiniz:

- name: synchronize between nodes
  environment:
    RSYNC_PASSWORD: "{{ input_user_password_if_needed }}"
  synchronize:
    src: rsync://user@remote_server:/module/
    dest: /destination/directory/
    // if needed
    rsync_opts:
       - "--include=what_needed"
       - "--exclude=**/**"
    mode: pull
    delegate_to: "{{ inventory_hostname }}"

açıkken, remote_serverdaemon modu ile rsync'i başlatmanız gerekir. Basit örnek:

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

Bunu machineA'dan machineC'ye scp'ye scp'ye ve ardından dosyayı machineB'ye kopyalayarak local_action kullanarak çözebildim.


1

Dosyayı bir sunucudan diğerine aktarmak için kopyalama modülünü kullanmanın basit bir yolu

İşte başucu kitabı

---
- 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}

Bu, bugünkü bir oturum sırasında ortaya çıktı, ancak ikimiz de bunu bir 2.6.4 kullanarak çoğaltamadık. Bu görevi, önce makine1'de bir dosya oluşturarak ve daha sonra dizini listeleyerek bir başucu kitabına koymak, "Ansible Controller'da '/ tmp / source-49731914' bulunamadı veya erişilemedi." Ana makinede boş bir dosya oluşturmak sorunu çözdü, ancak ana makine> makine2 kopyaladı. Belki bazı versiyonlarda hatalı bir davranış vardı?
Stephan B

0

Eğer rsync yapmak ve özel kullanıcı ve özel ssh anahtarı kullanmak istiyorsanız, bu anahtarı rsync seçeneklerinde yazmanız gerekir.

---
 - 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

Sen kullanabilirsiniz deletgateile scpçok:

- name: Copy file to another server
  become: true
  shell: "scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null admin@{{ inventory_hostname }}:/tmp/file.yml /tmp/file.yml"
  delegate_to: other.example.com

Çünkü delegatekomut diğer sunucuda çalıştırılır scpve dosyanın kendisine aittir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.