Skip to main content

title: “Using Consul Template to Monitor Changes in Consul K/V” description: “Step-by-step guide to pull dynamic configuration from Consul K/V store using Consul Template.”

In this tutorial, you’ll learn how to leverage Consul Template to dynamically fetch configuration values from a Consul K/V store and generate application configuration files automatically. This approach ensures your application configs stay in sync with the latest Consul K/V entries.

1. Populate Consul K/V Store

First, add the required key-value pairs for our eCommerce application. You can verify these entries in Consul UI or via CLI.
KeyValueDescription
apps/eCommerce/version4.5Current application version
apps/eCommerce/environmentproductionDeployment environment
apps/eCommerce/database_hostcustomer_dbHostname of the customer database
apps/eCommerce/databasebillingDatabase name for billing service
Run the following commands:
consul kv put apps/eCommerce/version 4.5
consul kv put apps/eCommerce/environment production
consul kv put apps/eCommerce/database_host customer_db
consul kv put apps/eCommerce/database billing

2. Download and Install Consul Template

Head over to the Consul Template releases page and copy the link for your platform.
The image shows a terminal window and a browser displaying a list of downloadable files for different operating systems from the HashiCorp Consul Template release page.
Make sure to choose the correct architecture (e.g., linux_amd64) from the release page.
Install and verify:
curl -sLo /tmp/consul-template.zip \
  https://releases.hashicorp.com/consul-template/0.25.1/consul-template_0.25.1_linux_amd64.zip

unzip /tmp/consul-template.zip -d /tmp
sudo mv /tmp/consul-template /usr/local/bin/

consul-template -v
# Expected output: consul-template v0.25.1

3. Create a Template File

Define your template with placeholders that map to the Consul K/V keys:
cat << 'EOF' > config.json.tmpl
{
  "environment":   "{{ key "apps/eCommerce/environment" }}",
  "version":       "{{ key "apps/eCommerce/version" }}",
  "database_host": "{{ key "apps/eCommerce/database_host" }}",
  "database_name": "{{ key "apps/eCommerce/database" }}"
}
EOF
Each {{ key "..." }} snippet instructs Consul Template to fetch the corresponding value at render time.

4. Render the Template

Use the -once flag for a single render, or run without it to watch for changes:
consul-template -template "config.json.tmpl:config.json" -once
Using -once renders the file a single time and then exits. Remove -once to keep watching for updates.
Verify the output:
ls
cat config.json
{
  "environment": "production",
  "version":     "4.5",
  "database_host": "customer_db",
  "database_name": "billing"
}

5. Next Steps

In production, run Consul Template as a service or sidecar to continuously monitor your K/V store. This ensures that any update in Consul is immediately reflected in your application’s configuration.