summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--changelogs/fragments/73996-recursion-depth.yml3
-rw-r--r--lib/ansible/playbook/base.py6
2 files changed, 8 insertions, 1 deletions
diff --git a/changelogs/fragments/73996-recursion-depth.yml b/changelogs/fragments/73996-recursion-depth.yml
new file mode 100644
index 0000000000..35af5aa534
--- /dev/null
+++ b/changelogs/fragments/73996-recursion-depth.yml
@@ -0,0 +1,3 @@
+bugfixes:
+- Task depth - Prevent exception when the task depth exceeds Pythons recursion depth
+ (https://github.com/ansible/ansible/issues/73996)
diff --git a/lib/ansible/playbook/base.py b/lib/ansible/playbook/base.py
index 5fc050895f..9fa84d1473 100644
--- a/lib/ansible/playbook/base.py
+++ b/lib/ansible/playbook/base.py
@@ -15,6 +15,7 @@ from jinja2.exceptions import UndefinedError
from ansible import constants as C
from ansible import context
+from ansible.errors import AnsibleError
from ansible.module_utils.six import iteritems, string_types, with_metaclass
from ansible.module_utils.parsing.convert_bool import boolean
from ansible.errors import AnsibleParserError, AnsibleUndefinedVariable, AnsibleAssertionError
@@ -315,7 +316,10 @@ class FieldAttributeBase(with_metaclass(BaseMeta, object)):
Create a copy of this object and return it.
'''
- new_me = self.__class__()
+ try:
+ new_me = self.__class__()
+ except RuntimeError as e:
+ raise AnsibleError("Exceeded maximum object depth. This may have been caused by excessive role recursion", orig_exc=e)
for name in self._valid_attrs.keys():
if name in self._alias_attrs: