Executando o apt-get autoremove com ansible

23

Eu mantenho um bando de servidores EC2 com ansible. Os servidores são atualizados e atualizados regularmente usando o módulo apt .

Quando tentei atualizar manualmente um servidor, recebi a seguinte mensagem:

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

Existe uma maneira de correr sudo apt-get autoremovecom ansible?

Adam Matan
fonte
1
Você sempre pode usar o commandmódulo para executar um comando shell bruto.
ceejayoz

Respostas:

26

O suporte para a apt-getopção --auto-removeagora está incorporado no apt(opcional autoremove) da Ansible a partir da versão 2.1. A documentação oficial está disponível em http://docs.ansible.com/ansible/apt_module.html

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

A fusão aconteceu aqui .

Observe que autocleantambém está disponível a partir do 2.4

Oalders
fonte
Você poderia adicionar um link de referência?
precisa
@AdamMatan Resposta atualizada com um link para os documentos.
oalders
1
se você verificar aqui , verá que "autoremove" com a opção "state" é considerado um bug. Dev team Ansible precisará definir se "autoremove" será apenas uma opção ou uma operação completa para Ansible 2.2 (espero ...)
Yonsy Solis
@YonsySolis alguém sequestrou esta resposta por meio de uma edição. Eu o revertei ao seu estado original.
oalders
1
@flickerfly de acordo com os documentos, você poderá executar isso sem precisar fornecer um nome de pacote. Atualizei minha resposta para refletir isso.
Oalders 06/07
14

Este método simplificado requer apenas uma tarefa

  - name: Autoremove unused packages
    command: apt-get -y autoremove
    register: autoremove_output
    changed_when: "'The following packages will be REMOVED' in autoremove_output.stdout"
cortopia
fonte
essa provavelmente deve ser a resposta aceita.
ab77 23/03
9

Você pode fazer isso com command(não testado):

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

No entanto, acho que pode ser arriscado executar autoremoveautomaticamente. Devido a erros de administração do sistema que você cometeu no passado (esses podem estar no seu código ansível), é possível que um pacote necessário possa em algum momento ser falsamente detectado como autoremovível, e isso pode impedir o funcionamento do servidor. Por outro lado, não é grande coisa deixar pacotes não utilizados no sistema, e isso não é muito comum, a menos que você faça uma grande alteração na configuração do servidor.

Portanto, eu ficaria longe dos pacotes de remoção automática sem confirmação de um ser humano.

Antonis Christofides
fonte
O Ansible não marca necessariamente os pacotes como 'manuais', mesmo se você os tiver instalado usando o módulo apt. Portanto, 'autoremove' pode remover os pacotes errados. Correção rápida: useapt-mark manual <pkg>
Willem
1
No Ubuntu, se você não fizer uma remoção automática regular, o seu / boot poderá ser preenchido até que esteja cheio! Principalmente, o autoremove removeu apenas o kernel não utilizado mais antigo. Porque, isso precisa de verificação regular, deve ser automatizado. :-) No Fedora / RHEL, você pode instruir o yum / dnf a manter apenas um certo número de pacotes (como 3 versões do kernel), para que você nunca tenha esse problema.
Huygens
6

Essa é uma variação da solução que Antonis Christofides forneceu. É testado e funciona para mim. Evitei usar ignore_errors no comando check. Caso contrário, geralmente usa a mesma abordagem.

- 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
fonte
Qual o motivo de uma --dry-runprimeira vez? apt-get -y autoremovenão retorna um status diferente de zero. Portanto, parece que você poderia executar incondicionalmente sem a --dry-runverificação e changed_whencontra a chamada de remoção automática real, eu acho.
Thom_nic
@ thom_nic Eu acho que você está certo. Eu consegui estruturar assim: - nome: autoremove os pacotes não utilizados tornam-se: yes comando: apt-get -y autoremove register: check_autoremove mudou_when: "'os pacotes serão REMOVIDOS' em check_autoremove.stdout"
Luke Hoersten em
2

Uma variação que destaca a alteração nos pacotes (a primeira tarefa será adequadamente colorida em verde ou amarelo):

  - 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
fonte
O problema com sua string "sed" é que ela não é "portátil". A execução de apt-get --dry-run autoremove | grep "to remove"retornos no Ubuntu 14.04, 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.mas no Ubuntu 15.04 ele retorna com o 0 to upgrade, 0 to newly install, 0 to remove and 0 not to upgrade.qual o seu sed não corresponde.
Huygens
Sempre difícil de corresponder ao texto alterado. Provavelmente substitua installpor install(ed)?ou algo parecido.
Martin Tapp
1

Eu gosto desse método simplificado e adiciono algumas mensagens de verificação e impressão para mim.

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

Obrigado pela cortopia e Dave James Miller .

Chu-Saing Lai
fonte