diff --git a/README.md b/README.md index 7a7e86c..c580347 100644 --- a/README.md +++ b/README.md @@ -11,17 +11,10 @@ None Role Variables -------------- -**General Variables** - -| Name | Default Value | Description | -|-------------------|---------------------|----------------------| -| `operations_task` | `skip` | Task file to include and run. See `tasks/` for available options. | - **Variables used for cleaning up Docker** | Name | Default Value | Description | |-------------------|---------------------|----------------------| -| `operations_docker_bin` | `docker` | Path to `docker` binary. | | `operations_docker_cleanup` | [see `defaults/main.yml`] | Filters used to determine which items will be removed. Uses Docker filter syntax. See Docker guides for [images](https://docs.docker.com/engine/reference/commandline/images/#filtering), [containers](https://docs.docker.com/engine/reference/commandline/ps/#filtering), and [volumes](https://docs.docker.com/engine/reference/commandline/volume_ls/#filtering) for filter options. | **Variables for fetching logs** @@ -49,30 +42,23 @@ Example Playbook - name: Restart a service import_role: name: openstack-operations + tasks_from: restart_service.yml vars: operations_task: restart_service - operations_service_list: + operations_service_names: - docker - keystone - mariadb - - name: Cleanup unused Docker images + - name: Cleanup unused Docker images, containers, and volumes import_role: name: openstack-operations - vars: - operations_task: cleanup_images + tasks_from: cleanup_docker.yml - name: Fetch logs import_role: name: openstack-operations - vars: - operations_task: fetch_logs - - - name: List running services - import_role: - name: list_services - vars: - operations_task: fetch_logs + tasks_from: fetch_logs.yml License ------- diff --git a/defaults/main.yml b/defaults/main.yml index 7be5e08..eafb2a6 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -1,16 +1,12 @@ -operations_operation: skip - - # Cleanup Docker operations_docker_bin: docker -operations_docker_cleanup: - image_filters: - - dangling=true - volume_filters: - - dangling=true - container_filters: - - status=exited - - status=dead +operations_image_filters: + - dangling=true +operations_volume_filters: + - dangling=true +operations_container_filters: + - status=exited + - status=dead # Fetch Logs diff --git a/library/docker_facts.py b/library/docker_facts.py new file mode 100644 index 0000000..b1668c8 --- /dev/null +++ b/library/docker_facts.py @@ -0,0 +1,76 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (c) 2018 Ansible Project +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + + +ANSIBLE_METADATA = { + 'metadata_version': '1.1', + 'status': ['preview'], + 'supported_by': 'community' +} + + +from ansible.module_utils.basic import AnsibleModule + + +def main(): + module = AnsibleModule( + argument_spec=dict( + image_filter=dict(type='list', default=[]), + volume_filter=dict(type='list', default=[]), + container_filter=dict(type='list', default=[]), + ) + ) + + docker_bin = module.get_bin_path('docker', True) + docker_facts = {} + + # Images + command = [docker_bin, 'images', '-q'] + command_opts = ['-f ' + i for i in module.params['image_filter']] + command.extend(command_opts) + rc, out, err = module.run_command(command) + if out == '': + images = [] + else: + images = out.strip().split('\n') + docker_facts['filtered_images'] = images + + # Volumes + command = [docker_bin, 'volume', 'ls', '-q'] + command_opts = ['-f ' + i for i in module.params['volume_filter']] + command.extend(command_opts) + rc, out, err = module.run_command(command) + if out == '': + volumes = [] + else: + volumes = out.strip().split('\n') + docker_facts['filtered_volumes'] = volumes + + # Containers + command = [docker_bin, 'ps', '-q'] + command_opts = ['-f ' + i for i in module.params['container_filter']] + command.extend(command_opts) + rc, out, err = module.run_command(command) + if out == '': + containers = [] + else: + containers = out.strip().split('\n') + docker_facts['filtered_containers'] = containers + + results = dict( + ansible_facts=dict( + docker_facts=docker_facts + ) + ) + + module.exit_json(**results) + + +if __name__ == '__main__': + main() diff --git a/tasks/cleanup_docker.yml b/tasks/cleanup_docker.yml new file mode 100644 index 0000000..cef1b21 --- /dev/null +++ b/tasks/cleanup_docker.yml @@ -0,0 +1,23 @@ +- name: Gather Docker facts + docker_facts: + image_filter: "{{ operations_image_filter }}" + volume_filter: "{{ operations_volume_filter }}" + container_filter: "{{ operations_container_filter }}" + +- name: Remove images + docker_image: + name: "{{ item }}" + state: absent + loop: "{{ docker_facts.images }}" + +- name: Remove containers + docker_container: + name: "{{ item }}" + state: absent + loop: "{{ docker_facts.containers }}" + +- name: Remove dangling volumes + docker_volume: + name: "{{ item }}" + state: absent + loop: "{{ docker_facts.volumes }}" diff --git a/tasks/cleanup_images.yml b/tasks/cleanup_images.yml deleted file mode 100644 index fdd2190..0000000 --- a/tasks/cleanup_images.yml +++ /dev/null @@ -1,29 +0,0 @@ -- name: List filtered images - command: '{{ operations_docker_bin }} images {% for filter in operations_docker_cleanup.image_filters %}-f {{ filter }} {% endfor %}-q' - changed_when: no - check_mode: no - register: _dangling_images - -- name: Remove images - command: '{{ operations_docker_bin }} rmi {{ item }}' - with_items: "{{ _dangling_images.stdout_lines }}" - -- name: List filtered containers - command: '{{ operations_docker_bin }} ps {% for filter in operations_docker_cleanup.container_filters %}-f {{ filter }} {% endfor %} -q' - changed_when: no - check_mode: no - register: _dead_containers - -- name: Remove containers - command: '{{ operations_docker_bin }} rm {{ item }}' - with_items: "{{ _dead_containers.stdout_lines }}" - -- name: List filtered volumes - command: '{{ operations_docker_bin }} volume ls {% for filter in operations_docker_cleanup.volume_filters %}-f {{ filter }} {% endfor %} -q' - changed_when: no - check_mode: no - register: _dangling_volumes - -- name: Remove dangling volumes - command: "{{ operations_docker_bin }} volume rm {{ item }}" - with_items: "{{ _dangling_volumes }}" diff --git a/tasks/fetch_logs.yml b/tasks/fetch_logs.yml index 0dddc92..07e7033 100644 --- a/tasks/fetch_logs.yml +++ b/tasks/fetch_logs.yml @@ -14,5 +14,5 @@ - name: Fetch logs and place in {{ operations_log_destination }} fetch: src: "{{ item.path }}" - dest: "{{ operations_log_destination }}/{{ inventory_hostname }}" + dest: "{{ operations_log_destination }}" with_items: "{{ _logs.files }}" diff --git a/tasks/main.yml b/tasks/main.yml index 7841157..e69de29 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -1,3 +0,0 @@ -- include_tasks: "{{ operations_task }}.yml" - tags: - - operations diff --git a/tasks/skip.yml b/tasks/skip.yml deleted file mode 100644 index e69de29..0000000