रिमोट सिस्टम पर एक Ansible कार्य का उपयोग करके किसी फ़ाइल को कैसे स्थानांतरित / नाम बदलें


202

किसी दूरस्थ प्रणाली पर एक Ansible मॉड्यूल का उपयोग करके किसी फ़ाइल / निर्देशिका को स्थानांतरित / नाम देना कैसे संभव है? मैं कमांड / शेल कार्यों का उपयोग नहीं करना चाहता और मैं स्थानीय सिस्टम से रिमोट सिस्टम में फाइल कॉपी नहीं करना चाहता।


आप कमांड / शेल का उपयोग क्यों नहीं करना चाहते हैं?
निक अर्बन

4
बस यह जानना चाहता था कि क्या उल्लिखित कार्यों का उपयोग किए बिना कोई रास्ता है। लगता है, फिलहाल कोई और रास्ता नहीं है।
क्रिश्चियन बेरेन्ट

1
आप इसे कॉपी के बजाय विशेष रूप से स्थानांतरित क्यों करना चाहते हैं? यह एक प्रकार की कार्रवाई की तरह प्रतीत होता है, न कि एक प्रणाली के प्रकार के एक अत्याधुनिक सुनिश्चित करने के बजाय।
निक अर्बन

2
मेरे पास आरपीएम पैकेज में शामिल एक नमूना कॉन्फ़िगरेशन फ़ाइल है और मैं इस नमूना कॉन्फ़िगरेशन फ़ाइल को स्थानांतरित करना चाहता हूं।
क्रिश्चियन बेरेन्ट

1
फिलहाल मैं फ़ाइल को संदर्भित करने के लिए एक सिमलिंक का उपयोग कर रहा हूं। Get_url का उपयोग करना मेरे लिए कोई विकल्प नहीं है क्योंकि सिस्टम इंटरनेट तक नहीं पहुंच सकता है।
क्रिश्चियन बेरेन्ट

जवाबों:


201

फ़ाइल मॉड्यूल दूरस्थ सिस्टम पर फ़ाइलों की प्रतिलिपि नहीं बनाता है। 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

3
कमांड मॉड्यूल का उपयोग किए बिना, आपके केवल अन्य विकल्प के बारे में अपने स्वयं के कस्टम मॉड्यूल लिखना होगा।
ब्रूस पी

2
सही उत्तर के रूप में टैग किया गया क्योंकि यह दूरस्थ फ़ाइलों की प्रतिलिपि बनाने का वर्तमान तरीका है।
क्रिश्चियन बेरेन्ट

11
छलांग लगाने से पहले देखने के बारे में: क्या कोई कारण removesहै कि आप commandमॉड्यूल के विकल्प का उपयोग नहीं कर सकते हैं ( यहां दस्तावेज है )? ऐसा लगता है कि यह विकल्प सबसे पहले आंसिबल जाँच करेगा।
जिम विटशे

2
हैंडिबलर को सूचित करने के लिए अन्सिबल ट्रैक्स में परिवर्तन होता है, जो इस समाधान को उप-रूपी बनाता है।
बोह

3
यदि आप उपयोग करते हैं removes: /path/to/fooऔर आपको फ़ाइल के अस्तित्व के लिए मैन्युअल रूप से जांचने की आवश्यकता नहीं है creates: /path/to/bar। @Fonant ने पहले ही एक अन्य उत्तर पर टिप्पणी के रूप में इसका उल्लेख किया था, लेकिन जैसा कि यह स्वीकार किया गया है, मैं इसे फिर से इंगित करना चाहता हूं।
माइकल ट्रोजनेक

218

संस्करण 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 पुनरावर्ती नकल का समर्थन करता है।


29
छोटी टिप्पणी: "वर्तमान में Remote_src पुनरावर्ती प्रतिलिपि का समर्थन नहीं करता है।" ansible मॉड्यूल डॉक्टर से लिया गया। इसलिए यदि आप पुनरावर्ती रूप से कॉपी करना चाहते हैं तो भी आपको शेल / कमांड मॉड्यूल की आवश्यकता है।
कलस

