# Import required modules
from ansible.plugins.action import ActionBase
class ActionModule(ActionBase):
def run(self, tmp=None, task_vars=None):
# Initialize variables
result = super(ActionModule, self).run(tmp, task_vars)
should_delegate = True # Determine if delegation is needed
# Access inventory variables
source_host_vars =
self._task_vars['hostvars'][self._task.args['src_host']]
target_host_vars =
self._task_vars['hostvars'][self._task.args['inventory_hostname']]
# Prepare task_args for remote task execution
task_args = {
'module_name': 'find',
'module_args': f"path={source_host_vars['source_path']}
patterns={{ {self._task.args['regex']} }}",
'inventory': self._task._inventory,
'subset': [self._task.args['src_host']],
}
if should_delegate:
# Remote execution
result['remote_result'] =
self._execute_module(task_args=task_args)
else:
# Local execution
# Perform necessary local actions
result['local_result'] = "Performed local actions"
# Handle file transfers
if should_delegate:
# Execute remote copy task
copy_task_args = {
'module_name': 'copy',
'module_args': f"src={result['remote_result']['files'][0]}
dest=/destination/path",
'inventory': self._task._inventory,
'subset': [self._task.args['inventory_hostname']],
}
result['copy_result'] =
self._execute_module(task_args=copy_task_args)
return result
On Monday, March 6, 2023 at 11:15:20 AM UTC-8 Felix wrote:
> Hi all,
>
> I am currently developing an Action-module which should do the following:
>
> I have a playbook like this:
> - hosts: target-host
> tasks:
> - my_module:
> src_host: source-host
> regex: some_regex
>
> It should be checked if a file which meets the regex can be found on the
> source-host. If so, it should be copied to the target-host via the
> controller-node. I can't copy the file directly because of
> security-restrictions.
>
> Currently I solved this by just using paramiko which works fine but isn't
> a clean solution.
>
>
> Questions/What I want to do instead:
> 1) I would like to access the inventory inside of my Action-Module to get
> ansible_user, ansible_password and ansible_port of the source-host and
> target-host. How can I achieve this? I tried to use the InventoryManager
> without success. Currently i provide all these values as parameters.
>
> 2) A far better solution would be, to use _execute_module and execute the
> find-module on the source-host and then copy the file via the copy-module
> to the controller-node and the target-host. But it seems there is no
> delegate-option for execute_module so (by looking at the play from above)
> it will always be executed on the target-host
>
>
> Any help or pointing me into the right direction would be very much
> apricated. Couldn't find any suitable solution so far even after hours.
>
> Thanks and best regads,
> Felix
>
--
You received this message because you are subscribed to the Google Groups
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/e52ac36f-b0d5-4d8a-9bef-e1063d8475bbn%40googlegroups.com.