2014-11-17 7 views
9

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

मेरे पास "ansible_mounts" के माध्यम से "size_total" और "size_available" तक पहुंच है। i.e .:

ansible myhost -m setup -a 'filter=ansible_mounts' 
myhost | success >> { 
"ansible_facts": { 
    "ansible_mounts": [ 
     { 
      "device": "/dev/mapper/RootVolGroup00-lv_root", 
      "fstype": "ext4", 
      "mount": "/", 
      "options": "rw", 
      "size_available": 5033046016, 
      "size_total": 8455118848 
     }, 

मैं उन मूल्यों का उपयोग कैसे करूं, और मैं जवाब के आधार पर सशर्त रूप से उनके कार्यों के आधार पर कार्य कैसे करूं?

उत्तर

12

Slava के जवाब निश्चित रूप से सही रास्ते पर था, यहाँ मैं क्या प्रयोग किया जाता है:

- name: test for available disk space 
    assert: 
    that: 
     - not {{ item.mount == '/' and (item.size_available < item.size_total - (item.size_total|float * 0.8)) }} 
     - not {{ item.mount == '/var' and (item.size_available < item.size_total - (item.size_total|float * 0.8)) }} 
    with_items: ansible_mounts 
    ignore_errors: yes 
    register: disk_free 

- name: free disk space 
    command: "/some/command/that/fixes/it" 
    when: disk_free|failed 

ज़ोर काम बस एक शर्त के लिए परीक्षण, स्थापना करके ignore_errors, और परीक्षण के नतीजे को एक नए चर में पंजीकृत करने के बाद हम असफल होने के परिणामस्वरूप असफल होने की बजाए नाटक में बाद में एक सशर्त कार्य कर सकते हैं।

परीक्षण स्वयं शायद अधिक कुशलता से लिखे जा सकते हैं, लेकिन पठनीयता की लागत पर। इसलिए मैंने उदाहरण में एक बहु-सूची लूप का उपयोग नहीं किया। इस मामले में कार्य माउंट किए गए फाइल सिस्टम (एक उत्तरदायी निर्मित तथ्य, जिसे ansible_mounts कहा जाता है) की सूची में प्रत्येक आइटम पर लूप करता है।

परीक्षण को नकारते हुए हम फाइल सिस्टम माउंट्स पर असफल होने से बचते हैं, हमारी सूची में नहीं, तो सरल गणित हैंडल बाकी। जिस हिस्से ने मुझे फिसल दिया वह यह था कि आकार_अक्ति और आकार_टॉटल चर तार थे, इसलिए प्रतिशत की गणना करने से पहले एक जिन्जा फ़िल्टर उन्हें एक फ्लोट में बदल देता है।

+2

कृपया अपने कोड का कुछ स्पष्टीकरण जोड़ें। – Nilambar

+0

जब मैंने यह कोशिश की, तो मुझे यह त्रुटि मिली: "त्रुटि थी: 'यूनिकोड ऑब्जेक्ट' में कोई विशेषता नहीं है 'माउंट' ' – konrad

+0

' कोई विशेषता नहीं 'माउंट"' समस्या का उत्तर उपयोग करना है: with_items: '{{ansible_mounts }} '... हालांकि, सूची में असफल निर्माण का उपयोग करने का प्रयास करते समय उदाहरण (कम से कम उत्तर 2.2.1.0) को तोड़ने लगता है। .. मैं काम करने वाले दावे प्राप्त कर सकता हूं, लेकिन असफल भाग पाने में परेशानी हो रही है। – Cognitiaclaeves

2

मैं इसे परीक्षण नहीं किया था, लेकिन मैं कुछ इस तरह की कोशिश करने का सुझाव देते हैं:

file: 
    dest: /path/to/big/file 
    state: absent 
    when: "{% for point in ansible_mounts %}{% if point.mount == '/' and point.size_available > (point.size_total/100 * 85) %}true{% endif %}{% endfor %}" == "true" 

इस उदाहरण में, हम माउंट अंक से अधिक पुनरावृति और पाते हैं "/" वहाँ उपयोग के ऊपर जाता है, कि हम गणना है के बाद 85 प्रतिशत और प्रिंट "सत्य" अगर यह सच है। इसके बाद, हम उस स्ट्रिंग की तुलना करते हैं और यह तय करना चाहिए कि यह फ़ाइल हटा दी जानी चाहिए।

निम्न ब्लॉग से उदाहरण से प्रेरित होकर: https://blog.codecentric.de/en/2014/08/jinja2-better-ansible-playbooks-templates/

0

मेरे समाधान

- name: cleanup logs, free disk space below 20% 
    sudo: yes 
    command: find /var -name "*.log" \(\(-size +50M -mtime +7 \) -o -mtime +30 \) -exec truncate {} --size 0 \; 
    when: "item.mount == '/var' and (item.size_available < item.size_total * 0.2)" 
    with_items: ansible_mounts 

यह मात्रा /var है कि या तो अधिक उम्र के 7 दिन और 50M से अधिक या 30 दिनों से पुराने यदि खाली डिस्क स्थान नीचे 20% गिर जाता है कर रहे हैं पर कोई *.log फ़ाइलों काटना होगा।

3

मेरे मामले में, मुझे केवल रूट विभाजन की परवाह है। लेकिन मैंने पाया कि उपरोक्त frameloss से उदाहरण का उपयोग करते समय, मुझे एक नकारात्मक 'या' स्थिति की आवश्यकता है, क्योंकि प्रत्येक माउंट प्वाइंट को दावे के खिलाफ परीक्षण किया जाएगा। यदि एक से अधिक माउंट पॉइंट मौजूद हैं, तो इसका मतलब है कि दावा हमेशा विफल रहेगा। मेरे उदाहरण में, मैं परीक्षण कर रहा हूं कि आकार_वर्तना आकार के कुल आकार का 50% से कम है, इसे फ़्रेमेलॉस के रूप में गणना करने के बजाय।

दूसरा, कम से कम उत्तर देने वाले संस्करण के संस्करण में, {{}} चर के आसपास {_}} को शामिल करना आवश्यक था। एक गलती जिसे मैंने उपरोक्त उदाहरण में नहीं बनाया था, 'असफल' निर्देश के रूप में उसी इंडेंटेशन पर 'कब' खंड को संरेखित नहीं कर रहा था। (यदि वह गलती हो जाती है, तो समाधान काम नहीं करता है ...)

# This works with ansible 2.2.1.0 
- hosts: api-endpoints 
    become: True 
    tasks: 

    - name: Test disk space available 
     assert: 
     that: 
      - item.mount != '/' or {{ item.mount == '/' and item.size_available > (item.size_total|float * 0.4) }} 
     with_items: '{{ ansible_mounts }}' 
     ignore_errors: yes 
     register: disk_free 

    - name: Fail when disk space needs attention 
     fail: 
     msg: 'Disk space needs attention.' 
     when: disk_free|failed 
संबंधित मुद्दे