23
मुझे समझ नहीं आ रहा है। नकल करना तो दूर हटना भी वैसा नहीं है। एक के लिए, यह परमाणु नहीं है। दूसरे के लिए, यह धीमी है, विशेष रूप से बड़ी फ़ाइलों के लिए। मैं Ansible के लिए नया हूं, लेकिन यह वास्तव में मेरे लिए अजीब है।
mlissner

19
@alex मैं जो कह रहा हूं वह ऐसा करने का सही तरीका नहीं हो सकता। मैं 50 कुछ अपवोट्स के खिलाफ उठ रहा हूं, लेकिन यह पागल है। एक अन्य समस्या: अनुमतियाँ और अन्य विशेषताएँ बनी नहीं हैं। दूसरा: क्या होगा अगर कॉपी के दौरान फाइल बदली जाए ?
18

2
@ हामिश डाउनर एंड एमएलसनर। मैंने यह नहीं कहा कि यह आपकी सभी जरूरतों का सबसे अच्छा समाधान है। इसके अलावा मैंने लिखा है कि यदि आप कई फ़ाइलों को कॉपी करना चाहते हैं तो आपको कॉपी मॉड्यूल का उपयोग नहीं करना चाहिए। प्रश्न पढ़ें "मैं कमांड / शेल कार्यों का उपयोग नहीं करना चाहता हूं"।
एलेक्स

7
@ यह किसी भी व्यक्ति के बारे में दूसरा सबसे ज्यादा वोट किया जाने वाला जवाब है। सवाल नकल के बारे में नहीं है। हिलने के बजाय नकल के साथ कई समस्याएं हैं इसलिए यह उत्तर गलत है। तो यह एक डाउनवोट हो जाता है। SO पर शिष्टाचार downvotes की व्याख्या करना है। जैसा कि कहीं और उल्लेख किया गया है, अब तक का सबसे अच्छा विकल्प हैcommand: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
एलेक वेन्जोवस्की

106

मैंने कमांड मॉड्यूल में उपयोगी विकल्प बनाया है। इस बारे में कैसा है:

- name: Move foo to bar
  command: creates="path/to/bar" mv /path/to/foo /path/to/bar

मैं ब्रूस पी सुझाव की तरह स्टेट का उपयोग करके एक 2 कार्य दृष्टिकोण करता था। अब मैं इसे एक कार्य के साथ बनाता हूं। मुझे लगता है कि यह बहुत स्पष्ट है।


60
या, और भी बेहतर: command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
फॉनेंट

8

एक अन्य विकल्प जिसने मेरे लिए अच्छी तरह से काम किया है वह सिंक्रोनाइज़ मॉड्यूल का उपयोग कर रहा है । फिर फ़ाइल मॉड्यूल का उपयोग करके मूल निर्देशिका को हटा दें।

यहाँ डॉक्स से एक उदाहरण है:

- synchronize:
    src: /first/absolute/path
    dest: /second/absolute/path
    archive: yes
  delegate_to: "{{ inventory_hostname }}"

यह स्थानीय रूप से हर मामले में काम नहीं करता है क्योंकि destSSH के माध्यम से एक्सेस किया जाता है, भले ही निर्देशिका उसी मशीन पर हो।
कार्ल रिक्टर

5

एक और तरीका है इस लक्ष्य को हासिल करने के लिए उपयोग कर रहा है 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 लिंक होते हैं)।


