file_from_template_mustache
Build a file from a mustache template.
⚙️ Compatible targets: Linux, Windows
Parameters
Name | Documentation |
---|---|
source_template | Source file containing a template to be expanded (absolute path on the target node). This parameter is required. |
path | Destination file (absolute path on the target node). This parameter is required. |
Outcome conditions
You need to replace ${path}
with its actual canonified value.
- ✅ Ok:
file_from_template_${path}_ok
- ☑️ Already compliant:
file_from_template_${path}_kept
- 🟨 Repaired:
file_from_template_${path}_repaired
- ☑️ Already compliant:
- ❌ Error:
file_from_template_${path}_error
Example
method: file_from_template_mustache
params:
path: VALUE
source_template: VALUE
Documentation
See file_from_template_type for general documentation about templates usage.
Syntax
Mustache is a logic-less templating language, available in a lot of languages, and used for file templating in Rudder. The mustache syntax reference is https://mustache.github.io/mustache.5.html. The Windows implementation follows the standard, the Unix one is a bit richer as describe below.
We will here describe the way to get agent data into a template. Ass explained in the general templating documentation, we can access various data in a mustache template.
The main specificity compared to standard mustache syntax of prefixes in all expanded values:
classes
to access conditionsvars
to access all variables
Classes
Here is how to display content depending on conditions definition:
{{#classes.my_condition}}
content when my_condition is defined
{{/classes.my_condition}}
{{^classes.my_condition}}
content when my_condition is *not* defined
{{/classes.my_condition}}
Note: You cannot use condition expressions here.
Scalar variable
Here is how to display a scalar variable value (integer, string, ...),
if you have defined variable_string("variable_prefix", "my_variable", "my_value")
:
{{{vars.variable_prefix.my_variable}}}
We use the triple {{{ }}}
to avoid escaping html entities.
Iteration
Iteration is done using a syntax similar to scalar variables, but applied on container variables.
- Use
{{#vars.container}} content {{/vars.container}}
to iterate - Use
{{{.}}}
for the current element value in iteration - Use
{{{key}}}
for thekey
value in current element - Use
{{{.key}}}
for thekey
value in current element (Linux only) - Use
{{{@}}}
for the current element key in iteration (Linux only)
To iterate over a list, for example defined with:
variable_iterator("variable_prefix", "iterator_name", "a,b,c", ",")
Use the following file:
{{#vars.variable_prefix.iterator_name}}
{{{.}}} is the current iterator_name value
{{/vars.variable_prefix.iterator_name}}
Which will be expanded as:
a is the current iterator_name value
b is the current iterator_name value
c is the current iterator_name value
To iterate over a container defined by the following json file, loaded with
variable_dict_from_file("variable_prefix", "dict_name", "path")
:
{
"hosts": [
"host1",
"host2"
],
"files": [
{"name": "file1", "path": "/path1", "users": [ "user1", "user11" ] },
{"name": "file2", "path": "/path2", "users": [ "user2" ] }
],
"properties": {
"prop1": "value1",
"prop2": "value2"
}
}
Use the following template:
{{#vars.variable_prefix.dict_name.hosts}}
{{{.}}} is the current hosts value
{{/vars.variable_prefix.dict_name.hosts}}
# will display the name and path of the current file
{{#vars.variable_prefix.dict_name.files}}
{{{name}}}: {{{path}}}
{{/vars.variable_prefix.dict_name.files}}
# Lines below will only be properly rendered in unix Nodes
# will display the users list of each file
{{#vars.variable_prefix.dict_name.files}}
{{{name}}}:{{#users}} {{{.}}}{{/users}}
{{/vars.variable_prefix.dict_name.files}}
# will display the current properties key/value pair
{{#vars.variable_prefix.dict_name.properties}}
{{{@}}} -> {{{.}}}
{{/vars.variable_prefix.dict_name.properties}}
Which will be expanded as:
host1 is the current hosts value
host2 is the current hosts value
# will display the name and path of the current file
file1: /path1
file2: /path2
# Lines below will only be properly rendered in unix Nodes
# will display the users list of each file
file1: user1 user11
file2: user2
# will display the current properties key/value pair
prop1 -> value1
prop2 -> value2
Note: You can use {{#-top-}} ... {{/-top-}}
to iterate over the top level container.
System variables
Some sys
dict variables (like sys.ipv4
) are also accessible as string, for example:
${sys.ipv4}
gives54.32.12.4
$[sys.ipv4[ethO]}
gives54.32.12.4
$[sys.ipv4[eth1]}
gives10.45.3.2
These variables are not accessible as dict in the templating data, but are represented as string:
ipv4
is a string variable in thesys
dict with value54.32.12.4
ipv4[ethO]
is a string variable in thesys
dict with value54.32.12.4
ipv4
is not accessible as a dict in the template
To access these value, use the following syntax in your mustache templates:
{{{vars.sys.ipv4[eth0]}}}