From 24d998f0b69db87df4a622091c7fd3765bd580ff Mon Sep 17 00:00:00 2001 From: Cian Hatton Date: Sat, 3 Sep 2022 16:57:07 +0100 Subject: [PATCH] Switch to filter plugin instead of python script (#14) --- plugins/filter/filters.py | 15 +++++++++++++ .../files/determine-s3-keys-to-delete.py | 21 ------------------- .../scripts/determine-s3-keys-to-delete.py | 21 ------------------- roles/docker_s3_backup/tasks/main.yml | 13 ++++-------- tests/ansible.cfg | 1 + 5 files changed, 20 insertions(+), 51 deletions(-) create mode 100644 plugins/filter/filters.py delete mode 100644 roles/docker_s3_backup/files/determine-s3-keys-to-delete.py delete mode 100644 roles/docker_s3_backup/files/scripts/determine-s3-keys-to-delete.py diff --git a/plugins/filter/filters.py b/plugins/filter/filters.py new file mode 100644 index 0000000..d58572e --- /dev/null +++ b/plugins/filter/filters.py @@ -0,0 +1,15 @@ +#!/usr/bin/python +class FilterModule(object): + def filters(self): + return { + 'keep_last': self._keep_last, + } + + """ + _keep_last keeps the last n items of a list of lists + """ + def _keep_last(self, list_of_lists, num_to_keep): + lists_to_return = [] + for list_items in list_of_lists: + lists_to_return.append(list_items[0:-num_to_keep]) + return lists_to_return diff --git a/roles/docker_s3_backup/files/determine-s3-keys-to-delete.py b/roles/docker_s3_backup/files/determine-s3-keys-to-delete.py deleted file mode 100644 index 44435b0..0000000 --- a/roles/docker_s3_backup/files/determine-s3-keys-to-delete.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -import os - - -def main(): - s3_result = eval(os.getenv("S3_RESULTS")) - num_backups_to_keep = int(os.getenv("NUM_BACKUPS_TO_KEEP")) - - items_to_delete = [] - for res in s3_result: - s3_keys = res["s3_keys"] - # fetch all of the backups before the desired number. - # these are the ones we want to delete. - items_to_delete.extend(s3_keys[0:-num_backups_to_keep]) - - for item in items_to_delete: - print(item) - - -if __name__ == "__main__": - main() diff --git a/roles/docker_s3_backup/files/scripts/determine-s3-keys-to-delete.py b/roles/docker_s3_backup/files/scripts/determine-s3-keys-to-delete.py deleted file mode 100644 index 44435b0..0000000 --- a/roles/docker_s3_backup/files/scripts/determine-s3-keys-to-delete.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -import os - - -def main(): - s3_result = eval(os.getenv("S3_RESULTS")) - num_backups_to_keep = int(os.getenv("NUM_BACKUPS_TO_KEEP")) - - items_to_delete = [] - for res in s3_result: - s3_keys = res["s3_keys"] - # fetch all of the backups before the desired number. - # these are the ones we want to delete. - items_to_delete.extend(s3_keys[0:-num_backups_to_keep]) - - for item in items_to_delete: - print(item) - - -if __name__ == "__main__": - main() diff --git a/roles/docker_s3_backup/tasks/main.yml b/roles/docker_s3_backup/tasks/main.yml index 41cd190..68372e7 100644 --- a/roles/docker_s3_backup/tasks/main.yml +++ b/roles/docker_s3_backup/tasks/main.yml @@ -69,14 +69,9 @@ register: s3_list_outputs with_items: "{{ volume_mounts }}" -# TODO: do this in a more native way rather than a python script reading env vars. -- name: Determine which backups should be deleted. - ansible.builtin.script: determine-s3-keys-to-delete.py - environment: - S3_RESULTS: "{{ s3_list_outputs.results }}" - NUM_BACKUPS_TO_KEEP: "{{ docker_backup_retain_count }}" - register: python_output - changed_when: false +- name: Find keys to delete. + ansible.builtin.set_fact: + s3_keys_to_delete: "{{ s3_list_outputs.results | map(attribute='s3_keys') | keep_last(docker_backup_retain_count) | flatten }}" - name: Delete old backups. amazon.aws.aws_s3: @@ -87,4 +82,4 @@ s3_url: "{{ docker_backup_aws_s3_url }}" object: "{{ item }}" mode: delobj - with_items: "{{ python_output.stdout_lines }}" + with_items: "{{ s3_keys_to_delete }}" diff --git a/tests/ansible.cfg b/tests/ansible.cfg index a99d3fe..9acce73 100644 --- a/tests/ansible.cfg +++ b/tests/ansible.cfg @@ -1,3 +1,4 @@ [defaults] roles_path = roles vault_password_file=tests/vault_key.sh +filter_plugins = plugins/filter