উত্তরযোগ্য সহ একাধিক ফাইল অনুলিপি করুন


108

কোনও কার্যে উত্তর দিয়ে আমি কীভাবে একাধিক ফাইলকে রিমোট নোডে অনুলিপি করতে পারি?

ফাইলগুলি সংজ্ঞায়িত করার জন্য আমি আমার কার্যটিতে অনুলিপি করার চেষ্টা করেছি তবে এটি কেবল প্রথম ফাইলটি অনুলিপি করে।

উত্তর:


138

আপনি এর with_fileglobজন্য লুপটি ব্যবহার করতে পারেন :

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

4
দূরবর্তী মেশিনে অনুলিপি করার জন্য যদি আমার সমস্ত ফাইল একই রুটে থাকতাম তবে এই ডিরেক্টরিটি আমাকে সহায়তা করতে পারে, বিভিন্ন ডিরেক্টরিতে কিছু ফাইল থাকার বিষয়ে কী আছে। উদাহরণস্বরূপ, আমি 3 টি আলাদা ডিরেক্টরি থেকে 3 টি ফাইল অনুলিপি করতে চাই
মার্ক

আরে, আমি আমার থেকে সমস্ত ফাইল সরিয়ে নেওয়ার চেষ্টা করছি /roles/db/filesতবে আমি এই পদ্ধতিতে এটি কাজ করতে পারি না। আমি চেষ্টা করেছি with_fileglob: - /roles/db/file/* কিন্তু পথটি ভাল করবে না
ব্যাটম্যান 20

এই পদ্ধতির সাথে বড় অসুবিধা হ'ল এটি ডিরেক্টরি কাঠামোকে সমান করে তোলে।
কুইন্টিন পার

119
- 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 }} }
গেসিয়াস

4
@ গেসিয়াস, হ্যাঁ প্রকৃতপক্ষে, উভয় পক্ষই পরিবর্তনশীল হতে পারে:{ src: '{{ source.var }}', dest: '{{ dest.var }}' }
এনটিউরকগুরু

16

আপনি এই উদ্দেশ্যটির জন্য_ সহ একসাথে ব্যবহার করতে পারেন:

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

যদিও এটি কাজ করে, এটি শব্দার্থগতভাবে পরিষ্কার নয় - ক্লিনার বিকল্প রয়েছে।
plesiv

12

আপনার যদি একাধিক অবস্থানের প্রয়োজন হয় তবে আপনার একাধিক কার্য প্রয়োজন need একটি অনুলিপি টাস্ক নোডের কেবলমাত্র একটি অবস্থান (একাধিক ফাইল সহ) থেকে অন্য এক জায়গায় অনুলিপি করতে পারে।

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

- নাম: কপি file1 কপি: SRC = / file1 DEST = / গন্তব্য / file1 - নাম: কপি file2 কপি: SRC = / file2 DEST = / গন্তব্য / file2
মার্ক

নির্ভর করে। সহজ এবং সম্ভবত ক্লিনার, তবে আরও জটিল ডেটা স্ট্রাকচার ব্যবহার করে করা যেতে পারে, যেমন_সামগ্রী এবং টার্গেট ডেটা সহ বেনামে অভিধানগুলির একটি তালিকা ,_পথগুলি সহ লুপ করা। এটি যে কোনও ভাষায় সমান - আপনাকে রায় দেওয়ার জন্য কল করতে হবে। এমন অনেকগুলি ক্ষেত্রে রয়েছে যে প্রতিনিধিদের কার্যকারিতা দীর্ঘ ধারাবাহিকের অনুলিপি / বিবৃতিতে পেস্ট করার চেয়ে দক্ষ এবং রক্ষণাবেক্ষণযোগ্য। আমি সেই অদ্ভুত যা প্রায়-অভিন্ন নির্দেশাবলীর দীর্ঘ এবং ক্লান্তিকর তালিকার চেয়ে ভাল কাঠামোগত কোডের সংক্ষিপ্ত বিটটি বজায় রাখতে চাই, তবে আমি সবাই একমত বলে ধরে নিই না। আপনার জন্য যা রক্ষণাবেক্ষণযোগ্য তা করুন।
পল হজস

10

Ansible 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


8
- 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মডিউলটি কেবল উত্তরসূচক 2.x এর জন্য কাজ করে তবে উত্তরযোগ্য 1.x এর জন্য নয়
নজর

আমি আপনার উত্তরটি স্থির করেছি কারণ আপনি stdout_linesরিটার্ন মানটিতে উল্লেখ করেছেন তবে findমডিউলটির জন্য প্রযোজ্য নয় । এটি কেবল আছে files, examinedএবং matchedফেরতের মান হিসাবে। আশা করি এটি অন্যকে সহায়তা করবে
আরবব নজর

4
দূরবর্তী নোডগুলিতে ফাইলগুলি অনুলিপি করতে কেউ কি এই কাজটি করতে সক্ষম হয়েছে? findকেবল ম্যানেজিং নোড থেকে কিছু দখল করার অনুমতি না দিয়ে দূরবর্তী সিস্টেমটি দেখে মনে হচ্ছে। এই উত্তরগুলি ব্যবহার করে with_fileglobআরও মানানসই বলে মনে হচ্ছে: stackoverflow.com/a/42290160/272387 , stackoverflow.com/a/36720342/272387
রিচলভ


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
একটি ভাল উত্তরের মধ্যে কেবল কোডই থাকে না তবে কিছু ব্যাখ্যা বা ডকুমেন্টেশন রেফারেন্সও থাকে।
লরেনজ আলবে

অনুসন্ধান, সেট_ফ্যাক্ট এবং অনুলিপি মডিউলগুলি সমস্ত উত্তরযোগ্য ডকুমেন্টেশনে ব্যাখ্যা করা হয়েছে। ফিল্টারগুলি সম্পর্কেও পড়ুন, উত্তরীয় ডকুমেন্টেশনেও ব্যাখ্যা করা হয়েছে আপনি যদি এই বিভাগটি সম্পর্কে আরও জানতে চান (- "{{find_files.files | মানচিত্র (বৈশিষ্ট্য'পাথ ') | তালিকা}}")
ফ্রেড্রিক অ্যান্ডারসন

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: "/ রুট / {{আইটেম}}"

যদি আপনি বিভিন্ন আইটেমের জন্য একটি ভেরিয়েবল ব্যবহার করে পাথ পার করছেন then

src: "/ রুট / {{আইটেম.সোর্স_পথ}}"


0

copyমডিউল অনেকগুলি ফাইল এবং / অথবা ডিরেক্টরি কাঠামো অনুলিপি করার জন্য একটি ভুল সরঞ্জাম, synchronizeপরিবর্তে মডিউল ব্যবহার করে যা rsyncব্যাকএন্ড হিসাবে ব্যবহার করে । মনে মনে, এটি rsyncনিয়ামক এবং লক্ষ্য হোস্ট উভয়ই ইনস্টল করা প্রয়োজন । এটি সত্যই শক্তিশালী, উত্তরযোগ্য ডকুমেন্টেশন পরীক্ষা করুন ।

উদাহরণ - লক্ষ্য হোস্টের ডিরেক্টরিতে 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.