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 autoremoveansibleで実行する方法はありますか?


1
いつでもcommandモジュールを使用してrawシェルコマンドを実行できます。
ceejayoz 14年

回答:


26

バージョン2.1の時点で、このapt-getオプションのサポートが--auto-removeAnsibleのapt(オプションautoremove)に組み込まれました。公式ドキュメントはhttp://docs.ansible.com/ansible/apt_module.htmlにあります。

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

ここでマージが行われました

autoclean2.4以降でも利用可能であることに注意してください


参照リンクを追加していただけますか?
アダムMatan

@AdamMatanドキュメントへのリンクで回答を更新しました。
オールダーズ

1
ここでチェックすると、「状態」オプション付きの「自動削除」がバグと見なされます。Ansible開発チームは、「autoremove」がオプションまたはAnsible 2.2の完全な操作のいずれであるかを定義する必要があります(私は願っています...)
Yonsy Solis

@YonsySolis誰かが編集を介してこの回答をハイジャックしました。元の状態に戻しました。
oalders

1
ドキュメントによると、パッケージ名を指定せずにこれを実行できるはずです。これを反映するように回答を更新しました。
-oalders

14

この単純化された方法は、1つのタスクのみを必要とします

  - 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モジュールを使用してパッケージをインストールした場合でも、Ansibleは必ずしもパッケージを「手動」としてマークしません。したがって、「autoremove」は間違ったパッケージを削除する可能性があります。クイックフィックス:使用apt-mark manual <pkg>
Willem

1
Ubuntuでは、定期的な自動削除を行わないと、/ bootがいっぱいになるまでいっぱいになる可能性があります。ほとんどの場合、自動削除では古い未使用のカーネルのみが削除されます。これには定期的なチェックが必要なので、自動化する必要があります。:-) Fedora / RHELでは、特定の数のパッケージ(3つのカーネルバージョンなど)のみを保持するようにyum / dnfに指示できるため、この問題は発生しません。
ホイヘンス

6

これは、アントニスクリストフィデスが提供したソリューションのバリエーションです。それはテストされ、私のために機能します。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-runchanged_when私が思う実際の自動削除呼び出しに対してチェックすることができるようです。
-thom_nic

@thom_nicあなたは正しいと思います。次のように構成できました。-名前:未使用パッケージの自動削除:yesコマンド:apt-get -y autoremove register:check_autoremove changed_when: "check_autoremove.stdoutの 'packages be REMOVED'"
Luke 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」文字列の問題は、「ポータブル」ではないことです。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が一致しないリターンが実行されます。
ホイヘンス

変化するテキストに常にマッチするのは難しい。おそらく置き換え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 :

cortopyDave James Millerに感謝します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.