किसी दूरस्थ प्रणाली पर एक Ansible मॉड्यूल का उपयोग करके किसी फ़ाइल / निर्देशिका को स्थानांतरित / नाम देना कैसे संभव है? मैं कमांड / शेल कार्यों का उपयोग नहीं करना चाहता और मैं स्थानीय सिस्टम से रिमोट सिस्टम में फाइल कॉपी नहीं करना चाहता।
किसी दूरस्थ प्रणाली पर एक Ansible मॉड्यूल का उपयोग करके किसी फ़ाइल / निर्देशिका को स्थानांतरित / नाम देना कैसे संभव है? मैं कमांड / शेल कार्यों का उपयोग नहीं करना चाहता और मैं स्थानीय सिस्टम से रिमोट सिस्टम में फाइल कॉपी नहीं करना चाहता।
जवाबों:
फ़ाइल मॉड्यूल दूरस्थ सिस्टम पर फ़ाइलों की प्रतिलिपि नहीं बनाता है। 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
। @Fonant ने पहले ही एक अन्य उत्तर पर टिप्पणी के रूप में इसका उल्लेख किया था, लेकिन जैसा कि यह स्वीकार किया गया है, मैं इसे फिर से इंगित करना चाहता हूं।
संस्करण 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
संस्करण 2.8 से कॉपी मॉड्यूल 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
SSH के माध्यम से एक्सेस किया जाता है, भले ही निर्देशिका उसी मशीन पर हो।
एक और तरीका है इस लक्ष्य को हासिल करने के लिए उपयोग कर रहा है file
के साथ state: hard
।
यह एक उदाहरण है जो मुझे काम करने के लिए मिला है:
- name: Link source file to another destination
file:
src: /path/to/source/file
path: /target/path/of/file
state: hard
केवल स्थानीयहोस्ट (OSX) पर परीक्षण किया गया है, लेकिन लिनक्स पर भी काम करना चाहिए। मैं विंडोज के लिए नहीं बता सकता।
ध्यान दें कि पूर्ण पथ की आवश्यकता है। और यह मुझे लिंक बनाने नहीं देगा। इसके अलावा, आप फाइल सिस्टम को पार नहीं कर सकते, इसलिए किसी भी माउंटेड मीडिया के साथ काम करना विफल हो सकता है।
यदि आप स्रोत फ़ाइल को बाद में हटाते हैं तो हार्डलिंक हिलना के समान है:
- 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
ऊपर प्लेबुक, यह जांच करेगा कि फ़ाइल abmpxts फ़ाइल tmp फ़ोल्डर में ले जाने से पहले मौजूद है या नहीं।
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"
या आप यदि आप playbook का उपयोग करके करना चाहते हैं
- 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
ध्यान दें कि हार्ड लिंकिंग यहां कॉपी करने के लिए बेहतर है, क्योंकि यह स्वाभाविक रूप से स्वामित्व और अनुमतियों को संरक्षित करता है (फ़ाइल की दूसरी प्रतिलिपि के लिए अधिक डिस्क स्थान का उपभोग नहीं करने के अलावा)।