Apt-get autoremove programını ansible ile çalıştırma


23

Çok fazla miktarda EC2 sunucusu var. Sunucular düzenli olarak apt modülü kullanılarak güncellenir ve yükseltilir .

Bir sunucuyu el ile yükseltmeye çalıştığımda, aşağıdaki mesajı aldım:

$ 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 autoremoveAnsible ile koşmanın bir yolu var mı ?


1
commandHam bir kabuk komutu yapmak için her zaman modülü kullanabilirsiniz .
ceejayoz

Yanıtlar:


26

Bu apt-getseçenek için destek --auto-removeşimdi 2.1 sürümünden itibaren Ansible'ın apt(isteğe bağlı autoremove) içine yerleştirilmiştir . Resmi belgeler http://docs.ansible.com/ansible/apt_module.html adresindedir.

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

Birleşme burada oldu .

2.4'ten itibaren autocleande mevcut olduğuna dikkat edin.


Lütfen referans linki ekler misiniz?
Adam Matan

@AdamMatan Dokümanlara bağlantı içeren cevap güncellendi.
oalders

1
Burada kontrol ederseniz, "durum" seçeneği ile "otomatik" nin bir hata olarak kabul edildiğini göreceksiniz. Ansible dev ekibinin "otomatik oymanın" sadece Ansible 2.2 için bir seçenek mi yoksa tam bir işlem mi olacağını tanımlaması gerekecek (İnşallah ...)
Yonsy Solis,

@YonsySolis birisi bu cevabı bir düzenleme ile kaçırdı. Orijinal durumuna geri döndürdüm.
oalders

1
@flickerfly belgelere göre bir paket adı vermek zorunda kalmadan çalıştırabilmelisiniz. Bunu yansıtacak şekilde cevabımı güncelledim.
oalders

14

Bu basitleştirilmiş yöntem yalnızca bir görev gerektirir

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

Bu muhtemelen kabul edilen cevap olmalıdır.
ab77

9

command(Test edilmemiş) ile yapabilirsiniz :

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

Ancak, autoremoveotomatik olarak çalıştırmanın riskli olabileceğini düşünüyorum . Geçmişte yaptığınız sistem yönetimi hataları nedeniyle (bunlar kendi kodunuzda olabilir), ihtiyaç duyulan bir paketin bir noktada otomatik olarak taşınamaz olarak algılanması olasıdır ve bu sunucunun çalışmasını durdurabilir. Öte yandan, kullanılmayan paketleri sistemde bırakmak önemli değil ve sunucunun kurulumunda büyük bir değişiklik yapmazsanız çok da yaygın değil.

Bu nedenle, bir insanın onayı olmadan otomatik taşıma paketlerinden uzak dururdum.


Ansible, paketleri apt modülünü kullanarak kurmuş olsanız bile, 'manuel' olarak işaretlemez. Bu yüzden 'autoremove' yanlış paketleri kaldırabilir. Hızlı düzeltme: kullanımapt-mark manual <pkg>
Willem

1
Ubuntu'da, normal otomatik aramayı yapmazsanız, / boot sizin dolana kadar doluyor! Çoğunlukla otomatik olan yalnızca kullanılmayan çekirdeği kaldırır. Bunun düzenli kontrol edilmesi gerektiğinden, otomatikleştirilmesi gerekir. :-) Fedora / RHEL'de, yum / dnf komutuna yalnızca belirli sayıda paketi (3 çekirdek sürümü gibi) saklamasını söyleyebilirsiniz, böylece bu sorunla karşılaşmazsınız.
Huygens

6

Bu, Antonis Christofides’in sağladığı çözümde bir değişiklik. Test edildi ve benim için çalışıyor. Check komutunda ignore_errors kullanmaktan kaçınıyorum. Aksi takdirde, genellikle aynı yaklaşımı kullanır.

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

Birincinin sebebi nedir --dry-run? apt-get -y autoremovesıfır olmayan bir durum döndürmüyor. Öyle görünüyor ki koşulsuz olarak koşmadan koşabilir --dry-runve changed_whensanırım asıl otomatik arama çağrısına bakabilirsiniz.
thom_nic

@thom_nic Sanırım haklısın. Böyle yapıya başardı: - isim: autoremove kullanılmayan paketler haline: evet komut: apt-get -y autoremove kayıt: check_autoremove changed_when: "check_autoremove.stdout içinde 'paketler KALDIRILACAK'"
Luke Hoersten

2

Paketlerdeki değişikliği vurgulayan bir varyasyon (ilk görev uygun şekilde yeşil veya sarı renkte olacaktır):

  - 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" dizginizle ilgili sorun, "taşınabilir" olmamasıdır. apt-get --dry-run autoremove | grep "to remove"Ubuntu 14.04'te iadelerin uygulanması , 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.ancak Ubuntu 15.04'te 0 to upgrade, 0 to newly install, 0 to remove and 0 not to upgrade.sed'inizin uymadığı döner .
Huygens

Değişen metni eşleştirmek her zaman zor. Muhtemelen installbununla install(ed)?ya da onun gibi bir şeyle değiştirin .
Martin Tapp

1

Bu basitleştirilmiş yöntemi seviyorum ve benim için bazı kontrol ve yazdırma mesajları ekliyorum.

#!/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 ve Dave James Miller için teşekkürler .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.