Aptible के साथ उपयुक्त- autoremove चलाना


23

मैं ansible के साथ EC2 सर्वर का एक झुंड बनाए रखता हूं। सर्वर नियमित रूप से अपडेट होते हैं और उपयुक्त मॉड्यूल का उपयोग करके अपग्रेड किए जाते हैं ।

जब मैंने मैन्युअल रूप से सर्वर को अपग्रेड करने की कोशिश की, तो मुझे निम्नलिखित संदेश मिला:

$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages were automatically installed and are no longer required:
  linux-headers-3.13.0-29 linux-headers-3.13.0-29-generic
  linux-headers-3.13.0-32 linux-headers-3.13.0-32-generic
  linux-image-3.13.0-29-generic linux-image-3.13.0-32-generic
Use 'apt-get autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

क्या एक तरीका है कि अपने आप को चलाने योग्य है sudo apt-get autoremove?


1
commandकच्चे शेल कमांड करने के लिए आप हमेशा मॉड्यूल का उपयोग कर सकते हैं ।
ceejayoz

जवाबों:


26

apt-getविकल्प के लिए समर्थन --auto-removeअब संस्करण 2.1 के रूप में Ansible apt(विकल्प autoremove) में बनाया गया है। आधिकारिक दस्तावेज http://docs.ansible.com/ansible/apt_module.html पर है

- name: Remove dependencies that are no longer required
  apt:
    autoremove: yes

मर्ज यहीं हुआ ।

ध्यान दें कि autoclean2.4 के रूप में भी उपलब्ध है


क्या आप कृपया एक संदर्भ लिंक जोड़ सकते हैं?
एडम मटन

@AdamMatan डॉक्स के लिंक के साथ अपडेट किया गया उत्तर।
ओलाडर्स

1
यदि आप यहाँ जाँच करते हैं, तो आप देखेंगे कि "ऑटोरेमोव" को "राज्य" विकल्प के साथ बग माना जाता है। अन्सिबल देव टीम को परिभाषित करने की आवश्यकता होगी कि क्या "ऑटोरेमोव" केवल एक विकल्प या अंसिबेल 2.2 (मुझे आशा है ...) के लिए एक पूर्ण ऑपरेशन होगा
Yonsy Solis

@YonsySolis किसी ने इस उत्तर को एक संपादन के माध्यम से अपहरण कर लिया। मैंने इसे इसकी मूल स्थिति में वापस ला दिया है।
oalders

1
@flickerfly डॉक्स के अनुसार आपको पैकेज नाम प्रदान किए बिना इसे चलाने में सक्षम होना चाहिए। मैंने इसे दर्शाने के लिए अपना उत्तर अपडेट कर दिया है।
जूल

14

इस सरलीकृत विधि को केवल एक कार्य की आवश्यकता होती है

  - name: Autoremove unused packages
    command: apt-get -y autoremove
    register: autoremove_output
    changed_when: "'The following packages will be REMOVED' in autoremove_output.stdout"

यह संभवतः स्वीकृत उत्तर होना चाहिए।
77

9

आप इसे command(अप्राप्त) कर सकते हैं :

  - name: Check if anything needs autoremoving
    shell: apt-get -y --dry-run autoremove | grep -q "0 to remove"
    register: check_autoremove
    ignore_errors: True
    changed_when: False
    always_run: True

  - name: Autoremove unused packages
    command: apt-get -y autoremove
    when: "check_autoremove.rc != 0"

हालांकि, मुझे लगता है कि autoremoveस्वचालित रूप से चलना जोखिम भरा हो सकता है । सिस्टम एडमिनिस्ट्रेशन त्रुटियों के कारण जो आपने अतीत में की है (ये आपके कोड में हो सकता है), यह संभव है कि जिस पैकेज की आवश्यकता हो, उसे किसी बिंदु पर गलत तरीके से पहचाना जा सके, और यह सर्वर को काम करने से रोक सकता है। दूसरी ओर, सिस्टम पर अप्रयुक्त पैकेजों को छोड़ना कोई बड़ी बात नहीं है, और यह बहुत सामान्य नहीं है जब तक कि आप सर्वर के सेटअप में एक बड़ा बदलाव नहीं करते हैं।

इसलिए, मैं एक मानव से पुष्टि के बिना ऑटोरेमोविंग पैकेज से दूर रहूंगा।


आवश्यक रूप से पैकेजों को 'मैनुअल' के रूप में चिह्नित नहीं किया जाता है, भले ही आपने उन्हें उपयुक्त मॉड्यूल का उपयोग करके स्थापित किया हो। इसलिए 'ऑटोरेमोव' गलत पैकेजों को हटा सकता है। त्वरित सुधार: उपयोगapt-mark manual <pkg>
विलेम

