ใช้ apt-get autoremove กับ ansible


23

ฉันรักษาฝูงของเซิร์ฟเวอร์ EC2 ด้วย ansible เซิร์ฟเวอร์ที่มีการปรับปรุงอย่างสม่ำเสมอและปรับใช้โมดูลฉลาด

เมื่อฉันพยายามอัพเกรดเซิร์ฟเวอร์ฉันได้รับข้อความต่อไปนี้:

$ 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ด้วย ansible หรือไม่?


1
คุณสามารถใช้commandโมดูลเพื่อทำคำสั่ง raw shell ได้ตลอดเวลา
ceejayoz

คำตอบ:


26

ตอนนี้การสนับสนุนสำหรับapt-getตัวเลือก--auto-removeจะถูกสร้างขึ้นใน Ansible's apt(ตัวเลือกautoremove) ในเวอร์ชัน 2.1 เอกสารอย่างเป็นทางการอยู่ที่http://docs.ansible.com/ansible/apt_module.html

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

ผสานเกิดขึ้นที่นี่

โปรดทราบว่าautocleanมีให้บริการตั้งแต่ 2.4


คุณช่วยเพิ่มลิงค์อ้างอิงได้ไหม
Adam Matan

@AdamMatan อัปเดตคำตอบพร้อมลิงก์ไปยังเอกสาร
oalders

1
หากคุณตรวจสอบที่นี่คุณจะเห็นว่า "autoremove" ที่มีตัวเลือก "state" ถือเป็นข้อผิดพลาด ทีมงาน Ansible dev จะต้องกำหนดว่า "autoremove" จะเป็นเพียงตัวเลือกหรือการทำงานเต็มรูปแบบสำหรับ Ansible 2.2 (ฉันหวังว่า ... )
Yonsy Solis

@YonsySolis มีคนขโมยคำตอบนี้ผ่านการแก้ไข ฉันเปลี่ยนกลับเป็นสถานะดั้งเดิมแล้ว
oalders

1
@flickerfly ตามเอกสารที่คุณควรจะสามารถเรียกใช้โดยไม่ต้องให้ชื่อแพคเกจ ฉันได้อัปเดตคำตอบเพื่อแสดงถึงสิ่งนี้แล้ว
oalders

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"

นี่อาจเป็นคำตอบที่ยอมรับได้
ab77

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โดยอัตโนมัติ เนื่องจากข้อผิดพลาดในการดูแลระบบที่คุณเคยทำในอดีต (สิ่งเหล่านี้อาจอยู่ในรหัส ansible ของคุณ) เป็นไปได้ว่าแพคเกจที่ต้องการในบางจุดอาจถูกตรวจพบอย่างไม่ถูกต้องว่าเป็น autoremovable และสิ่งนี้อาจทำให้เซิร์ฟเวอร์ไม่ทำงาน ในทางกลับกันก็ไม่ใช่เรื่องใหญ่อะไรที่จะทิ้งแพ็คเกจที่ไม่ได้ใช้ในระบบและมันก็ไม่ใช่เรื่องธรรมดามากเว้นแต่คุณจะทำการเปลี่ยนแปลงที่สำคัญในการตั้งค่าเซิร์ฟเวอร์

ดังนั้นฉันจะอยู่ห่างจากแพ็คเกจอัตโนมัติโดยไม่มีการยืนยันจากมนุษย์


Ansible ไม่จำเป็นต้องทำเครื่องหมายแพ็คเกจเป็น 'คู่มือ' แม้ว่าคุณจะติดตั้งมันโดยใช้โมดูล apt ดังนั้น 'ระบบตอบกลับอัตโนมัติ' อาจลบแพ็คเกจที่ไม่ถูกต้อง แก้ไขด่วน: ใช้งานapt-mark manual <pkg>
Willem

1
บน Ubuntu ถ้าคุณไม่ทำระบบตอบรับอัตโนมัติปกติ / boot ของคุณอาจเต็มจนกว่าจะเต็ม! autoremove ส่วนใหญ่ลบเคอร์เนลที่ไม่ได้ใช้ที่เก่ากว่าออกเท่านั้น เพราะสิ่งนี้ต้องการการตรวจสอบเป็นประจำจึงควรเป็นแบบอัตโนมัติ :-) บน Fedora / RHEL คุณสามารถสั่ง yum / dnf เพื่อให้มีเพียงจำนวนแพ็คเกจ (เช่น 3 เคอร์เนลเวอร์ชัน) ดังนั้นคุณไม่เคยมีปัญหานี้
Huygens

6

นี่คือรูปแบบที่แตกต่างกันของวิธีการแก้ปัญหาของ Antonis Christofides มันผ่านการทดสอบและใช้งานได้สำหรับฉัน ฉันหลีกเลี่ยงการใช้ ign_errors ในคำสั่ง check มิฉะนั้นจะใช้วิธีเดียวกันโดยทั่วไป

- 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 ฉันคิดว่าคุณพูดถูก ฉันสามารถโครงสร้างเช่นนี้: - ชื่อ: autoremove แพคเกจที่ไม่ได้ใช้กลายเป็น: ใช่คำสั่ง: apt-get -y autoremove ลงทะเบียน: check_autoremove change_when: "แพ็คเกจจะถูกลบ 'ใน check_autoremove.stdout"
Luke Hoersten

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"ส่งคืนบน Ubuntu 14.04 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.แต่บน Ubuntu 15.04 จะส่งคืน0 to upgrade, 0 to newly install, 0 to remove and 0 not to upgrade.สิ่งที่ sed ของคุณไม่ตรงกัน
Huygens

จับคู่ข้อความที่เปลี่ยนแปลงยากเสมอ อาจแทนที่installด้วยinstall(ed)?หรืออะไรทำนองนั้น
Martin Tapp

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 :

ขอขอบคุณสำหรับการcortopyและเดฟเจมส์มิลเลอร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.