Menjalankan apt-get autoremove dengan ansible

23

Saya memelihara kawanan server EC2 dengan memungkinkan. Server secara teratur diperbarui dan ditingkatkan menggunakan modul apt .

Ketika saya mencoba memutakhirkan server secara manual, saya menerima pesan berikut:

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

Apakah ada cara untuk menjalankan sudo apt-get autoremovedengan kemungkinan?

Adam Matan
sumber
1
Anda selalu dapat menggunakan commandmodul untuk melakukan perintah raw shell.
ceejayoz

Jawaban:

26

Dukungan untuk apt-getopsi --auto-removesekarang dimasukkan ke dalam apt(opsi autoremove) Ansible pada versi 2.1. Dokumentasi resmi ada di http://docs.ansible.com/ansible/apt_module.html

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

Penggabungan terjadi di sini .

Catatan yang autocleanjuga tersedia pada 2.4

oalders
sumber
Bisakah Anda menambahkan tautan referensi?
Adam Matan
@AdamMatan Jawaban yang diperbarui dengan tautan ke dokumen.
Penumpang
1
jika Anda memeriksa di sini Anda akan melihat bahwa "autoremove" dengan opsi "state" dianggap sebagai bug. Tim dev Ansible akan perlu mendefinisikan jika "autoremove" akan menjadi hanya sebuah pilihan atau operasi penuh untuk Ansible 2.2 (saya harap ...)
Yonsy Solis
@YonsySolis seseorang membajak jawaban ini melalui edit. Saya telah mengembalikannya ke kondisi semula.
Penatua
1
@flickerfly menurut dokumen Anda harus dapat menjalankan ini tanpa harus memberikan nama paket. Saya telah memperbarui jawaban saya untuk mencerminkan ini.
Penumpang
14

Metode sederhana ini hanya membutuhkan satu tugas

  - name: Autoremove unused packages
    command: apt-get -y autoremove
    register: autoremove_output
    changed_when: "'The following packages will be REMOVED' in autoremove_output.stdout"
cortopy
sumber
ini mungkin jawaban yang seharusnya diterima.
ab77
9

Anda dapat melakukannya dengan command(belum diuji):

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

Namun, saya pikir itu bisa berisiko untuk berjalan autoremovesecara otomatis. Karena kesalahan administrasi sistem yang pernah Anda buat di masa lalu (ini mungkin dalam kode yang dimungkinkan), mungkin paket yang diperlukan pada titik tertentu dapat dideteksi secara salah sebagai autoremovable, dan ini dapat menghentikan server agar tidak berfungsi. Di sisi lain, itu bukan masalah besar untuk meninggalkan paket yang tidak digunakan pada sistem, dan itu tidak terlalu umum kecuali jika Anda membuat perubahan besar dalam pengaturan server.

Karena itu, saya akan tinggal jauh dari paket autoremoving tanpa konfirmasi dari manusia.

Antonis Christofides
sumber
Ansible tidak selalu menandai paket sebagai 'manual', bahkan jika Anda telah menginstalnya menggunakan modul apt. Jadi 'autoremove' mungkin menghapus paket yang salah. Perbaikan cepat: gunakanapt-mark manual <pkg>
Willem
1
Di Ubuntu, jika Anda tidak melakukan autoremove secara teratur, / boot Anda mungkin terisi hingga penuh! Kebanyakan autoremove hanya menghapus kernel lama yang tidak terpakai. Karena, ini perlu pemeriksaan rutin, harus otomatis. :-) Pada Fedora / RHEL, Anda dapat menginstruksikan yum / dnf untuk hanya menyimpan sejumlah paket tertentu (seperti 3 versi kernel), sehingga Anda tidak pernah mengalami masalah ini.
Huygens
6

Ini adalah variasi pada solusi yang disediakan Antonis Christofides. Ini diuji dan bekerja untuk saya. Saya menghindari menggunakan Abses_errors dalam perintah cek. Kalau tidak, biasanya mengambil pendekatan yang sama.

- 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"
Marwan Alsabbagh
sumber
Apa alasan untuk yang --dry-runpertama? apt-get -y autoremovetidak mengembalikan status tidak nol. Jadi sepertinya Anda bisa tanpa syarat menjalankan --dry-rundan memeriksa changed_whenterhadap panggilan autoremove yang sebenarnya saya pikir.
thom_nic
@ thom_nic Saya pikir Anda benar. Saya dapat membuat struktur seperti ini: - nama: autoremove paket yang tidak digunakan menjadi: ya perintah: apt-get -y register autoremove: check_autoremove berubah_ketika: "'paket akan dihapus' di check_autoremove.stdout"
Luke Hoersten
2

Variasi yang menyoroti perubahan paket (tugas pertama akan berwarna hijau atau kuning yang sesuai):

  - 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
Martin Tapp
sumber
Masalah dengan string "sed" Anda adalah bahwa itu bukan "portable". Eksekusi apt-get --dry-run autoremove | grep "to remove"pengembalian pada Ubuntu 14,04, 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.tetapi pada Ubuntu 15,04 itu mengembalikan 0 to upgrade, 0 to newly install, 0 to remove and 0 not to upgrade.yang sed Anda tidak cocok.
Huygens
Selalu sulit untuk mencocokkan perubahan teks. Mungkin ganti installdengan install(ed)?atau sesuatu seperti itu.
Martin Tapp
1

Saya suka metode yang disederhanakan ini , dan saya menambahkan beberapa cek dan cetak pesan untuk saya.

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

Terima kasih untuk cortopy dan Dave James Miller .

Chu-Saing Lai
sumber