দূরবর্তী সিস্টেমে একটি উত্তর মডিউল ব্যবহার করে কোনও ফাইল / ডিরেক্টরি সরানো / নামকরণ কীভাবে সম্ভব? আমি কমান্ড / শেল কাজগুলি ব্যবহার করতে চাই না এবং আমি স্থানীয় সিস্টেম থেকে দূরবর্তী সিস্টেমে ফাইলটি অনুলিপি করতে চাই না।
দূরবর্তী সিস্টেমে একটি উত্তর মডিউল ব্যবহার করে কোনও ফাইল / ডিরেক্টরি সরানো / নামকরণ কীভাবে সম্ভব? আমি কমান্ড / শেল কাজগুলি ব্যবহার করতে চাই না এবং আমি স্থানীয় সিস্টেম থেকে দূরবর্তী সিস্টেমে ফাইলটি অনুলিপি করতে চাই না।
উত্তর:
ফাইল মডিউল দূরবর্তী সিস্টেমে ফাইলগুলি অনুলিপি করে না। Src পরামিতি কেবলমাত্র ফাইল মডিউল দ্বারা ব্যবহৃত হয় যখন কোনও ফাইলে একটি সিমলিংক তৈরি করা হয়।
আপনি যদি কোনও দূরবর্তী সিস্টেমে কোনও ফাইল পুরোপুরি সরিয়ে নিতে / নাম পরিবর্তন করতে চান তবে আপনার সেরা বেট হ'ল কমান্ড মডিউলটি কেবলমাত্র উপযুক্ত কমান্ডটি চাওয়ার জন্য:
- name: Move foo to bar
command: mv /path/to/foo /path/to/bar
আপনি যদি অভিনবতা পেতে চান তবে আপনি প্রথমে স্টু মডিউলটি ব্যবহার করতে পারবেন যে foo আসলে রয়েছে:
- name: stat foo
stat: path=/path/to/foo
register: foo_stat
- name: Move foo to bar
command: mv /path/to/foo /path/to/bar
when: foo_stat.stat.exists
removes: /path/to/fooএবং ব্যবহার করেন তবে আপনাকে ম্যানুয়ালি ফাইলটির অস্তিত্ব পরীক্ষা করতে হবে না creates: /path/to/bar। @ ফন্যান্ট ইতিমধ্যে অন্য উত্তরের মন্তব্য হিসাবে এটি উল্লেখ করেছেন, তবে এটি যেহেতু গৃহীত উত্তর তাই আমি আবার এটি উল্লেখ করতে চাই।
সংস্করণ 2.0 থেকে , অনুলিপি মডিউলটিতে আপনি remote_srcপ্যারামিটার ব্যবহার করতে পারেন ।
যদি True এটা src জন্য দূরবর্তী / লক্ষ্য মেশিনে যাব।
- name: Copy files from foo to bar
copy: remote_src=True src=/path/to/foo dest=/path/to/bar
আপনি যদি ফাইলটি সরাতে চান তবে আপনার ফাইল মডিউল সহ পুরানো ফাইলটি মুছতে হবে
- name: Remove old files foo
file: path=/path/to/foo state=absent
সংস্করণ ২.৮ থেকে অনুলিপি মডিউল remote_src পুনরাবৃত্তির অনুলিপি সমর্থন করে।
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
কমান্ড মডিউলটিতে ক্রিয়েস বিকল্পটি আমি দরকারী খুঁজে পেয়েছি। এটি সম্পর্কে:
- name: Move foo to bar
command: creates="path/to/bar" mv /path/to/foo /path/to/bar
ব্রুস পি পরামর্শ মতো স্ট্যাটাস ব্যবহার করে আমি 2 টি টাস্ক অ্যাপ্রোচ করতাম। এখন আমি ক্রিয়েটগুলির সাথে একটি কাজ হিসাবে এটি করি। আমি মনে করি এটি অনেক পরিষ্কার।
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
আর একটি অপশন যা আমার পক্ষে ভাল কাজ করেছে তা হ'ল সিঙ্ক্রোনাইজ মডিউলটি । তারপরে ফাইল মডিউলটি ব্যবহার করে মূল ডিরেক্টরিটি সরান।
এখানে ডক্স থেকে একটি উদাহরণ দেওয়া হয়েছে:
- synchronize:
src: /first/absolute/path
dest: /second/absolute/path
archive: yes
delegate_to: "{{ inventory_hostname }}"
destডিরেক্টরি একই মেশিনে থাকা সত্ত্বেও এসএসএইচের মাধ্যমে অ্যাক্সেস করা হয়।
এটি অর্জনের আরেকটি উপায় হ'ল এটি ব্যবহার fileকরা state: hard।
আমি কাজ করতে পেল এটি একটি উদাহরণ:
- name: Link source file to another destination
file:
src: /path/to/source/file
path: /target/path/of/file
state: hard
যদিও শুধুমাত্র লোকালহোস্টে (ওএসএক্স) পরীক্ষিত, তবে এটি লিনাক্সেও কাজ করা উচিত। আমি উইন্ডোজের জন্য বলতে পারি না।
নোট করুন যে পরম পাথ প্রয়োজন। অন্যথায় এটি আমার লিঙ্কটি তৈরি করতে দেয় না। এছাড়াও আপনি ফাইল সিস্টেমগুলি অতিক্রম করতে পারবেন না, সুতরাং যে কোনও মাউন্ট মিডিয়াতে কাজ করা ব্যর্থ হতে পারে।
হার্ডলিঙ্কটি সরানোর মতোই অনুরূপ, যদি আপনি পরে উত্স ফাইলটি সরিয়ে থাকেন:
- name: Remove old file
file:
path: /path/to/source/file
state: absent
আরেকটি সুবিধা হ'ল আপনি যখন কোনও নাটকের মাঝামাঝি থাকেন তখন পরিবর্তনগুলি বজায় থাকে। সুতরাং কেউ যদি উত্স পরিবর্তন করে তবে কোনও পরিবর্তন লক্ষ্য ফাইলটিতে প্রতিফলিত হয়।
এর মাধ্যমে আপনি কোনও ফাইলের লিঙ্কের সংখ্যা যাচাই করতে পারেন ls -l। হার্ডলিঙ্কগুলির সংখ্যা মোডের পাশে প্রদর্শিত হয় (যেমন rwxr-xr-x 2, যখন কোনও ফাইলে 2 লিঙ্ক থাকে)।
ব্রুস ফাইলটি ইতিমধ্যে উপস্থিত থাকলে তা স্থানান্তরিত করবে কি না তা পরীক্ষা করার জন্য গন্তব্য স্থির করার চেষ্টা করছিল না; তিনি নিশ্চিত করেছিলেন যে এমভি করার চেষ্টা করার আগে ফাইলটি সরানো হবে বাস্তবে তার অস্তিত্ব রয়েছে।
টমসের মতো যদি আপনার আগ্রহটি কেবল তখনই সরানো হয় যা ফাইলটি ইতিমধ্যে বিদ্যমান না থাকে তবে আমি মনে করি আমাদের এখনও ব্রুসের চেকটি মিশ্রণে একীকরণ করা উচিত:
- name: stat foo
stat: path=/path/to/foo
register: foo_stat
- name: Move foo to bar
command: creates="path/to/bar" mv /path/to/foo /path/to/bar
when: foo_stat.stat.exists
এটি আমার পক্ষে এটি কাজ করার উপায়:
Tasks:
- name: checking if the file 1 exists
stat:
path: /path/to/foo abc.xts
register: stat_result
- name: moving file 1
command: mv /path/to/foo abc.xts /tmp
when: stat_result.stat.exists == True
উপরের প্লেবুকটি টিএমপি ফোল্ডারে ফাইল স্থানান্তরিত করার আগে ফাইল abc.xts উপস্থিত কিনা তা পরীক্ষা করবে।
when: stat_result.stat.exists == True। শুধু ব্যবহার when: stat_result.stat.existsযথেষ্ট যথেষ্ট।
== Trueকারণটি ব্যবহার করি কারণ যখন ফাইলটি পাওয়া যায় না বা থাকে তখন আমি সবসময় কিছু না কিছু করি == False।
stat exists সম্পত্তি একটি booleanমান দেয়। সুতরাং, যদি আপনি কেবল when: stat_result.stat.existsএই ফাইলটি উপস্থিত থাকেন তবে এটি শর্তটি পূরণ করবে যদি এটি একই রকম হয় when: stat_result.stat.exists == Trueতবে আরও পাঠ্য এবং অপ্রয়োজনীয় শর্তাধীন চেক সহ।
এটি ওভারকিলের মতো মনে হতে পারে তবে আপনি যদি কমান্ড মডিউলটি ব্যবহার করা এড়াতে চান (যা আমি করি কারণ এটি কমান্ড ব্যবহার করা আদর্শ নয়) আপনি অনুলিপি এবং অনার্ক্রাইভের সংমিশ্রণটি ব্যবহার করতে পারেন।
আপনি এটি দ্বারা এটি করতে পারেন -
অ্যাডহক কমান্ড ব্যবহার করা হচ্ছে
ansible all -m command -a" mv /path/to/foo /path/to/bar"
অথবা আপনি যদি প্লেবুক ব্যবহার করে এটি করতে চান তবে আপনি
- name: Move File foo to destination bar
command: mv /path/to/foo /path/to/bar
আমি জানি এটি একটি বছর পুরনো বিষয়, তবে আমি হতাশ হয়ে পড়েছিলাম এবং ফাইলের একটি স্বেচ্ছাসেবী তালিকার জন্য ঠিক এমনটি করার জন্য একটি ভূমিকা তৈরি করেছি। আপনি ফিট দেখতে দেখতে প্রসারিত করুন:
main.yml
- name: created destination directory
file:
path: /path/to/directory
state: directory
mode: '0750'
- include_tasks: move.yml
loop:
- file1
- file2
- file3
move.yml
- name: stat the file
stat:
path: {{ item }}
register: my_file
- name: hard link the file into directory
file:
src: /original/path/to/{{ item }}
dest: /path/to/directory/{{ item }}
state: hard
when: my_file.stat.exists
- name: Delete the original file
file:
path: /original/path/to/{{ item }}
state: absent
when: my_file.stat.exists
নোট করুন যে এখানে লিঙ্কিং অনুলিপি করা ভাল, কারণ এটি অন্তর্নিহিত মালিকানা এবং অনুমতি সংরক্ষণ করে (ফাইলের দ্বিতীয় অনুলির জন্য আরও বেশি ডিস্কের জায়গা গ্রহণ না করা)।