2016-07-05 7 views
67

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

- name: remove web dir contents 
    file: path='/home/mydata/web/{{ item }}' state=absent 
    with_fileglob: 
     - /home/mydata/web/* 

नोट: मैंने आदेश और खोल का उपयोग करके आरएम-आरएफ की कोशिश की है, लेकिन वे काम नहीं करते हैं। शायद मैं उन्हें गलत तरीके से उपयोग कर रहा हूं।

सही दिशा में कोई भी मदद की सराहना की जाएगी।

मैं उपयोग कर रहा हूँ ansible 2.1.0.0

+0

एक बग की तरह लग रहा में निम्नलिखित पंक्तियाँ जोड़ें। – ceving

उत्तर

61

कोड नीचे artifact_path

- name: Clean artifact path 
    file: 
    state: absent 
    path: "{{ artifact_path }}/" 

नोट की संपूर्ण सामग्री हटा देगा: यह भी निर्देशिका को नष्ट करेगा।

+0

क्या आप कृपया गायब उद्धरणों के साथ कोड प्रदान कर सकते हैं और जहां वे होना चाहिए, मैंने कोशिश करते समय त्रुटियों को फेंक दिया। – Abbas

+1

उद्धरणों की आवश्यकता नहीं है। यह केवल मेरा कामकाजी कोड है। artifact_path की तरह है/ऐप/my_app/work/ –

+0

आपको क्या त्रुटि मिल रही है? कृपया इसे पोस्ट करें। –

37

का उपयोग खोल मॉड्यूल:

- shell: /bin/rm -rf /home/mydata/web/* 

साफ समाधान यदि आप निर्माण तिथि के बारे में परवाह नहीं है:

- file: path=/home/mydata/web state=absent 
- file: path=/home/mydata/web state=directory 
+2

काम करता है लेकिन फाइलों को शुरू नहीं करता है। जैसे .htaccess – Abbas

+0

शैल ने भी मेरे लिए काम किया। सटीक वही कार्य लेकिन 'कमांड' के लिए 'shell' में बदल दिया गया और यह – SomethingOn

+0

काम करता है वाइल्डकार्ड कमांड के साथ काम नहीं करेगा क्योंकि उन्हें विस्तार – JamesP

12

नीचे आदेश की कोशिश, यह काम करना चाहिए

- shell: ls -1 /some/dir 
    register: contents 

- file: path=/some/dir/{{ item }} state=absent 
    with_items: {{ contents.stdout_lines }} 
+1

के लिए खोल की आवश्यकता होती है, जिसे आप '{,}} के साथ' //_}} प्राप्त करने के लिए पिछली पंक्ति से सही ढंग से बचने के लिए चूक गए हैं: "{{content.stdout_lines}}" ' –

+0

फ़ाइल नाम प्राप्त करने के लिए 'ls'' आउटपुट का उपयोग करना खतरनाक है क्योंकि यह नए अक्षरों जैसे विशेष वर्णों के साथ फ़ाइल नामों को सही तरीके से मुद्रित नहीं करता है। – bfontaine

1

का उपयोग करना फ़ाइल ग्लोब भी यह काम करेगा। आपके द्वारा पोस्ट किए गए कोड में कुछ वाक्यविन्यास त्रुटि है। मैंने संशोधित और परीक्षण किया है यह काम करना चाहिए।

- name: remove web dir contents 
    file: 
    path: "{{ item }}" 
    state: absent 
    with_fileglob: 
    - "/home/mydata/web/*" 
+6

'with_fileglob' केवल स्थानीय मशीन पर काम करता है, दूरस्थ नहीं; क्या यह सच नहीं है? –

+0

सच .. with_fileglob स्थानीय केवल –

+0

के लिए है, यह निर्देशिका को हटा नहीं देता है, बस फाइलें हटा दी जाती हैं। – vikas027

16

निर्देशिका (मूल रूप से https://stackoverflow.com/a/38201611/1695680 की एक प्रति) निकालें, Ansible हुड के नीचे rmtree के साथ इस आपरेशन करता है।

- name: remove files and directories 
    file: 
    state: "{{ item }}" 
    path: "/srv/deleteme/" 
    owner: 1000 # set your owner, group, and mode accordingly 
    group: 1000 
    mode: '0777' 
    with_items: 
    - absent 
    - directory 

आप पूरी निर्देशिका को दूर करने और पुनः बनाने के लक्जरी नहीं है, तो आप इसे फ़ाइलों के लिए, (और निर्देशिका) स्कैन कर सकते हैं, और एक एक करके उन्हें हटा दिया। इसमें कुछ समय लगेगा। आप शायद यह सुनिश्चित करना चाहते हैं कि आपके ansible.cfg पर [ssh_connection]\npipelining = True है।

- block: 
    - name: 'collect files' 
    find: 
     paths: "/srv/deleteme/" 
     hidden: True 
     recurse: True 
     # file_type: any # Added in ansible 2.3 
    register: collected_files 

    - name: 'collect directories' 
    find: 
     paths: "/srv/deleteme/" 
     hidden: True 
     recurse: True 
     file_type: directory 
    register: collected_directories 

    - name: remove collected files and directories 
    file: 
     path: "{{ item.path }}" 
     state: absent 
    with_items: > 
     {{ 
     collected_files.files 
     + collected_directories.files 
     }} 
0

मान लिया जाये कि आप लिनक्स में हमेशा से रहे हैं, find cmd प्रयास करें।

- name: Clean everything inside {{ item }} 
    shell: test -d {{ item }} && find {{ item }} -path '{{ item }}/*' -prune -exec rm -rf {} \; 
    with_items: [/home/mydata/web] 

यह फ़ाइलें/फ़ोल्डर/के तहत /home/mydata/web

-4

नीचे मेरे लिए काम किया छिपा का सफाया करना चाहिए,

- name: Ansible delete html directory 
    file: 
    path: /var/www/html 
    state: directory 
1

Ansible अभी भी state = empty https://github.com/ansible/ansible-modules-core/issues/902

my_folder: "/home/mydata/web/" 
empty_path: "/tmp/empty" 


- name: "Create empty folder for wiping." 
    file: 
    path: "{{ empty_path }}" 
    state: directory 

- name: "Wipe clean {{ my_folder }} with empty folder hack." 
    synchronize: 
    mode: push 

    #note the backslash here 
    src: "{{ empty_path }}/" 

    dest: "{{ nl_code_path }}" 
    recursive: yes 
    delete: yes 
    delegate_to: "{{ inventory_hostname }}" 
लागू करने के लिए बहस है जबकि

नोट हालांकि, सिंक्रनाइज़ करने के साथ आप वैसे भी अपनी फ़ाइलों को सिंक करने में सक्षम होना चाहिए (हटाएं)।

1

यहां खाली फ़ोल्डर के लिए एक मुद्दा है, https://github.com/ansible/ansible/issues/18910

और अब के लिए, यह समाधान मेरे लिए काम करता है।

एक खाली फ़ोल्डर

makedir /tmp/empry 

बनाने तो ansible प्लेबुक

- name: Empty remote directory 
synchronize: 
    src: /tmp/empry/ 
    dest: /home/mydata/web/ 
    delete: yes 
    recursive: yes 
संबंधित मुद्दे