I would like to ask whether it’s possible to SKIP task programmatically, using python & callback module?
I’ve been trying to do this for 3 days and I still don’t know how.
Is there some special variable which I could use in v2_runner_on_start or v2_playbook_on_task_start methods?
I don’t want to use ansible’s when condition, task should be omitted dynamically basing on the results gathered earlier.
e.g.:
def v2_runner_on_start(self, host, task):
if self.checksomething():
print(“Task should be omitted”)
<OMIT TASK, DO NOT RUN IT>
else:
print(“Yes, task should be executed, proceed”)
I would like to ask whether it's possible to SKIP task programmatically, using python & callback module?
I've been trying to do this for 3 days and I still don't know how.
Is there some special variable which I could use in *v2_runner_on_start *or *v2_playbook_on_task_start* methods?
I don't want to use ansible's when condition, task should be omitted dynamically basing on the results gathered earlier.
e.g.:
def v2_runner_on_start(self, host, task):
if self.checksomething():
print("Task should be omitted")
<OMIT TASK, DO NOT RUN IT>
else:
print("Yes, task should be executed, proceed")
Do you know that Ansible's when conditions can be very well based on results gathered earlier?
The problem is that I want to have dynamic when conditions for huge amount of tasks.
With standard when condition I would have to provide a particular static condition for each task (which in fact are mostly external script executions).
I thought it would be just easier and faster with additional callback module.
The problem is that I want to have dynamic when conditions for huge amount of tasks.
With standard when condition I would have to provide a particular static condition for each task (which in fact are
mostly external script executions).
I thought it would be just easier and faster with additional callback module.
Kind regards
Luke
Can you give an example? Speed is probably not the issue with the when conditions if they rely on external scripts.
The problem is that I want to have dynamic when conditions for huge amount of tasks.
With standard when condition I would have to provide a particular static condition for each task (which in fact are mostly external script executions).
I thought it would be just easier and faster with additional callback module.
I too am confused. I use when() to include an entire task file
or just do a task. And I could swear I have whens that looked like
All right, so I created a callback plugin which saves information automatically about each executed task to external database, to put it concisely it holds of lots of information about task execution (output, hostname etc) + other needed by users.
For each task unique identifier (not Anisble TASKUUID) is also generated - it is a combination of few fields.
That Custom UUID is being saved to that database as well.
The idea is to not execute any tasks in that playbook(s) more than once, for this purpose Custom UUID should be checked. Tasks shouldn’t be executed more than once on a server because of irreversible actions done by those external legacy scripts. (no comments on that, can’t be changed for now)
With when condition it would be problematic to check Custom_UUID for each task because it’s not and can’t be hardcoded (can differ).
So, my first thought was to create or rather enhance my callback plugin to GET data from DB to check whether this particular task has been already executed or not.
If yes, it should be omitted.
All right, so I created a callback plugin which saves information automatically about each executed task to external
database, to put it concisely it holds of lots of information about task execution (output, hostname etc) + other needed
by users.
For each task unique identifier (not Anisble TASKUUID) is also generated - it is a combination of few fields.
That Custom UUID is being saved to that database as well.
The idea is to not execute any tasks in that playbook(s) more than once, for this purpose Custom UUID should be checked.
Tasks shouldn't be executed more than once on a server because of irreversible actions done by those external legacy
scripts. (no comments on that, can't be changed for now)
With when condition it would be problematic to check Custom_UUID for each task because it's not and can't be hardcoded
(can differ).
So, my first thought was to create or rather enhance my callback plugin to GET data from DB to check whether this
particular task has been already executed or not.
If yes, it should be omitted.
I'm not sure if your setup really makes sense ... it has a smell of overengineering. Ansible is suppose to at least
go through the tasks to ensure that to ascertain that the desired status has been reached.
short answer to subject: no, callbacks cannot influence play flow
As for your particular case i would argue that most modules are
designed to prevent doing the same action x2 on the target machines,
if using shell/command look at creates/removes checks on sideeffects.
I don't think this is something you want to build into the controller
but into each action as it is sometimes too hard for the controller to
verify such things.
For example, if the task succeeds but then the update to your database
fails, you will re-execute the task, while if the action itself
verifies 'do i need to execute' by examining the expected state, you
are always safe to run the play no matter what. What you are
attempting to do goes against the design of Ansible itself and it's
actions, so i expect it to be full of problems going forward.
jic you still insist on this direction, here are some tips:
possible solution: strategy plugin, these are the plugins designed to
control play/task flow.
other info: tasks already have a uuid but it is generated on task
definition, which might mean you will see it more than one time,
example: execute same role x2 (task definitions are the same).