diff --git a/lib/ansible/playbook/role/definition.py b/lib/ansible/playbook/role/definition.py index 0cb1e45760d..d46bca6b2e9 100644 --- a/lib/ansible/playbook/role/definition.py +++ b/lib/ansible/playbook/role/definition.py @@ -55,8 +55,12 @@ class RoleDefinition(Base, Become, Conditional, Taggable): raise AnsibleError("not implemented") def preprocess_data(self, ds): + # role names that are simply numbers can be parsed by PyYAML + # as integers even when quoted, so turn it into a string type + if isinstance(ds, int): + ds = "%s" % ds - assert isinstance(ds, dict) or isinstance(ds, string_types) + assert isinstance(ds, dict) or isinstance(ds, string_types) or isinstance(ds, AnsibleBaseYAMLObject) if isinstance(ds, dict): ds = super(RoleDefinition, self).preprocess_data(ds) diff --git a/lib/ansible/playbook/role/include.py b/lib/ansible/playbook/role/include.py index b063aecc350..93cf0e21794 100644 --- a/lib/ansible/playbook/role/include.py +++ b/lib/ansible/playbook/role/include.py @@ -24,6 +24,7 @@ from six import iteritems, string_types import os from ansible.errors import AnsibleError, AnsibleParserError +from ansible.parsing.yaml.objects import AnsibleBaseYAMLObject from ansible.playbook.attribute import Attribute, FieldAttribute from ansible.playbook.role.definition import RoleDefinition @@ -42,7 +43,8 @@ class RoleInclude(RoleDefinition): @staticmethod def load(data, current_role_path=None, parent_role=None, variable_manager=None, loader=None): - assert isinstance(data, string_types) or isinstance(data, dict) + + assert isinstance(data, string_types) or isinstance(data, dict) or isinstance(data, AnsibleBaseYAMLObject) ri = RoleInclude(role_basedir=current_role_path) return ri.load_data(data, variable_manager=variable_manager, loader=loader)