1
उबंटू पर, यदि आप नियमित ऑटोरेमोव नहीं करते हैं, तो आपका / बूट तब तक भर सकता है जब तक कि यह भरा न हो! ज्यादातर ऑटोरेमोव ने केवल पुराने अप्रयुक्त कर्नेल को हटा दिया है। क्योंकि, इसे नियमित जांच की जरूरत है, इसे स्वचालित होना चाहिए। :-) फेडोरा / RHEL पर, आप yum / dnf को केवल एक निश्चित संख्या में पैकेज (जैसे 3 कर्नेल संस्करण) रखने के लिए निर्देश दे सकते हैं, इसलिए आपको यह समस्या कभी नहीं होगी।
ह्यूजेंस

6

एंटोनिस क्रिस्टोफ़ाइड्स द्वारा प्रदान किए गए समाधान पर यह एक भिन्नता है। यह मेरे लिए परीक्षण और काम करता है। मैंने चेक कमांड में ign_errors का उपयोग करने से परहेज किया। अन्यथा यह आम तौर पर एक ही दृष्टिकोण लेता है।

- name: Check if packages need to be autoremoved
  command: apt-get --dry-run autoremove
  register: check_autoremove
  changed_when: False
- name: Autoremove unused packages
  command: apt-get -y autoremove
  when: "'packages will be REMOVED' in check_autoremove.stdout"

--dry-runपहले का कारण क्या है ? apt-get -y autoremoveएक गैर-शून्य स्थिति वापस नहीं करता है। तो ऐसा लगता है कि आप बिना शर्त के चल सकते हैं --dry-runऔर changed_whenवास्तविक ऑटोरेमोव कॉल के खिलाफ जांच कर सकते हैं जो मुझे लगता है।
thom_nic

@thom_nic मुझे लगता है कि आप सही हैं। मैं इस तरह की संरचना करने में सक्षम था: - नाम: ऑटोरेमोव अप्रयुक्त पैकेज बन जाते हैं: हां कमांड: apt-get -y ऑटोरेमोव रजिस्टर: check_autoremove change_when: "check_autoremove.stdout में पैकेज 'रिमूव हो जाएंगे"
ल्यूक होएरस्टेन

2

एक भिन्नता जो संकुल में परिवर्तन को उजागर करती है (पहला कार्य उचित रूप से हरे या पीले रंग का होगा):

  - name: check if packages need to be autoremoved
    shell: apt-get --dry-run autoremove | grep "to remove" | sed "s/^[0-9]\+ upgraded, [0-9]\+ newly installed, \([0-9]\+\) to remove and [0-9]\+ not upgraded\.$/\1/"
    register: check_autoremove
    changed_when: check_autoremove.stdout != "0"

  - name: autoremove unused packages
    command: apt-get -y autoremove
    when: check_autoremove.changed

आपके "sed" स्ट्रिंग के साथ समस्या यह है कि यह "पोर्टेबल" नहीं है। apt-get --dry-run autoremove | grep "to remove"उबंटू 14.04 पर रिटर्न का निष्पादन , 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.लेकिन उबंटू 15.04 पर यह वापस लौटता है 0 to upgrade, 0 to newly install, 0 to remove and 0 not to upgrade.जो आपके सेड से मेल नहीं खाता है।
Huygens

हमेशा बदलते पाठ से मेल खाना मुश्किल है। शायद के installसाथ install(ed)?या कुछ ऐसा है।
मार्टिन टैप सिप

1

मुझे यह सरलीकृत विधि पसंद है , और मैं अपने लिए कुछ चेक और प्रिंट संदेश जोड़ता हूं।

#!/usr/bin/env ansible-playbook
---

- name: Autoremove 'apt' package for Debian, Ubuntu
  hosts: all

  pre_tasks:
    - name: check storage space - before
      shell: df -h
      register: check_storage_space_before

    - name: print storage space
      debug:
        msg: "{{ check_storage_space_before.stdout_lines }}"

    - name: apt autoremove check 
      command: apt-get -y --dry-run autoremove
      register: apt_autoremove_output

    - name: print apt autoremove packages
      debug:
        msg: "{{ apt_autoremove_output.stdout_lines }}"

  tasks:    
    - name: autoremove unused packages
      become: yes
      command: apt-get -y autoremove
      changed_when: "'The following packages will be REMOVED' in apt_autoremove_output.stdout"

  post_tasks:
    - name: check storage space - after
      shell: df -h
      register: check_storage_space_after

    - name: print storage space
      debug:
        msg: "{{ check_storage_space_after.stdout_lines }}"

# vim: ft=ansible :

कोर्टी और डेव जेम्स मिलर के लिए धन्यवाद ।

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