mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-25 11:51:26 -07:00
parent
07a9a54b0e
commit
78d499140c
2 changed files with 37 additions and 1 deletions
|
@ -235,7 +235,7 @@ COMMAND_WARNINGS = get_config(p, DEFAULTS, 'command_warnings', 'AN
|
||||||
DEFAULT_LOAD_CALLBACK_PLUGINS = get_config(p, DEFAULTS, 'bin_ansible_callbacks', 'ANSIBLE_LOAD_CALLBACK_PLUGINS', False, boolean=True)
|
DEFAULT_LOAD_CALLBACK_PLUGINS = get_config(p, DEFAULTS, 'bin_ansible_callbacks', 'ANSIBLE_LOAD_CALLBACK_PLUGINS', False, boolean=True)
|
||||||
DEFAULT_CALLBACK_WHITELIST = get_config(p, DEFAULTS, 'callback_whitelist', 'ANSIBLE_CALLBACK_WHITELIST', [], islist=True)
|
DEFAULT_CALLBACK_WHITELIST = get_config(p, DEFAULTS, 'callback_whitelist', 'ANSIBLE_CALLBACK_WHITELIST', [], islist=True)
|
||||||
RETRY_FILES_ENABLED = get_config(p, DEFAULTS, 'retry_files_enabled', 'ANSIBLE_RETRY_FILES_ENABLED', True, boolean=True)
|
RETRY_FILES_ENABLED = get_config(p, DEFAULTS, 'retry_files_enabled', 'ANSIBLE_RETRY_FILES_ENABLED', True, boolean=True)
|
||||||
RETRY_FILES_SAVE_PATH = get_config(p, DEFAULTS, 'retry_files_save_path', 'ANSIBLE_RETRY_FILES_SAVE_PATH', '~/', ispath=True)
|
RETRY_FILES_SAVE_PATH = get_config(p, DEFAULTS, 'retry_files_save_path', 'ANSIBLE_RETRY_FILES_SAVE_PATH', None, ispath=True)
|
||||||
DEFAULT_NULL_REPRESENTATION = get_config(p, DEFAULTS, 'null_representation', 'ANSIBLE_NULL_REPRESENTATION', None, isnone=True)
|
DEFAULT_NULL_REPRESENTATION = get_config(p, DEFAULTS, 'null_representation', 'ANSIBLE_NULL_REPRESENTATION', None, isnone=True)
|
||||||
|
|
||||||
# CONNECTION RELATED
|
# CONNECTION RELATED
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
from __future__ import (absolute_import, division, print_function)
|
from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import StringIO
|
||||||
import getpass
|
import getpass
|
||||||
import locale
|
import locale
|
||||||
import os
|
import os
|
||||||
|
@ -27,6 +28,7 @@ import sys
|
||||||
|
|
||||||
from ansible.compat.six import string_types
|
from ansible.compat.six import string_types
|
||||||
|
|
||||||
|
from ansible import constants as C
|
||||||
from ansible.executor.task_queue_manager import TaskQueueManager
|
from ansible.executor.task_queue_manager import TaskQueueManager
|
||||||
from ansible.playbook import Playbook
|
from ansible.playbook import Playbook
|
||||||
from ansible.template import Templar
|
from ansible.template import Templar
|
||||||
|
@ -171,6 +173,20 @@ class PlaybookExecutor:
|
||||||
if entry:
|
if entry:
|
||||||
entrylist.append(entry) # per playbook
|
entrylist.append(entry) # per playbook
|
||||||
|
|
||||||
|
if C.RETRY_FILES_ENABLED:
|
||||||
|
retries = list(set(self._tqm._failed_hosts.keys() + self._tqm._unreachable_hosts.keys()))
|
||||||
|
retries.sort()
|
||||||
|
if len(retries) > 0:
|
||||||
|
if C.RETRY_FILES_SAVE_PATH:
|
||||||
|
basedir = C.shell_expand(C.RETRY_FILES_SAVE_PATH)
|
||||||
|
else:
|
||||||
|
basedir = os.path.dirname(playbook_path)
|
||||||
|
|
||||||
|
(retry_name, _) = os.path.splitext(os.path.basename(playbook_path))
|
||||||
|
filename = os.path.join(basedir, "%s.retry" % retry_name)
|
||||||
|
if self._generate_retry_inventory(filename, retries):
|
||||||
|
display.display("\tto retry, use: --limit @%s\n" % filename)
|
||||||
|
|
||||||
# send the stats callback for this playbook
|
# send the stats callback for this playbook
|
||||||
if self._tqm is not None:
|
if self._tqm is not None:
|
||||||
self._tqm.send_callback('v2_playbook_on_stats', self._tqm._stats)
|
self._tqm.send_callback('v2_playbook_on_stats', self._tqm._stats)
|
||||||
|
@ -233,3 +249,23 @@ class PlaybookExecutor:
|
||||||
|
|
||||||
return serialized_batches
|
return serialized_batches
|
||||||
|
|
||||||
|
def _generate_retry_inventory(self, retry_path, replay_hosts):
|
||||||
|
'''
|
||||||
|
Called when a playbook run fails. It generates an inventory which allows
|
||||||
|
re-running on ONLY the failed hosts. This may duplicate some variable
|
||||||
|
information in group_vars/host_vars but that is ok, and expected.
|
||||||
|
'''
|
||||||
|
|
||||||
|
buf = StringIO.StringIO()
|
||||||
|
for x in replay_hosts:
|
||||||
|
buf.write("%s\n" % x)
|
||||||
|
|
||||||
|
try:
|
||||||
|
fd = open(retry_path, 'w')
|
||||||
|
fd.write(buf.getvalue())
|
||||||
|
fd.close()
|
||||||
|
except Exception as e:
|
||||||
|
display.error("Could not create retry file '%s'. The error was: %s" % (retry_path, e))
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue