feat(ansible): template play vars_files paths
This commit is contained in:
parent
8cc2257ac7
commit
b04e68fdbf
2 changed files with 47 additions and 1 deletions
17
executor.go
17
executor.go
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue