#!/usr/bin/python import re from ansible.errors import AnsibleActionFail from ansible.plugins.action import ActionBase from ansible_collections.tensin.infra.plugins.module_utils import git class ActionModule(ActionBase): def run(self, tmp=None, task_vars=None): result = super().run(tmp, task_vars) msg = self._task.args['msg'] allowlist = self._task.args.get('allowlist', []) allowlist = [re.compile(pattern) for pattern in allowlist] skip_no_changes = self._task.args.get('skip_no_changes', False) dirty_files = git.get_dirty_file_list(self, '/etc', task_vars) if not dirty_files: if skip_no_changes: return result raise AnsibleActionFail('Nothing to commit') if allowlist: unexpected = [ path for path in dirty_files if not any([pattern.fullmatch(path) for pattern in allowlist]) ] if unexpected: raise AnsibleActionFail( f"Unexpected modifications in repository:\n{'\n'.join(unexpected)}" ) return self._commit(msg, task_vars) def _commit(self, msg, task_vars): cmd_result = self._execute_module( module_name='ansible.builtin.command', module_args=dict( argv=['etckeeper', 'commit', msg], ), task_vars=task_vars, ) if cmd_result.get('failed'): raise AnsibleActionFail('etckeeper commit failed', result=cmd_result) return cmd_result