@ -346,53 +346,58 @@ class VariableManager:
if play :
all_vars = combine_vars ( all_vars , play . get_vars ( ) )
for vars_file_item in play . get_vars_files ( ) :
# create a set of temporary vars here, which incorporate the extra
# and magic vars so we can properly template the vars_files entries
temp_vars = combine_vars ( all_vars , self . _extra_vars )
temp_vars = combine_vars ( temp_vars , magic_variables )
templar = Templar ( loader = self . _loader , variables = temp_vars )
# we assume each item in the list is itself a list, as we
# support "conditional includes" for vars_files, which mimics
# the with_first_found mechanism.
vars_file_list = vars_file_item
if not isinstance ( vars_file_list , list ) :
vars_file_list = [ vars_file_list ]
# now we iterate through the (potential) files, and break out
# as soon as we read one from the list. If none are found, we
# raise an error, which is silently ignored at this point.
try :
for vars_file in vars_file_list :
vars_file = templar . template ( vars_file )
try :
data = preprocess_vars ( self . _loader . load_from_file ( vars_file , unsafe = True ) )
if data is not None :
for item in data :
all_vars = combine_vars ( all_vars , item )
break
except AnsibleFileNotFound :
# we continue on loader failures
vars_files = play . get_vars_files ( )
try :
for vars_file_item in vars_files :
# create a set of temporary vars here, which incorporate the extra
# and magic vars so we can properly template the vars_files entries
temp_vars = combine_vars ( all_vars , self . _extra_vars )
temp_vars = combine_vars ( temp_vars , magic_variables )
templar = Templar ( loader = self . _loader , variables = temp_vars )
# we assume each item in the list is itself a list, as we
# support "conditional includes" for vars_files, which mimics
# the with_first_found mechanism.
vars_file_list = vars_file_item
if not isinstance ( vars_file_list , list ) :
vars_file_list = [ vars_file_list ]
# now we iterate through the (potential) files, and break out
# as soon as we read one from the list. If none are found, we
# raise an error, which is silently ignored at this point.
try :
for vars_file in vars_file_list :
vars_file = templar . template ( vars_file )
try :
data = preprocess_vars ( self . _loader . load_from_file ( vars_file , unsafe = True ) )
if data is not None :
for item in data :
all_vars = combine_vars ( all_vars , item )
break
except AnsibleFileNotFound :
# we continue on loader failures
continue
except AnsibleParserError :
raise
else :
# if include_delegate_to is set to False, we ignore the missing
# vars file here because we're working on a delegated host
if include_delegate_to :
raise AnsibleFileNotFound ( " vars file %s was not found " % vars_file_item )
except ( UndefinedError , AnsibleUndefinedVariable ) :
if host is not None and self . _fact_cache . get ( host . name , dict ( ) ) . get ( ' module_setup ' ) and task is not None :
raise AnsibleUndefinedVariable ( " an undefined variable was found when attempting to template the vars_files item ' %s ' "
% vars_file_item , obj = vars_file_item )
else :
# we do not have a full context here, and the missing variable could be because of that
# so just show a warning and continue
display . vvv ( " skipping vars_file ' %s ' due to an undefined variable " % vars_file_item )
continue
except AnsibleParserError :
raise
else :
# if include_delegate_to is set to False, we ignore the missing
# vars file here because we're working on a delegated host
if include_delegate_to :
raise AnsibleFileNotFound ( " vars file %s was not found " % vars_file_item )
except ( UndefinedError , AnsibleUndefinedVariable ) :
if host is not None and self . _fact_cache . get ( host . name , dict ( ) ) . get ( ' module_setup ' ) and task is not None :
raise AnsibleUndefinedVariable ( " an undefined variable was found when attempting to template the vars_files item ' %s ' " % vars_file_item ,
obj = vars_file_item )
else :
# we do not have a full context here, and the missing variable could be because of that
# so just show a warning and continue
display . vvv ( " skipping vars_file ' %s ' due to an undefined variable " % vars_file_item )
continue
display . vvv ( " Read vars_file ' %s ' " % vars_file_item )
display . vvv ( " Read vars_file ' %s ' " % vars_file_item )
except TypeError :
raise AnsibleParserError ( " Error while reading vars files - please supply a list of file names. "
" Got ' %s ' of type %s " % ( vars_files , type ( vars_files ) ) )
# By default, we now merge in all vars from all roles in the play,
# unless the user has disabled this via a config option