Skip to content

Usage & API

The module path is github.com/go-puppet/puppet. Packages:

Package Role
github.com/go-puppet/puppet façade: Parse, ParseExpression
…/lexer tokenizer (Lex)
…/parser recursive-descent parser (Parse, ParseExpression)
…/ast Puppet::Pops-style node model + Sexpr renderer
…/eval evaluator (EvalString, EvalPlanString, Evaluator, RegisterFunction, WithFacts/WithHiera/WithNodeName/WithTemplateLoader/WithExportedStore/WithPlanExecutor)
…/catalog catalog model + Puppet catalog JSON
…/hcl Terraform-style HCL2 front-end (Parse) → the same ast.Program

Parse a manifest

prog, err := puppet.Parse(`file { '/tmp/x': ensure => present }`)
// prog is an *ast.Program; walk it, transform it, or render it:
fmt.Println(ast.Sexpr(prog))

Compile to a catalog

cat, logs, err := eval.EvalString(src,
    eval.WithNodeName("web1"),
    eval.WithFacts(eval.MapFacts{"os": map[string]any{"family": "Debian"}}))
fmt.Println(cat.JSON())

HCL2 front-end

hcl.Parse reads a Terraform-style HCL2 manifest and produces the same *ast.Program the native Puppet parser produces, so it compiles to an identical catalog through the same evaluator:

prog, _ := hcl.Parse(`
    locals { mode = "0644" }
    resource "file" "app" {
        ensure  = "present"
        mode    = local.mode
        require = resource.package.app
    }
`)
cat, _ := eval.New().EvalProgram(prog)
fmt.Println(cat.JSON())

Constructs outside the v0.1 mapping (function calls, a ? b : c, for comprehensions, %{…} directives, unknown block types) return a clear unsupported in HCL2 v0.1: … error rather than a fake stub.

Wire in Hiera

h, _ := hiera.Load("hiera.yaml", hiera.MapScope{})
cat, _, _ := eval.EvalString(src, eval.WithHiera(h)) // backs lookup() and class data binding

Custom functions

e := eval.New()
e.RegisterFunction("double", func(c *eval.Context, args []eval.Value, _ *eval.Block) (eval.Value, error) {
    return args[0].(int64) * 2, nil
})
prog, _ := parser.Parse(`notice(double(21))`)
e.EvalProgram(prog) // logs "42"

Value model

Values use the same representation as go-pcore: bool, int64, float64, string for scalars; []any for arrays; map[string]any for hashes; pcore.Undef for undef; and the pcore wrapper types (*pcore.Regexp, pcore.Type, …) for the rest.