Chạy apt-get autoremove với ansible


23

Tôi duy trì một đàn máy chủ EC2 với ansible. Các máy chủ thường xuyên được cập nhật và nâng cấp bằng cách sử dụng mô đun apt .

Khi tôi cố gắng nâng cấp máy chủ theo cách thủ công, tôi nhận được thông báo sau:

$ 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.

Có cách nào để chạy sudo apt-get autoremovevới ansible?


1
Bạn luôn có thể sử dụng commandmô-đun để thực hiện lệnh shell thô.
ceejayoz

Câu trả lời:


26

Hỗ trợ cho apt-gettùy chọn --auto-removenày hiện được tích hợp vào apt(tùy chọn autoremove) của Ansible kể từ phiên bản 2.1 Tài liệu chính thức có tại http://docs.ansible.com/ansible/apt_module.html

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

Sự hợp nhất đã xảy ra ở đây .

Lưu ý rằng autocleancũng có sẵn từ 2.4


Bạn có thể vui lòng thêm một liên kết tham khảo?
Adam Matan

@AdamMatan Cập nhật câu trả lời với một liên kết đến các tài liệu.
oalder

1
nếu bạn kiểm tra ở đây, bạn sẽ thấy "autoremove" với tùy chọn "trạng thái" được coi là một lỗi. Nhóm phát triển Ansible sẽ cần xác định xem "autoremove" sẽ chỉ là một tùy chọn hay hoạt động đầy đủ cho Ansible 2.2 (tôi hy vọng ...)
Yonsy Solis

@YonsySolis ai đó đã chiếm đoạt câu trả lời này thông qua chỉnh sửa. Tôi đã hoàn nguyên nó về trạng thái ban đầu.
oalder

1
@flickerfly theo các tài liệu bạn sẽ có thể chạy cái này mà không phải cung cấp tên gói. Tôi đã cập nhật câu trả lời của mình để phản ánh điều này.
oalder

14

Phương pháp đơn giản hóa này chỉ yêu cầu một nhiệm vụ

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

đây có lẽ nên là câu trả lời được chấp nhận
ab77

9

Bạn có thể làm điều đó với command(chưa được kiểm tra):

  - 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"

Tuy nhiên, tôi nghĩ việc chạy autoremovetự động có thể gặp rủi ro . Do các lỗi quản trị hệ thống mà bạn đã mắc phải trong quá khứ (những lỗi này có thể nằm trong mã có thể tìm thấy của bạn), có thể một gói cần thiết có thể được phát hiện sai ở chế độ tự động và điều này có thể ngăn máy chủ hoạt động. Mặt khác, sẽ không có vấn đề gì lớn khi để các gói không sử dụng trên hệ thống và nó không phổ biến trừ khi bạn thực hiện một thay đổi lớn trong thiết lập của máy chủ.

Do đó, tôi sẽ tránh xa các gói autoremoving mà không cần xác nhận từ con người.


Ansible không nhất thiết đánh dấu các gói là 'thủ công', ngay cả khi bạn đã cài đặt chúng bằng mô-đun apt. Vì vậy, 'autoremove' có thể loại bỏ các gói sai. Khắc phục nhanh: sử dụngapt-mark manual <pkg>
Willem

1
Trên Ubuntu, nếu bạn không thực hiện tự động thường xuyên, thì / boot của bạn có thể đầy cho đến khi đầy! Chủ yếu là autoremove chỉ loại bỏ kernel cũ không sử dụng. Bởi vì, điều này cần kiểm tra thường xuyên, nó nên được tự động hóa. :-) Trên Fedora / RHEL, bạn có thể hướng dẫn yum / dnf chỉ giữ một số gói nhất định (như 3 phiên bản kernel), vì vậy bạn không bao giờ gặp phải vấn đề này.
Huygens

6

Đây là một biến thể của giải pháp Antonis Christofides cung cấp. Nó được thử nghiệm và làm việc cho tôi. Tôi tránh sử dụng ign_errors trong lệnh kiểm tra. Mặt khác, nó thường có cùng một cách tiếp cận.

- 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"

Lý do cho một --dry-runđầu tiên là gì? apt-get -y autoremovekhông trả về trạng thái khác không. Vì vậy, có vẻ như bạn có thể chạy vô điều kiện mà không cần --dry-runvà kiểm tra changed_whenđối với cuộc gọi tự động thực tế mà tôi nghĩ.
thom_nic

@thom_nic Tôi nghĩ bạn đúng. Tôi đã có thể cấu trúc như thế này: - Tên: gói không sử dụng autoremove trở thành: lệnh yes: apt-get -y autoremove đăng ký: changed_when check_autoremove: " 'gói sẽ được REMOVED' trong check_autoremove.stdout"
Luke Hoersten

2

Một biến thể làm nổi bật sự thay đổi trong các gói (nhiệm vụ đầu tiên sẽ được tô màu xanh lá cây hoặc vàng một cách thích hợp):

  - 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

Vấn đề với chuỗi "sed" của bạn là nó không "di động". Việc thực hiện apt-get --dry-run autoremove | grep "to remove"trả về trên Ubuntu 14.04, 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.nhưng trên Ubuntu 15.04, nó trả về giá trị 0 to upgrade, 0 to newly install, 0 to remove and 0 not to upgrade.mà sed của bạn không khớp.
Huygens

Luôn luôn khó để phù hợp với văn bản thay đổi. Có lẽ thay thế installbằng install(ed)?hoặc một cái gì đó như thế.
Martin Tapp

1

Tôi thích phương pháp đơn giản hóa này và tôi thêm một số thông báo kiểm tra và in cho tôi.

#!/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 :

Cảm ơn bạn vì vỏ nãoDave James Miller .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.