Load role vars in ParseRole

This commit is contained in:
Virgil 2026-04-02 03:12:11 +00:00
parent f0c2333a75
commit 2c0b68627d
2 changed files with 48 additions and 1 deletions

View file

@ -193,7 +193,23 @@ func (p *Parser) ParseTasksIter(path string) (iter.Seq[Task], error) {
//
// tasks, err := parser.ParseRole("nginx", "main.yml")
func (p *Parser) ParseRole(name string, tasksFrom string) ([]Task, error) {
tasks, _, _, err := p.loadRoleData(name, tasksFrom, "", "")
tasks, defaults, roleVars, err := p.loadRoleData(name, tasksFrom, "", "")
if err != nil {
return nil, err
}
if p.vars == nil {
p.vars = make(map[string]any)
}
for k, v := range defaults {
if _, exists := p.vars[k]; !exists {
p.vars[k] = v
}
}
for k, v := range roleVars {
p.vars[k] = v
}
return tasks, err
}

View file

@ -648,6 +648,37 @@ func TestParser_ParseTasks_Bad_InvalidYAML(t *testing.T) {
assert.Error(t, err)
}
func TestParser_ParseRole_Good_LoadsRoleVarsIntoParserContext(t *testing.T) {
dir := t.TempDir()
require.NoError(t, writeTestFile(joinPath(dir, "roles", "web", "tasks", "main.yml"), []byte(`---
- name: Role task
debug:
msg: "{{ role_default }} {{ role_value }} {{ shared_value }}"
`), 0644))
require.NoError(t, writeTestFile(joinPath(dir, "roles", "web", "defaults", "main.yml"), []byte(`---
role_default: default-value
shared_value: default-shared
`), 0644))
require.NoError(t, writeTestFile(joinPath(dir, "roles", "web", "vars", "main.yml"), []byte(`---
role_value: vars-value
shared_value: role-shared
`), 0644))
p := NewParser(dir)
p.vars["existing_value"] = "keep-me"
tasks, err := p.ParseRole("web", "main.yml")
require.NoError(t, err)
require.Len(t, tasks, 1)
assert.Equal(t, "debug", tasks[0].Module)
assert.Equal(t, "keep-me", p.vars["existing_value"])
assert.Equal(t, "default-value", p.vars["role_default"])
assert.Equal(t, "vars-value", p.vars["role_value"])
assert.Equal(t, "role-shared", p.vars["shared_value"])
}
// --- GetHosts ---
func TestParser_GetHosts_Good_AllPattern(t *testing.T) {