Ansible का उपयोग करके दो नोड्स के बीच फ़ाइलों की प्रतिलिपि कैसे करें


97

मुझे फ़ाइल फॉर्म मशीन A से मशीन B तक कॉपी करने की आवश्यकता है, जबकि मेरी नियंत्रण मशीन जहाँ से मैं अपने सभी काम चलाऊ मशीन C (स्थानीय मशीन) चलाता हूँ

मैंने निम्नलिखित कोशिश की है:

Ansible के शेल मॉड्यूल में scp कमांड का उपयोग करें

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

यह दृष्टिकोण बस और कभी नहीं समाप्त होता है।

लाने और कॉपी मॉड्यूल का उपयोग करें

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

यह दृष्टिकोण मुझे एक त्रुटि के रूप में निम्नानुसार फेंकता है:

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

कोई भी सुझाव महत्वपूर्ण है।


1. यह नेटवर्क एक्सेस को बचाने के लिए एक आसान सुविधा है, जब नियंत्रण मशीन दूर हो सकती है; 2.Should अब प्रति github.com/ansible/ansible/pull/16756 jctanner मर्ज किए गए 0d94d39 को ansible: devel पर 23 सितंबर, 2016
AnneTheAgile

जवाबों:


101

दूरस्थ-से-दूरस्थ फ़ाइलों की प्रतिलिपि बनाने के लिए आप ' ' कीवर्ड के साथ सिंक्रनाइज़ मॉड्यूल का उपयोग कर सकते हैं delegate_to: source-server:

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

यह प्लेबुक आपके मशीनसी से चल सकती है।


अच्छा उत्तर! दुर्भाग्य से मुझे मल्टी वीएम के साथ वैग्रेंट माहौल में काम नहीं मिला। लगता है कि वैग्रंट वहां कुछ खास करते हैं।
उपचार

यह rsync का उपयोग करता है, क्या आपने इसे vm पर स्थापित किया है?
एंट 31

1
Vagrant 1.7.x के साथ शुरुआत करते हुए यह मशीन के आधार पर विभिन्न निजी कुंजियों का उपयोग करता है। समस्या देखें github.com/mitchellh/vagrant/issues/4967config.ssh.insert_key = false सभी मशीनों तक पहुँचने के लिए एक असुरक्षित_की का उपयोग करने के लिए Vagrant को बाध्य करने के लिए Vagrantfile में निम्न पंक्ति सम्मिलित करें । लेकिन अब मुझे एक त्रुटि संदेश भी नहीं मिलता है (यह हमेशा के लिए प्रतीक्षा करता है)। इसके अलावा बग github.com/ansible/ansible/issues/7250 का कहना है कि रिमोट से रिमोट की कॉपी करना संभव नहीं है।
उपचारमार

9
यह वास्तव में सर्वरबी से सर्वरए की फाइलों को कॉपी करता है। यदि आप उन्हें सर्वरए से सर्वरबी में कॉपी करना चाहते हैं, तो mode=push(या delegate_to: serverB, लेकिन दोनों नहीं) का उपयोग करें।
मारियस गेदमिनस

2
@MariusGedminas आप सही हैं, mode=pushइसका उपयोग किया जाना चाहिए, लेकिन इस स्थिति में delegate_to: serverBउपयोग नहीं किया जा सकता है, क्योंकि यह serverBस्रोत और गंतव्य बना देगा।
स्ट्रिन्हिन्जा कस्टुडिक

95

जैसा कि ant31 ने पहले ही बताया है कि आप इसके लिए synchronizeमॉड्यूल का उपयोग कर सकते हैं । डिफ़ॉल्ट रूप से, मॉड्यूल नियंत्रण मशीन और वर्तमान दूरस्थ होस्ट ( inventory_host) के बीच फ़ाइलों को स्थानांतरित करता है , हालांकि delegate_toइसे कार्य के पैरामीटर का उपयोग करके बदला जा सकता है (यह ध्यान रखना महत्वपूर्ण है कि यह कार्य का एक पैरामीटर है , मॉड्यूल का नहीं)।

आप पर या तो काम जगह कर सकते हैं ServerAया ServerB, लेकिन आप स्थानांतरण की दिशा तदनुसार (का उपयोग कर समायोजित करना modeके पैरामीटर synchronize)।

कार्य को पूरा करना 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

यह डिफ़ॉल्ट का उपयोग करता है mode: push, इसलिए फ़ाइल प्रतिनिधि ( ServerA) से वर्तमान रिमोट ( ServerB) में स्थानांतरित हो जाती है ।

