Nomad Job Configuration
How to add Configuration to your Application
To configure a task you can:
- Add Commandline Arguments that are passed to your application when you run it.
- Add Environment Variables that are accessible to Nomad to be passed on.
- Use Artifacts to download and unzip required files
- Use Templates to generate variables
Job Arguments
The http-echo
application from is started - this time without Docker - using the Exec Driver with the /bin/http-echo
command. The application is then configured using Arguments to run on port 5678
and return a Hello World
when receiving an HTTP GET request:
group "example" {
task "server" {
driver = "exec"
config {
command = "/bin/http-echo"
args = [
"-listen",
":5678",
"-text",
"Hello World",
]
}
}
}
Environment Variables
Environment Variables can be passed on to our application inside the task block of our Nomad job file:
job "frontend" {
group "example" {
task "server" {
env {
DB_HOST = "my-db-host.com"
DB_USER = "db_user"
DB_PASS = "dbpassword"
}
}
}
}
Configuration Artifacts
Download a configuration file from a Git Repository using the Artifacts Stanza:
artifact {
# The git:: prefix forces go-getter's protocol detection to use the git ssh
# protocol. It can also automatically detect the protocol from the domain of
# some git hosting providers (such as GitHub) without the prefix.
source = "git::git@bitbucket.org:example/nomad-examples"
destination = "local/repo"
options {
# Make sure that the Nomad user's known hosts file is populated:
# ssh-keyscan github.com | sudo tee -a /root/.ssh/known_hosts
# https://github.com/hashicorp/go-getter/issues/55
sshkey = "${base64encode(file(pathexpand("~/.ssh/id_rsa")))}"
}
}
To download from a private repo, sshkey needs to be set. The key must be base64-encoded string. On Linux, you can run base64 -w0 <file>
to encode the file.
Templates
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:
job "docs" {
group "example" {
task "server" {
artifact {
source = "https://example.com/redis.conf.tpl"
destination = "local/redis.conf.tpl"
}
template {
source = "local/redis.conf.tpl"
destination = "local/redis.conf"
change_mode = "signal"
change_signal = "SIGINT"
}
}
}
}
You can also utilize inline templates and turn them into environment variables like this:
template {
data = <<EOH
---
bind_port: {{ env "NOMAD_PORT_db" }}
scratch_dir: {{ env "NOMAD_TASK_DIR" }}
node_id: {{ env "node.unique.id" }}
service_key: {{ key "service/my-key" }}
EOH
destination = "local/file.env"
env = true
}