Replicator takes in a template on standard input, reads variables from /etc/replicator.d
and uses these to render the
template to standard output.
-
The template language is that of Go's
text/template
library, so refer to its documentation for syntax and available functions. Also, the Sprig library of functions is available. Refer to the release notes for which Sprig version is available in a specific release of Replicator.The additional template function
toToml
is available, and works analogously totoJson
from Sprig. -
Variables come from TOML files in files called
/etc/replicator.d/*.toml
. If there are multiple files, they are parsed in alphabetical order and merged as described in the section "Merging" below.
For example:
$ cat /etc/replicator.d/*.toml
[[item]]
name = "foo"
[[item]]
name = "bar"
$ cat example.txt
{{ range .Vars.item }}Hello {{.Name}}. {{end}}
$ replicator < example.txt
Hello foo. Hello bar.
The environment variable REPLICATOR_INPUTS
can be used to instruct Replicator to use different source files. The variable shall contain a list of globs, separated by colons. For example, the following example uses Replicator's merging algorithm to merge several TOML files into one:
$ echo '{{toToml .Vars}}' | REPLICATOR_INPUTS=input1/*.toml:input2/*.toml replicator
Replicator requires Go as build-time dependencies. There are no runtime dependencies other than a libc. Once you're all set, the build is done with
make
sudo make install
Replicator can also be installed via go get github.com/holocm/replicator
.
Each TOML file in /etc/replicator.d/*.toml
is parsed in alphabetical order,
and then they are all merged in the foldl
pattern:
result = (((first + second) + third) + ...)
Arrays are merged by concatenation.
[[first]]
name = "foo"
[[second]]
name = "bar"
[[result]]
name = "foo"
[[result]]
name = "bar"
Tables are merged key-by-key, such that values in the second table take precedence over those with the same key in the first table.
[first]
key1 = "value1"
key2 = "value2"
[second]
key1 = "value11"
key3 = "value33"
[result]
key1 = "value11"
key2 = "value2"
key3 = "value33"
However, if the value from the first table is another table or an array, it will be merged with the value from the second table by applying these rules recursively. A type error will be issued if both values have different types (where all scalar values are considered to be of the same type; so there are only three types, "scalar", "array" and "table").