From 2c0b68627d8a9e8e8ab5e18f70d40f650d48c46a Mon Sep 17 00:00:00 2001 From: Virgil Date: Thu, 2 Apr 2026 03:12:11 +0000 Subject: [PATCH] Load role vars in ParseRole --- parser.go | 18 +++++++++++++++++- parser_test.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/parser.go b/parser.go index d9e31a5..202dc71 100644 --- a/parser.go +++ b/parser.go @@ -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 } diff --git a/parser_test.go b/parser_test.go index 990152c..c9c1cf6 100644 --- a/parser_test.go +++ b/parser_test.go @@ -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) {