@ -695,28 +695,63 @@ class StrategyBase:
return ret
return ret
def _execute_meta ( self , task , play_context , iterator ):
def _execute_meta ( self , task , play_context , iterator , target_host = None ):
# meta tasks store their args in the _raw_params field of args,
# meta tasks store their args in the _raw_params field of args,
# since they do not use k=v pairs, so get that
# since they do not use k=v pairs, so get that
meta_action = task . args . get ( ' _raw_params ' )
meta_action = task . args . get ( ' _raw_params ' )
# FIXME(s):
# * raise an error or show a warning when a conditional is used
# on a meta task that doesn't support them
def _evaluate_conditional ( h ) :
all_vars = self . _variable_manager . get_vars ( loader = self . _loader , play = iterator . _play , host = host , task = task )
templar = Templar ( loader = self . _loader , variables = all_vars )
return task . evaluate_conditional ( templar , all_vars )
if target_host :
host_list = [ target_host ]
else :
host_list = [ host for host in self . _inventory . get_hosts ( iterator . _play . hosts ) if host . name not in self . _tqm . _unreachable_hosts ]
results = [ ]
for host in host_list :
result = None
if meta_action == ' noop ' :
if meta_action == ' noop ' :
# FIXME: issue a callback for the noop here?
# FIXME: issue a callback for the noop here?
pass
result = TaskResult ( host , task , dict ( changed = False , msg = " noop " ) )
elif meta_action == ' flush_handlers ' :
elif meta_action == ' flush_handlers ' :
self . run_handlers ( iterator , play_context )
self . run_handlers ( iterator , play_context )
elif meta_action == ' refresh_inventory ' :
elif meta_action == ' refresh_inventory ' :
self . _inventory . refresh_inventory ( )
self . _inventory . refresh_inventory ( )
result = TaskResult ( host , task , dict ( changed = False , msg = " inventory successfully refreshed " ) )
elif meta_action == ' clear_facts ' :
elif meta_action == ' clear_facts ' :
for host in iterator . _host_states :
if _evaluate_conditional ( host ) :
self . _variable_manager . clear_facts ( host )
self . _variable_manager . clear_facts ( target_host )
result = TaskResult ( host , task , dict ( changed = True , msg = " inventory successfully refreshed " ) )
else :
result = TaskResult ( host , task , dict ( changed = False , skipped = True ) )
elif meta_action == ' clear_host_errors ' :
if _evaluate_conditional ( host ) :
self . _tqm . _failed_hosts . pop ( host . name , False )
self . _tqm . _unreachable_hosts . pop ( host . name , False )
iterator . _host_states [ host . name ] . fail_state = iterator . FAILED_NONE
result = TaskResult ( host , task , dict ( changed = True , msg = " successfully cleared host errors " ) )
else :
result = TaskResult ( host , task , dict ( changed = False , skipped = True ) )
elif meta_action == ' end_play ' :
if _evaluate_conditional ( host ) :
iterator . _host_states [ host . name ] . run_state = iterator . ITERATING_COMPLETE
result = TaskResult ( host , task , dict ( changed = True , msg = " ending play " ) )
else :
result = TaskResult ( host , task , dict ( changed = False , skipped = True ) )
#elif meta_action == 'reset_connection':
#elif meta_action == 'reset_connection':
# connection_info.connection.close()
# connection_info.connection.close()
elif meta_action == ' clear_host_errors ' :
self . _tqm . _failed_hosts = dict ( )
self . _tqm . _unreachable_hosts = dict ( )
for host in iterator . _host_states :
iterator . _host_states [ host ] . fail_state = iterator . FAILED_NONE
else :
else :
raise AnsibleError ( " invalid meta action requested: %s " % meta_action , obj = task . _ds )
raise AnsibleError ( " invalid meta action requested: %s " % meta_action , obj = task . _ds )
if result is not None :
results . append ( result )
return results