2016-02-06 23:34:21 +00:00
|
|
|
---
|
|
|
|
layout: "docs"
|
2018-06-22 20:51:41 +00:00
|
|
|
page_title: "Variable Interpolation"
|
2018-10-11 00:37:49 +00:00
|
|
|
sidebar_current: "docs-variable-interpolation"
|
2016-02-06 23:34:21 +00:00
|
|
|
description: |-
|
2016-10-28 00:36:26 +00:00
|
|
|
Learn about the Nomad's interpolation and interpreted variables.
|
2016-02-06 23:34:21 +00:00
|
|
|
---
|
|
|
|
|
2018-06-22 20:51:41 +00:00
|
|
|
# Variable Interpolation
|
2016-10-28 00:36:26 +00:00
|
|
|
|
2019-01-10 21:15:41 +00:00
|
|
|
Nomad supports interpreting two classes of variables: node attributes and
|
2016-10-28 00:36:26 +00:00
|
|
|
runtime environment variables. Node attributes are interpretable in constraints,
|
2019-01-10 21:15:41 +00:00
|
|
|
task environment variables, and certain driver fields. Runtime environment
|
2016-10-28 00:36:26 +00:00
|
|
|
variables are not interpretable in constraints because they are only defined
|
|
|
|
once the scheduler has placed them on a particular node.
|
2016-02-06 23:34:21 +00:00
|
|
|
|
|
|
|
The syntax for interpreting variables is `${variable}`. An example and a
|
|
|
|
comprehensive list of interpretable fields can be seen below:
|
|
|
|
|
2016-10-03 19:50:35 +00:00
|
|
|
```hcl
|
2016-10-03 20:59:56 +00:00
|
|
|
task "docs" {
|
2016-10-03 19:50:35 +00:00
|
|
|
driver = "docker"
|
|
|
|
|
|
|
|
# Drivers support interpreting node attributes and runtime environment
|
|
|
|
# variables
|
|
|
|
config {
|
|
|
|
image = "my-app"
|
|
|
|
|
|
|
|
# Interpret runtime variables to inject the address to bind to and the
|
|
|
|
# location to write logs to.
|
|
|
|
args = [
|
|
|
|
"--bind", "${NOMAD_ADDR_RPC}",
|
|
|
|
"--logs", "${NOMAD_ALLOC_DIR}/logs",
|
|
|
|
]
|
|
|
|
|
|
|
|
port_map {
|
|
|
|
RPC = 6379
|
2016-02-06 23:34:21 +00:00
|
|
|
}
|
2016-10-03 19:50:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# Constraints only support node attributes as runtime environment variables
|
|
|
|
# are only defined after the task is placed on a node.
|
|
|
|
constraint {
|
|
|
|
attribute = "${attr.kernel.name}"
|
|
|
|
value = "linux"
|
|
|
|
}
|
|
|
|
|
|
|
|
# Environment variables are interpreted and can contain both runtime and
|
2019-07-26 02:03:20 +00:00
|
|
|
# node attributes. These environment variables are passed into the task.
|
2016-10-03 19:50:35 +00:00
|
|
|
env {
|
|
|
|
"DC" = "Running on datacenter ${node.datacenter}"
|
|
|
|
"VERSION" = "Version ${NOMAD_META_VERSION}"
|
|
|
|
}
|
|
|
|
|
|
|
|
# Meta keys are also interpretable.
|
|
|
|
meta {
|
|
|
|
VERSION = "v0.3"
|
|
|
|
}
|
2016-02-06 23:34:21 +00:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
## Node Variables <a id="interpreted_node_vars"></a>
|
|
|
|
|
|
|
|
Below is a full listing of node attributes that are interpretable. These
|
2016-10-03 20:59:56 +00:00
|
|
|
attributes are interpreted by __both__ constraints and within the task and
|
2016-02-06 23:34:21 +00:00
|
|
|
driver.
|
|
|
|
|
|
|
|
<table class="table table-bordered table-striped">
|
|
|
|
<tr>
|
|
|
|
<th>Variable</th>
|
|
|
|
<th>Description</th>
|
2016-10-03 20:59:56 +00:00
|
|
|
<th>Example Value</th>
|
2016-02-06 23:34:21 +00:00
|
|
|
</tr>
|
|
|
|
<tr>
|
2016-10-03 20:59:56 +00:00
|
|
|
<td><tt>${node.unique.id}</tt></td>
|
|
|
|
<td>36 character unique client identifier</td>
|
|
|
|
<td><tt>9afa5da1-8f39-25a2-48dc-ba31fd7c0023</tt></td>
|
2016-02-06 23:34:21 +00:00
|
|
|
</tr>
|
|
|
|
<tr>
|
2016-10-03 20:59:56 +00:00
|
|
|
<td><tt>${node.datacenter}</tt></td>
|
|
|
|
<td>Client's datacenter</td>
|
|
|
|
<td><tt>dc1</tt></td>
|
2016-02-06 23:34:21 +00:00
|
|
|
</tr>
|
|
|
|
<tr>
|
2016-10-03 20:59:56 +00:00
|
|
|
<td><tt>${node.unique.name}</tt></td>
|
|
|
|
<td>Client's name</td>
|
|
|
|
<td><tt>nomad-client-10-1-2-4</tt></td>
|
2016-02-06 23:34:21 +00:00
|
|
|
</tr>
|
|
|
|
<tr>
|
2016-10-03 20:59:56 +00:00
|
|
|
<td><tt>${node.class}</tt></td>
|
|
|
|
<td>Client's class</td>
|
|
|
|
<td><tt>linux-64bit</tt></td>
|
2016-02-06 23:34:21 +00:00
|
|
|
</tr>
|
|
|
|
<tr>
|
2017-01-03 21:25:56 +00:00
|
|
|
<td><tt>${attr.<property>}</tt></td>
|
2016-10-03 20:59:56 +00:00
|
|
|
<td>Property given by <tt>property</tt> on the client</td>
|
2017-05-02 00:36:20 +00:00
|
|
|
<td><tt>${attr.cpu.arch} => amd64</tt></td>
|
2016-02-06 23:34:21 +00:00
|
|
|
</tr>
|
|
|
|
<tr>
|
2017-01-03 21:25:56 +00:00
|
|
|
<td><tt>${meta.<key>}</tt></td>
|
2016-10-03 20:59:56 +00:00
|
|
|
<td>Metadata value given by <tt>key</tt> on the client</td>
|
|
|
|
<td><tt>${meta.foo} => bar</tt></td>
|
2016-02-06 23:34:21 +00:00
|
|
|
</tr>
|
|
|
|
</table>
|
|
|
|
|
2016-10-03 20:59:56 +00:00
|
|
|
Below is a table documenting common node properties:
|
2016-02-06 23:34:21 +00:00
|
|
|
|
|
|
|
<table class="table table-bordered table-striped">
|
|
|
|
<tr>
|
2016-10-03 20:59:56 +00:00
|
|
|
<th>Property</th>
|
2016-02-06 23:34:21 +00:00
|
|
|
<th>Description</th>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
2017-05-02 00:36:20 +00:00
|
|
|
<td><tt>${attr.cpu.arch}</tt></td>
|
2016-10-03 20:59:56 +00:00
|
|
|
<td>CPU architecture of the client (e.g. <tt>amd64</tt>, <tt>386</tt>)</td>
|
2016-02-06 23:34:21 +00:00
|
|
|
</tr>
|
|
|
|
<tr>
|
2017-02-12 03:47:17 +00:00
|
|
|
<td><tt>${attr.cpu.numcores}</tt></td>
|
2016-02-06 23:34:21 +00:00
|
|
|
<td>Number of CPU cores on the client</td>
|
|
|
|
</tr>
|
2017-06-27 18:58:01 +00:00
|
|
|
<tr>
|
|
|
|
<td><tt>${attr.cpu.totalcompute}</tt></td>
|
|
|
|
<td>
|
|
|
|
<tt>cpu.frequency × cpu.numcores</tt> but may be overridden by <tt>client.cpu_total_compute</tt>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><tt>${attr.consul.datacenter}</tt></td>
|
|
|
|
<td>The Consul datacenter of the client (if Consul is found)</td>
|
|
|
|
</tr>
|
2016-02-06 23:34:21 +00:00
|
|
|
<tr>
|
2017-02-12 03:47:17 +00:00
|
|
|
<td><tt>${attr.driver.<property>}</tt></td>
|
2016-10-03 20:59:56 +00:00
|
|
|
<td>See the [task drivers](/docs/drivers/index.html) for property documentation</td>
|
2016-02-06 23:34:21 +00:00
|
|
|
</tr>
|
|
|
|
<tr>
|
2017-02-12 03:47:17 +00:00
|
|
|
<td><tt>${attr.unique.hostname}</tt></td>
|
2016-02-06 23:34:21 +00:00
|
|
|
<td>Hostname of the client</td>
|
|
|
|
</tr>
|
2017-03-27 17:45:16 +00:00
|
|
|
<tr>
|
|
|
|
<td><tt>${attr.unique.network.ip-address}</tt></td>
|
|
|
|
<td>The IP address fingerprinted by the client and from which task ports are allocated</td>
|
|
|
|
</tr>
|
2016-02-06 23:34:21 +00:00
|
|
|
<tr>
|
2017-02-12 03:47:17 +00:00
|
|
|
<td><tt>${attr.kernel.name}</tt></td>
|
2016-10-03 20:59:56 +00:00
|
|
|
<td>Kernel of the client (e.g. <tt>linux</tt>, <tt>darwin</tt>)</td>
|
2016-02-06 23:34:21 +00:00
|
|
|
</tr>
|
|
|
|
<tr>
|
2017-02-12 03:47:17 +00:00
|
|
|
<td><tt>${attr.kernel.version}</tt></td>
|
2016-10-03 20:59:56 +00:00
|
|
|
<td>Version of the client kernel (e.g. <tt>3.19.0-25-generic</tt>, <tt>15.0.0</tt>)</td>
|
2016-02-06 23:34:21 +00:00
|
|
|
</tr>
|
|
|
|
<tr>
|
2017-02-12 03:47:17 +00:00
|
|
|
<td><tt>${attr.platform.aws.ami-id}</tt></td>
|
2016-10-03 20:59:56 +00:00
|
|
|
<td>AMI ID of the client (if on AWS EC2)</td>
|
2016-02-06 23:34:21 +00:00
|
|
|
</tr>
|
|
|
|
<tr>
|
2017-02-12 03:47:17 +00:00
|
|
|
<td><tt>${attr.platform.aws.instance-type}</tt></td>
|
2016-10-03 20:59:56 +00:00
|
|
|
<td>Instance type of the client (if on AWS EC2)</td>
|
2016-02-06 23:34:21 +00:00
|
|
|
</tr>
|
|
|
|
<tr>
|
2017-02-12 03:47:17 +00:00
|
|
|
<td><tt>${attr.os.name}</tt></td>
|
2016-10-03 20:59:56 +00:00
|
|
|
<td>Operating system of the client (e.g. <tt>ubuntu</tt>, <tt>windows</tt>, <tt>darwin</tt>)</td>
|
2016-02-06 23:34:21 +00:00
|
|
|
</tr>
|
|
|
|
<tr>
|
2017-02-12 03:47:17 +00:00
|
|
|
<td><tt>${attr.os.version}</tt></td>
|
2016-02-06 23:34:21 +00:00
|
|
|
<td>Version of the client OS</td>
|
|
|
|
</tr>
|
|
|
|
</table>
|
|
|
|
|
2016-10-03 20:59:56 +00:00
|
|
|
Here are some examples of using node attributes and properties in a job file:
|
|
|
|
|
|
|
|
```hcl
|
|
|
|
job "docs" {
|
|
|
|
# This will constrain this job to only run on 64-bit clients.
|
|
|
|
constraint {
|
2017-05-02 00:36:20 +00:00
|
|
|
attribute = "${attr.cpu.arch}"
|
2016-10-03 20:59:56 +00:00
|
|
|
value = "amd64"
|
|
|
|
}
|
|
|
|
|
|
|
|
# This will restrict the job to only run on clients with 4 or more cores.
|
|
|
|
# Note: you may also declare a resource requirement for CPU for a task.
|
|
|
|
constraint {
|
|
|
|
attribute = "${cpu.numcores}"
|
|
|
|
operator = ">="
|
|
|
|
value = "4"
|
|
|
|
}
|
|
|
|
|
|
|
|
# Only run this job on a memory-optimized AWS EC2 instance.
|
|
|
|
constraint {
|
|
|
|
attribute = "${attr.platform.aws.instance-type}"
|
|
|
|
value = "m4.xlarge"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2016-02-06 23:34:21 +00:00
|
|
|
## Environment Variables <a id="interpreted_env_vars"></a>
|
|
|
|
|
|
|
|
The following are runtime environment variables that describe the environment
|
|
|
|
the task is running in. These are only defined once the task has been placed on
|
|
|
|
a particular node and as such can not be used in constraints.
|
|
|
|
|
2017-06-19 23:34:29 +00:00
|
|
|
Environment variables should be enclosed in brackets `${...}` for
|
|
|
|
interpolation.
|
|
|
|
|
2018-11-09 19:27:48 +00:00
|
|
|
### Dots in Variables <a id="dots_in_vars"></a>
|
|
|
|
|
|
|
|
Starting in Nomad 0.9, task configuration interpolation requires variables to
|
|
|
|
be valid identifiers. While this does not affect default variables or common
|
|
|
|
custom variables, it is possible to define a variable that is not a valid
|
|
|
|
identifier:
|
|
|
|
|
|
|
|
```hcl
|
|
|
|
env {
|
|
|
|
"valid.name" = "ok"
|
|
|
|
"invalid...name" = "not a valid identifier"
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
The environment variable `invalid...name` cannot be interpolated using the
|
2019-04-30 07:04:17 +00:00
|
|
|
standard `"${invalid...name}"` syntax. The dots will be interpreted as object
|
2018-11-09 19:27:48 +00:00
|
|
|
notation so multiple consecutive dots are invalid.
|
|
|
|
|
|
|
|
To continue supporting all user environment variables Nomad 0.9 added a new
|
|
|
|
`env` variable which allows accessing any environment variable through index
|
|
|
|
syntax:
|
|
|
|
|
|
|
|
```hcl
|
|
|
|
task "redis" {
|
|
|
|
driver = "docker"
|
|
|
|
config {
|
|
|
|
image = "redis:3.2"
|
|
|
|
labels {
|
|
|
|
label1 = "${env["invalid...name"]}"
|
|
|
|
label2 = "${env["valid.name"]}"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2017-06-19 23:34:29 +00:00
|
|
|
<%= partial "envvars.html.md" %>
|