Add Action plugin example (#49290)
Signed-off-by: Abhijeet Kasurde <akasurde@redhat.com>
This commit is contained in:
parent
2557373cc8
commit
45e41f5a3d
1 changed files with 70 additions and 0 deletions
|
@ -74,6 +74,76 @@ Plugins that support embedded documentation (see :ref:`ansible-doc` for the list
|
||||||
Developing particular plugin types
|
Developing particular plugin types
|
||||||
==================================
|
==================================
|
||||||
|
|
||||||
|
.. _developing_actions:
|
||||||
|
|
||||||
|
Action plugins
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Action plugins are useful when you want to modify data that is provided to any module, or filter the data that is returned by the module.
|
||||||
|
|
||||||
|
To create an action plugin, create a new class with the Base(ActionBase) class as the parent:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
from ansible.plugins.action import ActionBase
|
||||||
|
|
||||||
|
class ActionModule(ActionBase):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
From there, execute the module using the ``_execute_module`` method to call the original module.
|
||||||
|
After successful execution of the module, you can modify the module return data.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
module_return = self._execute_module(module_name='<NAME_OF_MODULE>',
|
||||||
|
module_args=module_args,
|
||||||
|
task_vars=task_vars, tmp=tmp)
|
||||||
|
|
||||||
|
The following is an example showing how you can modify return data from Ansible's ``setup`` module:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
#!/usr/bin/python
|
||||||
|
# Make coding more python3-ish, this is required for contributions to Ansible
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
from ansible.plugins.action import ActionBase
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
|
class ActionModule(ActionBase):
|
||||||
|
def run(self, tmp=None, task_vars=None):
|
||||||
|
super(ActionModule, self).run(tmp, task_vars)
|
||||||
|
module_args = self._task.args.copy()
|
||||||
|
module_return = self._execute_module(module_name='setup',
|
||||||
|
module_args=module_args,
|
||||||
|
task_vars=task_vars, tmp=tmp)
|
||||||
|
ret = dict()
|
||||||
|
remote_date = None
|
||||||
|
if not module_return.get('failed'):
|
||||||
|
for key, value in module_return['ansible_facts'].items():
|
||||||
|
if key == 'ansible_date_time':
|
||||||
|
remote_date = value['iso8601']
|
||||||
|
|
||||||
|
if remote_date:
|
||||||
|
remote_date_obj = datetime.strptime(remote_date, '%Y-%m-%dT%H:%M:%SZ')
|
||||||
|
time_delta = datetime.now() - remote_date_obj
|
||||||
|
ret['delta_seconds'] = time_delta.seconds
|
||||||
|
ret['delta_days'] = time_delta.days
|
||||||
|
ret['delta_microseconds'] = time_delta.microseconds
|
||||||
|
|
||||||
|
return dict(ansible_facts=dict(ret))
|
||||||
|
|
||||||
|
|
||||||
|
Let us assume, you want to check time skewness between Ansible controller and remote machine then, we can have above code.
|
||||||
|
Here, we are capturing date and time for remote machine using the ``setup`` module. Then we are calculating the time delta between the captured time and
|
||||||
|
the time of Ansible controller. We are returning time delta in days, seconds and microseconds.
|
||||||
|
|
||||||
|
For more example of action plugins,
|
||||||
|
see the source code for the `action plugins included with Ansible Core <https://github.com/ansible/ansible/tree/devel/lib/ansible/plugins/action>`_
|
||||||
|
|
||||||
.. _developing_callbacks:
|
.. _developing_callbacks:
|
||||||
|
|
||||||
Callback plugins
|
Callback plugins
|
||||||
|
|
Loading…
Reference in a new issue