2
दुर्भाग्य से, यह निर्देशिका के लिए काम नहीं करेगा, क्योंकि निर्देशिकाओं के लिए हार्ड लिंक की अनुमति नहीं है ((
ड्रू

1
यह उत्तर लक्ष्य प्रणाली के बारे में एक धारणा बनाता है, विशेष रूप से कि src और भाग्य दोनों एक ही विभाजन पर हैं। यह सच नहीं हो सकता है और इसलिए इस उत्तर का उपयोग नहीं किया जाना चाहिए।
14

4

ब्रूस गंतव्य को स्टेट करने के लिए यह जांचने का प्रयास नहीं कर रहा था कि अगर यह पहले से ही था तो फ़ाइल को स्थानांतरित करने के लिए या नहीं; वह सुनिश्चित कर रहा था कि फ़ाइल को एमवी के प्रयास करने से पहले वास्तव में स्थानांतरित किया जाए।

यदि आपकी रुचि, टॉम की तरह है, तो केवल तभी कदम बढ़ाना है जब फ़ाइल पहले से मौजूद नहीं है, मुझे लगता है कि हमें अभी भी मिक्स के लिए ब्रूस के चेक को एकीकृत करना चाहिए:

- 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

3

यह मेरे लिए काम करने का तरीका है:

  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 फ़ोल्डर में ले जाने से पहले मौजूद है या नहीं।


3
उपयोग करने की आवश्यकता नहीं है when: stat_result.stat.exists == True। बस इस्तेमाल when: stat_result.stat.existsकरना काफी अच्छा है।
कुटुमिया 22

मैं आमतौर पर उपयोग करता == Trueहूं क्योंकि मैं हमेशा कुछ कर रहा हूं जब फ़ाइल नहीं मिली है या == False
15

मॉड्यूल संपत्ति के आधिकारिक प्रलेखन पृष्ठ केstat अनुसार existsएक booleanमूल्य देता है । इसलिए, यदि आप केवल when: stat_result.stat.existsउस शर्त को संतुष्ट करेंगे यदि फ़ाइल मौजूद है जो कि समान है, when: stat_result.stat.exists == Trueलेकिन अधिक पाठ और अनावश्यक सशर्त जांच के साथ समान है ।
कुटुमायह

0

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

  1. फ़ाइल को संग्रहीत करने के लिए टार का उपयोग करें। अगर आपको लगता है कि यह वास्तव में समझ में आता है। आप दी गई डायरेक्टरी में फाइलों की एक श्रृंखला चाहते हैं। सभी फ़ाइलों के साथ उस निर्देशिका को बनाएं और उन्हें एक टार में संग्रहित करें।
  2. अनारकली मॉड्यूल का उपयोग करें। जब आप ऐसा करते हैं, तो गंतव्य के साथ: और Remote_src: कीवर्ड, आप अपनी सभी फ़ाइलों की प्रतिलिपि एक अस्थायी फ़ोल्डर में शुरू करने के लिए रख सकते हैं और फिर उन्हें ठीक उसी जगह अनपैक कर सकते हैं जहाँ आप चाहते हैं।

टार के साथ संग्रह करने में कोई
मूर्खता नहीं है

0

आप इसे कर सकते हैं -

तदर्थ कमांड का उपयोग करना

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

0

मैं जानता हूँ कि यह एक है साल पुराने विषय है, लेकिन मैं निराश और एक भूमिका को स्वयं बनाया वास्तव में इस फाइल के एक मनमाना सूची के लिए क्या करने के लिए किया गया। जैसा कि आप फिट देखते हैं बढ़ाएँ:

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

ध्यान दें कि हार्ड लिंकिंग यहां कॉपी करने के लिए बेहतर है, क्योंकि यह स्वाभाविक रूप से स्वामित्व और अनुमतियों को संरक्षित करता है (फ़ाइल की दूसरी प्रतिलिपि के लिए अधिक डिस्क स्थान का उपभोग नहीं करने के अलावा)।


0

विंडोज पर: - name: Move old folder to backup win_command: "cmd.exe /c move /Y {{ sourcePath }} {{ destinationFolderPath }}"

उपयोग नाम बदलने के लिए नाम बदलने या रेन बजाय कमान

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