कई फ़ाइलों को कॉपी करें


104

किसी कार्य में Ansible द्वारा दूरस्थ नोड्स में एक से अधिक फ़ाइल की प्रतिलिपि कैसे बना सकता हूं?

मैंने फ़ाइलों को परिभाषित करने के लिए अपने कार्य में कॉपी मॉड्यूल लाइन की नकल करने की कोशिश की है लेकिन यह केवल पहली फ़ाइल की प्रतिलिपि बनाता है।

जवाबों:


131

आप इसके लिए with_fileglobलूप का उपयोग कर सकते हैं :

- copy:
    src: "{{ item }}"
    dest: /etc/fooapp/
    owner: root
    mode: 600
  with_fileglob:
    - /playbooks/files/fooapp/*

3
यह तरीका मेरी मदद कर सकता है अगर मैंने अपनी सभी फाइलें रिमोट मशीन में कॉपी करने के लिए एक ही रूट में रखी हैं, तो विभिन्न निर्देशिकाओं में कुछ फाइलें होने के बारे में क्या है। उदाहरण के लिए, मैं 3 अलग निर्देशिका से 3 फ़ाइलों की प्रतिलिपि बनाना चाहता हूं
मार्क

अरे, मैं अपने से सभी फ़ाइलों को स्थानांतरित करने की कोशिश कर रहा हूं, /roles/db/filesलेकिन मैं इसे इस विधि के साथ काम नहीं कर सकता। मैंने कोशिश की है, with_fileglob: - /roles/db/file/* लेकिन यह ठीक नहीं होगा
बैटमैन

इस विधि के साथ बड़ा नुकसान यह है कि यह निर्देशिका संरचना को समतल करता है।
क्विंटन Par

115
- name: Your copy task
  copy: src={{ item.src }} dest={{ item.dest }}
  with_items:
    - { src: 'containerizers', dest: '/etc/mesos/containerizers' }
    - { src: 'another_file', dest: '/etc/somewhere' }
    - { src: 'dynamic', dest: '{{ var_path }}' }
  # more files here

क्या destसेट के साथ इस समाधान को एक चर के रूप में होना संभव है? { src: 'containerizers', dest: {{ containerizers }} }
गेसियास

2
@ जीसस, हां। वास्तव में, दोनों पक्ष चर हो सकते हैं:{ src: '{{ source.var }}', dest: '{{ dest.var }}' }
ntwrkguru

16

आप इस उद्देश्य के लिए with_t पूरी तरह से उपयोग कर सकते हैं:

- name: Copy multiple files to multiple directories
  copy: src={{ item.0 }} dest={{ item.1 }}
  with_together:
    - [ 'file1', 'file2', 'file3' ]
    - [ '/dir1/', '/dir2/', '/dir3/' ]

यद्यपि यह काम करता है, यह शब्दार्थ से साफ नहीं है - क्लीनर विकल्प हैं।
plesiv

11

यदि आपको एक से अधिक स्थान चाहिए, तो आपको एक से अधिक कार्य करने होंगे। एक प्रतिलिपि कार्य नोड पर केवल एक स्थान (कई फ़ाइलों सहित) से दूसरे को कॉपी कर सकता है।

- copy: src=/file1 dest=/destination/file1
- copy: src=/file2 dest=/destination/file2

# copy each file over that matches the given pattern
- copy: src={{ item }} dest=/destination/
  with_fileglob:
    - /files/*

- नाम: copy file1 copy: src = / file1 dest = / गंतव्य / file1 - नाम: copy file2 copy: src = / file2 dest = / गंतव्य / file2
मार्क

निर्भर करता है। सरल और संभावित क्लीनर, लेकिन अधिक जटिल डेटा संरचनाओं का उपयोग करके किया जा सकता है, जैसे स्रोत और लक्ष्य डेटा के साथ अनाम शब्दकोशों की सूची, with_items के साथ पाला गया। यह किसी भी भाषा में समान है - आपको एक निर्णय कॉल करना होगा। ऐसे मामले हैं जहां एक प्रतिनिधिमंडल समारोह बयानों की नकल / पेस्ट की एक लंबी श्रृंखला की तुलना में अधिक कुशल और बनाए रखने योग्य है। मैं वह सनकी हूं जो लगभग समान निर्देशों की लंबी और थकाऊ सूची की तुलना में अच्छी तरह से संरचित कोड के संक्षिप्त बिट को बनाए रखेगा, लेकिन मुझे नहीं लगता कि हर कोई सहमत है। आपके लिए जो है वह कायम है।
पॉल होडगेस

8

चूंकि अन्सिबल 2.5 का with_*निर्माण किया गया है , और loopसिंटैक्स का उपयोग किया जाना चाहिए। एक सरल व्यावहारिक उदाहरण:

- name: Copy CA files
  copy:
    src: '{{item}}'
    dest: '/etc/pki/ca-trust/source/anchors'
    owner: root
    group: root
    mode: 0644
  loop:
    - symantec-private.crt
    - verisignclass3g2.crt


7
- hosts: lnx
  tasks:
    - find: paths="/appl/scripts/inq" recurse=yes patterns="inq.Linux*"
      register: file_to_copy
    - copy: src={{ item.path }} dest=/usr/local/sbin/
      owner: root
      mode: 0775
      with_items: "{{ files_to_copy.files }}"

सिर्फ एक पक्ष ध्यान दें कि findमॉड्यूल केवल ansible 2.x के लिए काम करता है, लेकिन ansible 1.x के लिए नहीं
Arbab Nazar

मैंने आपका उत्तर तय कर दिया है क्योंकि आपने stdout_linesरिटर्न वैल्यू में उल्लेख किया है लेकिन findमॉड्यूल के लिए लागू नहीं है । यह केवल है files, examinedऔर matchedवापसी मूल्यों के रूप में। आशा है कि दूसरों की मदद करने के लिए
Arbab Nazar

2
क्या कोई इस काम को दूरस्थ नोड्स में फ़ाइलों की प्रतिलिपि बनाने में सक्षम है? findकेवल रिमोट सिस्टम को देखने के लिए लगता है, प्रबंध नोड से कुछ भी हड़पने की अनुमति नहीं है। ये उत्तर, का उपयोग करते हुए with_fileglob, अधिक उपयुक्त प्रतीत होते हैं: stackoverflow.com/a/42290160/272387 , stackoverflow.com/a/36720342/272387
रिचलेव

4

या आप with_items का उपयोग कर सकते हैं:

- copy:
    src: "{{ item }}"
    dest: /etc/fooapp/
    owner: root
    mode: 600
  with_items:
    - dest_dir

3
- name: find inq.Linux*
  find:  paths="/appl/scripts/inq" recurse=yes patterns="inq.Linux*"
  register: find_files


- name: set fact
  set_fact:
    all_files:
      - "{{ find_files.files | map(attribute='path') | list }}"
  when: find_files > 0


- name: copy files
  copy:
    src: "{{ item }}"
    dest: /destination/
  with_items: "{{ all_files }}"
  when: find_files > 0

6
एक अच्छे उत्तर में न केवल कोड होता है, बल्कि कुछ स्पष्टीकरण या प्रलेखन संदर्भ भी होते हैं।
लॉरेंज एल्बे

खोज, set_fact और प्रतिलिपि मॉड्यूल सभी को एक ही दस्तावेज़ीकरण में समझाया गया है। फिल्टर के बारे में पढ़ें, यह भी ansible दस्तावेज में विस्तार से बताया है, तो आप इस अनुभाग के बारे में अधिक पता करने के लिए whant (- "{{find_files.files | मानचित्र (attribute'path ') | सूची}}")
फ्रेडरिक एंडरसन

1

आप निर्देशिका की सूची के साथ चर के माध्यम से लूप कर सकते हैं:

- name: Copy files from several directories
  copy:
    src: "{{ item }}"
    dest: "/etc/fooapp/"
    owner: root
    mode: "0600"
  loop: "{{ files }}"
  vars:
    files:
      - "dir1/"
      - "dir2/"

1

अपने क्लाइंट मशीन पर कई फ़ाइलों की प्रतिलिपि के लिए निम्न स्रोत कोड का उपयोग करें।


 - name: Copy data to the client machine
   hosts: hostname
   become_method: sudo
   become_user: root
   become: true
   tasks: 
     # Copy twice as sometimes files get skipped (mostly only one file skipped from a folder if the folder does not exist)
     - name: Copy UFO-Server 
       copy:
         src: "source files path"
         dest: "destination file path"
         owner: root
         group: root
         mode: 0644
         backup: yes
       ignore_errors: true

ध्यान दें:

अगर आप वेरिएबल का उपयोग करके कई रास्ते से गुजर रहे हैं

src: "/ root / {{item}}"

यदि आप विभिन्न मदों के लिए एक चर का उपयोग करके पथ से गुजर रहे हैं

src: "/ root / {{item.source_path}}"


0

copyमॉड्यूल कई फ़ाइलों और / या निर्देशिका संरचना की नकल करने के लिए एक गलत उपकरण है, synchronizeइसके बजाय मॉड्यूल का उपयोग करें जो rsyncबैकएंड के रूप में उपयोग करता है । आप पर ध्यान दें, इसके लिए rsyncकंट्रोलर और टारगेट होस्ट दोनों पर इंस्टॉल होना आवश्यक है। यह वास्तव में शक्तिशाली है, ansible प्रलेखन की जाँच करें

उदाहरण - लक्ष्य मेजबान पर निर्देशिका buildकी नियंत्रक से निर्देशिका (उपनिर्देशिकाओं के साथ) की प्रतिलिपि फाइलें /var/www/html:

synchronize:
  src: ./my-static-web-page/build/
  dest: /var/www/html
  rsync_opts:
    - "--chmod=D2755,F644" # copy from windows - force permissions
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.