open-nomad/website/source/docs/job-specification/template.html.md

170 lines
5.5 KiB
Markdown
Raw Normal View History

2016-10-31 04:05:05 +00:00
---
layout: "docs"
page_title: "template Stanza - Job Specification"
sidebar_current: "docs-job-specification-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
2017-01-24 17:12:42 +00:00
environment variables, Consul data, Vault secrets, or just general
configurations within a Nomad task.
2016-10-31 04:05:05 +00:00
---
# `template` Stanza
<table class="table table-bordered table-striped">
<tr>
<th width="120">Placement</th>
<td>
<code>job -> group -> task -> **template**</code>
</td>
</tr>
</table>
The `template` block instantiates an instance of a template renderer. This
creates a convenient way to ship configuration files that are populated from
2017-01-24 17:12:42 +00:00
environment variables, Consul data, Vault secrets, or just general
configurations within a Nomad task.
2016-10-31 04:05:05 +00:00
```hcl
job "docs" {
group "example" {
task "server" {
template {
source = "local/redis.conf.tpl"
destination = "local/redis.conf"
change_mode = "signal"
2017-03-14 09:12:48 +00:00
change_signal = "SIGINT"
2016-10-31 04:05:05 +00:00
}
}
}
}
```
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].
2016-10-31 04:05:05 +00:00
## `template` Parameters
- `change_mode` `(string: "restart")` - Specifies the behavior Nomad should take
if the rendered template changes. The possible values are:
- `"noop"` - take no action (continue running the task)
- `"restart"` - restart the task
- `"signal"` - send a configurable signal to the task
2017-01-26 05:16:18 +00:00
- `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`.
2016-10-31 04:05:05 +00:00
- `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.
2017-01-26 05:16:18 +00:00
- `destination` `(string: <required>)` - Specifies the location where the
resulting template should be rendered, relative to the task directory.
2017-02-21 00:43:28 +00:00
* `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.
2017-02-02 19:28:04 +00:00
- `perms` `(string: "666")` - Specifies the rendered template's permissions.
File permissions are given as octal of the unix file permissions rwxrwxrwx.
2016-10-31 04:05:05 +00:00
2017-02-21 00:43:28 +00:00
* `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.
2017-01-26 05:16:18 +00:00
- `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.
2016-10-31 04:05:05 +00:00
- `splay` `(string: "5s")` - Specifies a random amount of time to wait between
0ms 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.
## `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
2016-10-31 20:51:06 +00:00
This example uses an inline template to render a file to disk. This file watches
various keys in Consul for changes:
2016-10-31 04:05:05 +00:00
```hcl
template {
data = "---\nkey: {{ key \"service/my-key\" }}"
destination = "local/file.yml"
}
```
2016-10-31 20:51:06 +00:00
It is also possible to use heredocs for multi-line templates, like:
```hcl
template {
data = <<EOH
---
bind_port: {{ env "NOMAD_PORT_db" }}
scratch_dir: {{ env "NOMAD_TASK_DIR" }}
2017-01-23 23:50:38 +00:00
service_key: {{ key "service/my-key" }}
2016-10-31 20:51:06 +00:00
EOH
destination = "local/file.yml"
}
```
2016-10-31 04:05:05 +00:00
### Remote Template
This example uses an [`artifact`][artifact] stanza to download an input template
before passing it to the template engine:
```hcl
artifact {
source = "https://example.com/file.yml.tpl"
destination = "local/file.yml.tpl"
}
template {
source = "local/file.yml.tpl"
destination = "local/file.yml"
}
```
### Node Variables
As of Nomad v0.5.6 it is possible to access the Node's attributes and metadata.
```hcl
template {
data = <<EOH
---
node_dc: {{ env "node.datacenter" }}
node_cores: {{ env "attr.cpu.numcores" }}
meta_key: {{ env "meta.node_meta_key" }}
EOH
destination = "local/file.yml"
}
```
## Client Configuration
The `template` block has the following [client configuration
options](/docs/agent/config.html#options):
* `template.allow_host_source` - Allows templates to specify their source
template as an absolute path referencing host directories. Defaults to `true`.
2016-10-31 04:05:05 +00:00
[ct]: https://github.com/hashicorp/consul-template "Consul Template by HashiCorp"
[artifact]: /docs/job-specification/artifact.html "Nomad artifact Job Specification"
[env]: /docs/runtime/environment.html "Nomad Runtime Environment"
[nodevars]: /docs/runtime/interpolation.html#interpreted_node_vars "Nomad Node Variables"