diff --git a/lib/ansible/playbook/base.py b/lib/ansible/playbook/base.py index 0343344be95..eba7d8fbc7d 100644 --- a/lib/ansible/playbook/base.py +++ b/lib/ansible/playbook/base.py @@ -51,8 +51,8 @@ class Base: _vars = FieldAttribute(isa='dict', default=dict()) # flags and misc. settings - _environment = FieldAttribute(isa='list', default=[]) - _no_log = FieldAttribute(isa='bool', default=False) + _environment = FieldAttribute(isa='list') + _no_log = FieldAttribute(isa='bool') def __init__(self): @@ -292,7 +292,9 @@ class Base: elif attribute.isa == 'bool': value = boolean(value) elif attribute.isa == 'list': - if not isinstance(value, list): + if value is None: + value = [] + elif not isinstance(value, list): value = [ value ] if attribute.listof is not None: for item in value: @@ -302,12 +304,18 @@ class Base: if item is None or item.strip() == "": raise AnsibleParserError("the field '%s' is required, and cannot have empty values" % (name,), obj=self.get_ds()) elif attribute.isa == 'set': - if not isinstance(value, (list, set)): - value = [ value ] - if not isinstance(value, set): - value = set(value) - elif attribute.isa == 'dict' and not isinstance(value, dict): - raise TypeError("%s is not a dictionary" % value) + if value is None: + value = set() + else: + if not isinstance(value, (list, set)): + value = [ value ] + if not isinstance(value, set): + value = set(value) + elif attribute.isa == 'dict': + if value is None: + value = dict() + elif not isinstance(value, dict): + raise TypeError("%s is not a dictionary" % value) # and assign the massaged value back to the attribute field setattr(self, name, value)