Using Jsonnet
While Tera is excellent for simple text substitution, Jsonnet is a data templating language designed for generating configuration data. It allows for local variables, functions, mixins, and imports, making it ideal for complex output generation. For advanced examples consult case studies.
When using jsonnet, the data context is injected as External Variables. You access them using std.extVar().
origin_resource: Access the current resource and its traversed graph context usingstd.extVar("origin_resource").- Global Variables: Any variables defined in the TOML header are also available via
std.extVar("var_name").
Example 1: Inline Jsonnet Logic
[[output]]
resource_type = "k8s_manifest"
name = "svc-{{ origin_resource.name }}" # Name generation still uses Tera
jsonnet = """
local origin = std.extVar("origin_resource");
{
apiVersion: "v1",
kind: "Service",
metadata: {
name: origin.name,
labels: {
// Use Jsonnet logic
app: if std.length(origin.application) > 0 then origin.application[0].name else "unknown"
}
}
}
"""
Example 2: Modular Logic with Imports
rescile supports sibling imports, meaning you can import .libsonnet or .jsonnet files located in the same directory as your TOML configuration file. This promotes modularity and reuse.
data/output/k8s.libsonnet:
{
service(name):: {
apiVersion: "v1",
kind: "Service",
metadata: { name: name }
}
}
data/output/services.toml:
[[output]]
resource_type = "k8s_manifest"
name = "svc-{{ origin_resource.name }}"
jsonnet = """
local k8s = import 'k8s.libsonnet';
local origin = std.extVar("origin_resource");
k8s.service(origin.name)
"""