--- # description: Reclaim disk on Docker / Swarm nodes — prune stopped containers, unused images, or a full system prune. # steward:category: maintenance # steward:confirm: true # Reclaim disk on Docker / Docker Swarm nodes by removing unused data. # `prune_target` selects the scope (default `system` preserves the original # behavior for existing manual/scheduled callers that don't set it): # prune_target=containers remove stopped containers only (docker container prune) # prune_target=images remove unused images (docker image prune; # + prune_all_images=true → -a, i.e. ALL unused, not just dangling) # prune_target=system docker system prune (dangling images, stopped # containers, unused networks, build cache). Widen with: # prune_all_images=true also ALL unused images # prune_volumes=true also unused named volumes (data loss risk) - name: Docker prune hosts: all gather_facts: false become: true vars: prune_target: system prune_all_images: false prune_volumes: false tasks: - name: Validate prune_target ansible.builtin.assert: that: prune_target in ['containers', 'images', 'system'] fail_msg: "prune_target must be one of: containers, images, system (got '{{ prune_target }}')" quiet: true # ── Stopped containers only ─────────────────────────────────────────────── - name: Prune stopped containers ansible.builtin.command: argv: ['docker', 'container', 'prune', '-f'] register: container_prune changed_when: "'Total reclaimed space: 0B' not in container_prune.stdout" when: prune_target == 'containers' # ── Unused images (dangling, or all unused with -a) ─────────────────────── - name: Prune unused images ansible.builtin.command: argv: >- {{ ['docker', 'image', 'prune', '-f'] + (['-a'] if prune_all_images | bool else []) }} register: image_prune changed_when: "'Total reclaimed space: 0B' not in image_prune.stdout" when: prune_target == 'images' # ── Full system prune (default) ─────────────────────────────────────────── - name: Run docker system prune ansible.builtin.command: argv: >- {{ ['docker', 'system', 'prune', '-f'] + (['-a'] if prune_all_images | bool else []) + (['--volumes'] if prune_volumes | bool else []) }} register: system_prune changed_when: "'Total reclaimed space: 0B' not in system_prune.stdout" when: prune_target == 'system' - name: Report reclaimed space ansible.builtin.debug: msg: >- {{ ((container_prune.stdout_lines | default([])) + (image_prune.stdout_lines | default([])) + (system_prune.stdout_lines | default([]))) | select | list }}