ansible로 apt-get 자동 제거 실행


23

EC2 서버 무리를 관리 할 수 ​​있습니다. 서버는 apt 모듈을 사용하여 정기적으로 업데이트 및 업그레이드됩니다 .

서버를 수동으로 업그레이드하려고 할 때 다음 메시지가 나타납니다.

$ 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 로 달리는 방법이 있습니까?


1
항상 command모듈을 사용하여 원시 쉘 명령을 수행 할 수 있습니다 .
ceejayoz

답변:


26

apt-get옵션 지원 은 버전 2.1 --auto-remove부터 Ansible apt(옵션 autoremove)에 기본 제공됩니다. 공식 문서는 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
여기서 확인 하면 "state"옵션이있는 "autoremove"가 버그로 간주됩니다. "autoremove는"단지 옵션 또는 Ansible 2.2에 대한 본격 가동 될 경우 Ansible 개발팀이 정의해야합니다 (I는 ... 희망)
Yonsy 솔리스

@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은 apt 모듈을 사용하여 패키지를 설치 한 경우에도 반드시 패키지를 '수동'으로 표시하지는 않습니다. 따라서 'autoremove'는 잘못된 패키지를 제거 할 수 있습니다. 빠른 수정 : 사용apt-mark manual <pkg>
Willem

1
Ubuntu에서 정기적 인 자동 제거를 수행하지 않으면 / boot가 가득 찰 때까지 / boot가 채워질 수 있습니다! 대부분 autoremove는 사용하지 않는 오래된 커널 만 제거했습니다. 정기적 인 점검이 필요하기 때문에 자동화되어야합니다. :-) Fedora / RHEL에서는 yum / dnf가 특정 개수의 패키지 (3 커널 버전 등) 만 유지하도록 지시 할 수 있으므로이 문제는 발생하지 않습니다.
Huygens

6

이것은 Antonis Christofides가 제공 한 솔루션의 변형입니다. 테스트되어 저에게 효과적입니다. check 명령에서 ignore_errors를 사용하지 않았습니다. 그렇지 않으면 일반적으로 동일한 접근 방식이 필요합니다.

- 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 autoremove0이 아닌 상태를 반환하지 않습니다. 따라서 무조건 실행하지 않고 실제 자동 제거 호출에 대해 --dry-run확인할 수 changed_when있습니다.
thom_nic

@thom_nic 당신이 옳다고 생각합니다. 이 같은 구조 할 수 있었다 : - 이름 : autoremove되지 않는 패키지가 될 : 예 명령 : apt-get을 -y autoremove 등록 : check_autoremove changed_when을 "check_autoremove.stdout에 '패키지가 제거됩니다'"
누가 복음 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"문자열의 문제점은 "portable"이 아니라는 것입니다. 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

변화하는 텍스트와 항상 일치하지 않습니다. 아마 교체 installinstall(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 :

cortopyDave James Miller 에게 감사합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.