यह अजीब लग सकता है, क्योंकि कार्य को ServerB(के माध्यम से hosts: ServerB) रखा गया है । हालांकि, किसी को यह ध्यान रखना होगा कि कार्य वास्तव में प्रत्यायोजित मेजबान पर निष्पादित किया जाता है , जो इस मामले में है ServerA। (से धक्का तो ServerAकरने के लिए ServerB) वास्तव में सही दिशा है। यह भी याद रखें कि हम बस यह नहीं चुन सकते हैं कि आप बिलकुल भी न चुनें, क्योंकि इसका मतलब यह होगा कि ट्रांसफर कंट्रोल मशीन और के बीच होता है ServerB

कार्य को पूरा करना 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

यह mode: pullट्रांसफर डायरेक्शन को पलटने के लिए उपयोग करता है। फिर, ध्यान रखें कि कार्य वास्तव में निष्पादित किया गया है ServerB, इसलिए खींचना सही विकल्प है।


8
यह इस तरह का एक अच्छा जवाब है यह Ansible प्रलेखन का हिस्सा होना चाहिए । वहां कोई भी उदाहरण इस तरह से स्पष्ट नहीं है। धन्यवाद!
ssc

2
मैंने कई तरीकों से यह कोशिश की है, हालांकि, मुझे इस पर असफलता मिलती है Warning: Identity file /Users/myuser/.ssh/id_servers not accessible
orotemo

@orotemo: अधिक जानकारी के बिना मैं केवल अनुमान लगा सकता हूं, लेकिन यह आपके SSH सेटअप में एक समस्या की तरह दिखता है। कृपया जांचें कि आपने त्रुटि संदेश में दी गई पहचान फ़ाइल का उपयोग करने के लिए SSH या Ansible को कॉन्फ़िगर किया है या नहीं और क्या वह फ़ाइल मौजूद है और सही अनुमतियाँ हैं।
फ्लोरियन ब्रूकर

2
@WilliamTurrell मैंने अपने उत्तर को और अधिक विस्तार से स्थानांतरण दिशा समझाने के लिए अद्यतन किया है। मॉड्यूल वास्तव में थोड़ा भ्रमित है।
फ्लोरियन ब्रूकर

1
धन्यवाद। किसी और के पास @ orotemo की समस्या होने पर, संभावित समाधान यह है कि आपके पास सर्वर A और B के बीच कोई सार्वजनिक कुंजी नहीं है, या जैसा कि मैंने पाया, आपने इसे केवल एक दिशा में काम करने के लिए सेट किया है - गलत। सर्वर एक पर अपने .ssh निर्देशिका में किसी भी कुंजी युग्म के अभाव में, ansible प्रयास अपने स्थानीय मशीन के घर निर्देशिका का उपयोग करने के लिए (जो अगर यह, मान लें कि, एक मैक है, और किसी अन्य खाता नाम हो सकता है मौजूद नहीं होगा।)
विलियम तुर्रे

3

यदि आपको किसी दूरस्थ के माध्यम से फ़ाइलों को सिंक करने की आवश्यकता है, तो आप इसका उपयोग कर सकते हैं:

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

जब remote_serverआपको डेमॉन मोड के साथ rsync स्टार्टअप करने की आवश्यकता होती है। सरल उदाहरण:

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

मैं मशीन से मशीन से फाइल करने के लिए local_action का उपयोग करके इसे हल करने में सक्षम था और फिर मशीन को मशीन से कॉपी कर रहा था।


1

फ़ाइल मॉड्यूल को एक सर्वर से दूसरे सर्वर में स्थानांतरित करने के लिए उपयोग किए गए प्रतिलिपि मॉड्यूल का एक सरल तरीका

यहाँ प्लेबुक है

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

यह आज एक सत्र के दौरान जारी रहा, लेकिन हम में से कोई भी 2.6.4 का उपयोग करके इसे दोहरा नहीं सका। मशीन 1 पर एक फाइल बनाने के साथ इस कार्य को प्लेबुक में डालना और बाद में डायरेक्ट्री को "फेल होने या ऐक्सेसिबल कंट्रोलर पर '/ tmp / source-49731914' नहीं पा सके।" होस्ट मशीन पर एक खाली फ़ाइल बनाने से इसे हल किया गया, लेकिन एक कॉपी होस्ट> मशीन 2 किया। शायद कुछ संस्करण में एक छोटी गाड़ी का व्यवहार था?
Stephan B

0

यदि आप rsync करना चाहते हैं और कस्टम उपयोगकर्ता और कस्टम ssh कुंजी का उपयोग करना चाहते हैं, तो आपको इस कुंजी को rsync विकल्पों में लिखना होगा।

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

आप के deletgateसाथ scpभी उपयोग कर सकते हैं :

- 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

की वजह से delegateआदेश अन्य सर्वर पर चलाया जाता है और यह scp'ही करने के लिए फ़ाइल है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.