दूरस्थ मशीन से स्थानीय के साथ कई फ़ाइलों को कैसे प्राप्त करें


17

मैं दूरस्थ निर्देशिका से स्थानीय निर्देशिका के लिए फ़ाइलों को Ansible के साथ कॉपी करना चाहूंगा लेकिन लाने के लिए मॉड्यूल मुझे केवल एक फ़ाइल की प्रतिलिपि बनाने की अनुमति देता है। मेरे पास कई सर्वर हैं जिनसे मुझे फ़ाइलों की आवश्यकता है (प्रत्येक सर्वर को एक ही निर्देशिका) और मुझे अब यह नहीं करना है कि यह कैसे करना है।

कोई विचार?

जवाबों:


22

आपको संभवतः दूरस्थ सामग्री को पंजीकृत करने और उस पर लूप की तुलना में, कुछ इस तरह से काम करना चाहिए:

- shell: (cd /remote; find . -maxdepth 1 -type f) | cut -d'/' -f2
  register: files_to_copy

- fetch: src=/remote/{{ item }} dest=/local/
  with_items: "{{ files_to_copy.stdout_lines }}"

जहां /remoteआपके दूरस्थ सर्वर पर निर्देशिका पथ के /local/साथ और आपके मास्टर पर निर्देशिका के साथ बदला जाना चाहिए


1
वैसे, यह केवल एक स्तर तक जाता है (उपनिर्देशिकाओं को छोड़ देता है) और सामान्य रूप से निर्देशिकाओं को अनदेखा करता है, इसलिए यदि आप ऐसा कुछ नहीं चाहते हैं, तो केवल शेल कमांड को एक रिकॉर्डिंग में बदल दें।
कोस्तुति

जब मैं सर्वरों के एक समूह पर चलता हूं तो क्या होगा? क्या प्रत्येक पंजीकृत होगा यह स्वयं के निष्कर्ष हैं? और सही लोगों को लाना है?
अमीर मेहलर

किसी भी सुराग win_find के साथ ऐसा करने के लिए कैसे? मैं यह पता नहीं लगा सकता कि फ़ाइल सूची से अतिरिक्त पथ कैसे लौटता है
पीटर काह्न

27

आपको ऐसा करने के लिए सिंक्रोनाइज़ मॉड्यूल का उपयोग करना चाहिए । यह rsync की भयानक शक्ति का उपयोग करता है । यह किसी भी गहराई की फ़ाइल और निर्देशिका संरचनाओं की नकल करेगा, बुलेटप्रूफ और अत्यधिक कुशल है - केवल उन वास्तविक बाइट्स की प्रतिलिपि बनाना जो बदल गए हैं:

- name: Fetch stuff from the remote and save to local
  synchronize:  src={{ item }} dest=/tmp/ mode=pull
  with_items:
    - "folder/one"
    - "folder/two"

कुंजी modeपैरामीटर है:

सिंक्रनाइज़ेशन की दिशा निर्दिष्ट करें। पुश मोड में लोकलहोस्ट या प्रतिनिधि स्रोत है; पुल मोड में संदर्भ में दूरस्थ होस्ट स्रोत है।


1
मैंने पाया है कि synchroniseमॉड्यूल अन्य तरीकों की तुलना में बहुत अधिक विश्वसनीय और स्केलेबल होने के लिए है, जो कि फ़ाइलों की नकल करने के लिए अन्य तरीकों से हैं।
लड़कियों को

3
यह निश्चित रूप से स्वीकृत उत्तर की तुलना में बेहतर तरीका है।
बच्चे का जन्म

5

मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है अन्यथा मैं इसे जोड़ देता।

मैं इस्तेमाल किया जो K usedstutis पोस्ट किया। मुझे थोड़ा संशोधन करना पड़ा

- shell: (cd /remote; find . -maxdepth 1 -type f) | cut -d'/' -f2
  register: files_to_copy

- fetch: src=/remote/{{ item }} dest=/local/
  with_items: "{{ files_to_copy.stdout_lines }}"

With_items वह क्षेत्र था जिसे मुझे बदलना पड़ा। यह अन्यथा फ़ाइलों का पता लगाने में सक्षम नहीं था।


2

ऊपर दिए गए उदाहरण को ठीक करना

- hosts: srv-test
  tasks:
    - find: paths="/var/tmp/collect" recurse=no patterns="*.tar"
      register: files_to_copy
    - fetch: src={{ item.path }} dest=/tmp
      with_items: "{{ files_to_copy.files }}"

1

ठीक है, अगर आप नवीनतम संस्करण का उपयोग कर रहे हैं, जैसे 2.2.1.0, मुझे लगता है कि हमें आइटम के लिए उद्धरण की आवश्यकता है

- name: use find to get the files list which you want to copy/fetch
  find: 
    paths: /etc/
    patterns: ".*passwd$"
    use_regex: True   
  register: file_2_fetch

- name: use fetch to get the files
  fetch:
    src: "{{ item.path }}"
    dest: /tmp/
    flat: yes
  with_items: "{{ file_2_fetch.files }}"


0

मैं इसका उपयोग करता हूं: 1. दूरस्थ मेजबान से विशिष्ट मेजबानों तक निर्देशिकाओं को खींचो

- name: Gather hosts stats from other hosts
  shell: " scp -r {{results_root_dir_src}} root@{{groups['profiling_server'][0]}}:{{results_root_dir_dest}}/abc/"
  when: "'profiling_server' not in group_names"
#It will not run on the node where the directories need to be copied.
  1. नोड से लोकलहोस्ट के लिए निर्देशिकाओं को खींचो
- name: Gather from host to local
  delegate_to: 127.0.0.1
  run_once: true
  become: false
  shell: "scp -r root@{{groups['profiling_server'][0]}}:{{results_root_dir}} ./results_local_location "

सूची

[nodes]
server1
server2
server3
[profiling_server]
server1

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