feat(ansible): template play vars_files paths

This commit is contained in:
Virgil 2026-04-02 14:38:23 +00:00
parent 8cc2257ac7
commit b04e68fdbf
2 changed files with 47 additions and 1 deletions

View file

@ -479,9 +479,24 @@ func (e *Executor) loadPlayVarsFiles(play *Play) error {
return nil
}
// Vars file paths may reference play or executor variables, so render them
// against a temporary merged scope before reading from disk.
savedVars := e.vars
renderVars := make(map[string]any, len(savedVars)+len(play.Vars))
for k, v := range savedVars {
renderVars[k] = v
}
for k, v := range play.Vars {
renderVars[k] = v
}
e.vars = renderVars
defer func() {
e.vars = savedVars
}()
merged := make(map[string]any)
for _, file := range files {
resolved := e.resolveLocalPath(file)
resolved := e.resolveLocalPath(e.templateString(file, "", nil))
data, err := coreio.Local.Read(resolved)
if err != nil {
return coreerr.E("Executor.loadPlayVarsFiles", "read vars file", err)

View file

@ -399,6 +399,37 @@ app_name: demo
assert.Equal(t, "8080 demo prod", e.results["localhost"]["vars_result"].Msg)
}
func TestExecutor_Run_Good_VarsFilesSupportTemplatedPaths(t *testing.T) {
dir := t.TempDir()
require.NoError(t, writeTestFile(joinPath(dir, "vars", "prod.yml"), []byte(`---
app_name: templated
`), 0644))
playbookPath := joinPath(dir, "playbook.yml")
require.NoError(t, writeTestFile(playbookPath, []byte(`---
- name: Vars files templated path
hosts: localhost
gather_facts: false
vars:
environment: prod
vars_files:
- vars/{{ environment }}.yml
tasks:
- name: Show templated var
debug:
msg: "{{ app_name }}"
register: vars_result
`), 0644))
e := NewExecutor(dir)
require.NoError(t, e.Run(context.Background(), playbookPath))
require.NotNil(t, e.results["localhost"])
require.NotNil(t, e.results["localhost"]["vars_result"])
assert.Equal(t, "templated", e.results["localhost"]["vars_result"].Msg)
}
func TestExecutor_RunTaskOnHosts_Good_WithFileUsesFileContents(t *testing.T) {
dir := t.TempDir()
require.NoError(t, writeTestFile(joinPath(dir, "fragments", "hello.txt"), []byte("hello from file"), 0644))