使用Ansible运行apt-get autoremove


23

我用ansible维护了很多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 autoremove与ansible 一起跑步?


1
您始终可以使用该command模块执行原始shell命令。
ceejayoz 2014年

Answers:


26

从2.1版本开始,Ansible的(option )内置了对该apt-get选项的支持。官方文档位于http://docs.ansible.com/ansible/apt_module.html。--auto-removeaptautoremove

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

合并发生在这里

请注意,autoclean自2.4版本起


您能否添加参考链接?
亚当·马坦

@AdamMatan更新了答案,并提供了指向文档的链接。
oalders '16

1
如果在此处检查您将看到带有“状态”选项的“自动删除”被认为是错误。Ansible开发团队将需要定义“自动删除”是Ansible 2.2的一个选项还是全部操作(我希望...)
Yonsy Solis 16-10-19

@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代码中),因此有时可能会错误地将所需的软件包检测为可自动删除,这可能会导致服务器无法正常工作。另一方面,将未使用的程序包留在系统上没什么大不了的,除非您对服务器的设置进行了重大更改,否则这并不常见。

因此,如果没有人工确认,我将远离自动删除软件包。


Ansible不一定将软件包标记为“手动”,即使您已使用apt模块安装了它们。因此,“ autoremove”可能会删除错误的软件包。快速解决:使用apt-mark manual <pkg>
Willem'3

1
在Ubuntu上,如果不执行常规自动删除,则/ boot可能会填满,直到填满!大多数情况下,autoremove仅删除了较旧的未使用内核。因为,这需要定期检查,所以应该自动化。:-)在Fedora / RHEL上,您可以指示yum / dnf仅保留一定数量的软件包(例如3个内核版本),因此您永远不会遇到这个问题。
惠更斯岛2015年

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 autoremove不会返回非零状态。因此,看来您可以无条件运行,--dry-run并检查changed_when我认为的实际autoremove调用。
thom_nic 2015年

@thom_nic我认为你是对的。我能够这样构造:-名称:自动删除未使用的软件包:是命令:apt-get -y自动删除寄存器:check_autoremovechanged_when:“'软件包将在check_autoremove.stdout中被删除'”
Luke Hoersten 2015年

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”字符串的问题是它不是“便携式”的。apt-get --dry-run autoremove | grep "to remove"在Ubuntu 14.04上执行return 的执行,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不匹配的返回。
惠更斯岛2015年

总是很难匹配不断变化的文本。大概installinstall(ed)?或类似的东西代替。
马丁·塔普

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 :

谢谢您的修饰Dave James Miller

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.