--- layout: docs page_title: template Stanza - Job Specification sidebar_title: template description: |- The "template" block instantiates an instance of a template renderer. This creates a convenient way to ship configuration files that are populated from environment variables, Consul data, Vault secrets, or just general configurations within a Nomad task. --- # `template` Stanza The `template` block instantiates an instance of a template renderer. This creates a convenient way to ship configuration files that are populated from environment variables, Consul data, Vault secrets, or just general configurations within a Nomad task. ```hcl job "docs" { group "example" { task "server" { template { source = "local/redis.conf.tpl" destination = "local/redis.conf" change_mode = "signal" change_signal = "SIGINT" } } } } ``` Nomad utilizes a tool called [Consul Template][ct]. Since Nomad v0.5.3, the template can reference [Nomad's runtime environment variables][env]. Since Nomad v0.5.6, the template can reference [Node attributes and metadata][nodevars]. For a full list of the API template functions, please refer to the [Consul Template README][ct]. Since Nomad v0.6.0, templates can be read as environment variables. ## `template` Parameters - `change_mode` `(string: "restart")` - Specifies the behavior Nomad should take if the rendered template changes. Nomad will always write the new contents of the template to the specified destination. The possible values below describe Nomad's action after writing the template to disk. - `"noop"` - take no action (continue running the task) - `"restart"` - restart the task - `"signal"` - send a configurable signal to the task - `change_signal` `(string: "")` - Specifies the signal to send to the task as a string like `"SIGUSR1"` or `"SIGINT"`. This option is required if the `change_mode` is `signal`. - `data` `(string: "")` - Specifies the raw template to execute. One of `source` or `data` must be specified, but not both. This is useful for smaller templates, but we recommend using `source` for larger templates. - `destination` `(string: )` - Specifies the location where the resulting template should be rendered, relative to the task directory. - `env` `(bool: false)` - Specifies the template should be read back in as environment variables for the task. ([See below](#environment-variables)) - `left_delimiter` `(string: "{{")` - Specifies the left delimiter to use in the template. The default is "{{" for some templates, it may be easier to use a different delimiter that does not conflict with the output file itself. - `perms` `(string: "644")` - Specifies the rendered template's permissions. File permissions are given as octal of the Unix file permissions `rwxrwxrwx`. - `right_delimiter` `(string: "}}")` - Specifies the right delimiter to use in the template. The default is "}}" for some templates, it may be easier to use a different delimiter that does not conflict with the output file itself. - `source` `(string: "")` - Specifies the path to the template to be rendered. One of `source` or `data` must be specified, but not both. This source can optionally be fetched using an [`artifact`][artifact] resource. This template must exist on the machine prior to starting the task; it is not possible to reference a template inside of a Docker container, for example. - `splay` `(string: "5s")` - Specifies a random amount of time to wait between 0 ms and the given splay value before invoking the change mode. This is specified using a label suffix like "30s" or "1h", and is often used to prevent a thundering herd problem where all task instances restart at the same time. - `vault_grace` `(string: "15s")` - [Deprecated](https://github.com/hashicorp/consul-template/issues/1268) ## `template` Examples The following examples only show the `template` stanzas. Remember that the `template` stanza is only valid in the placements listed above. ### Inline Template This example uses an inline template to render a file to disk. This file watches various keys in Consul for changes: ```hcl template { data = "---\nkey: {{ key \"service/my-key\" }}" destination = "local/file.yml" } ``` It is also possible to use heredocs for multi-line templates, like: ```hcl template { data = < **Note**: `generate_lease` must be set to `true` (non-default) on the Vault PKI role.

Failure to do so will cause the template to frequently render a new certificate, approximately every minute. This creates a significant number of certificates to be expired in Vault and could ultimately lead to Vault performance impacts and failures. #### As individual files For templates, all dependencies are mapped into a single list. This means that multiple templates watching the same path return the same data. ```hcl template { data = <