github.com/outbrain/consul@v1.4.5/website/source/docs/guides/consul-template.html.md (about) 1 --- 2 layout: "docs" 3 page_title: "Consul Template" 4 sidebar_current: "docs-guides-consul-template" 5 description: |- 6 Consul template provides a programmatic method for rendering configuration files from Consul data. 7 --- 8 9 # Consul Template 10 11 The Consul template tool provides a programmatic method 12 for rendering configuration files from a variety of locations, 13 including Consul KV. It is an ideal option for replacing complicated API 14 queries that often require custom formatting. 15 The template tool is based on Go templates and shares many 16 of the same attributes. 17 18 Consul template is a useful tool with several uses, we will focus on two 19 of it's use cases. 20 21 1. *Update configuration files*. The Consul template tool can be used 22 to update service configuration files. A common use case is managing load 23 balancer configuration files that need to be updated regularly in a dynamic 24 infrastructure on machines many not be able to directly connect to the Consul cluster. 25 26 1. *Discover data about the Consul cluster and service*. It is possible to collect 27 information about the services in your Consul cluster. For example, you could 28 collect a list of all services running on the cluster or you could discover all 29 service addresses for the Redis service. Note, this use case has limited 30 scope for production. 31 32 In this guide we will briefly discuss how `consul-template` works, 33 how to install it, and two use cases. 34 35 Before completing this guide, we assume some familiarity with 36 [Consul KV](https://learn.hashicorp.com/consul/getting-started/kv) 37 and [Go templates](https://golang.org/pkg/text/template/). 38 39 ## Introduction to Consul Template 40 41 Consul template is a simple, yet powerful tool. When initiated, it 42 reads one or more template files and queries Consul for all 43 data needed to render them. Typically, you run `consul-template` as a 44 daemon which will fetch the initial values and then continue to watch 45 for updates, re-rendering the template whenever there are relevant changes in 46 the cluster. You can alternatively use the `-once` flag to fetch and render 47 the template once which is useful for testing and 48 setup scripts that are triggered by some other automation for example a 49 provisioning tool. Finally, the template can also run arbitrary commands after the update 50 process completes. For example, it can send the HUP signal to the 51 load balancer service after a configuration change has been made. 52 53 The Consul template tool is flexible, it can fit into many 54 different environments and workflows. Depending on the use-case, you 55 may have a single `consul-template` instance on a handful of hosts 56 or may need to run several instances on every host. Each `consul-template` 57 process can manage multiple unrelated files though and will de-duplicate 58 the fetches as needed if those files share data dependencies so it can 59 reduce the load on Consul servers to share where possible. 60 61 ## Install Consul Template 62 63 For this guide, we are using a local Consul agent in development 64 mode which can be started with `consul agent -dev`. To quickly set 65 up a local Consul agent, refer to the getting started [guide](https://learn.hashicorp.com/consul/getting-started/install). The 66 Consul agent must be running to complete all of the following 67 steps. 68 69 The Consul template tool is not included with the Consul binary and will 70 need to be installed separately. It can be installed from a precompiled 71 binary or compiled from source. We will be installing the precompiled binary. 72 73 First, download the binary from the [Consul Template releases page](https://releases.hashicorp.com/consul-template/). 74 75 ```sh 76 curl -O https://releases.hashicorp.com/consul-template/0.19.5/consul-template<_version_OS>.tgz 77 ``` 78 79 Next, extract the binary and move it into your `$PATH`. 80 81 ```sh 82 tar -zxf consul-template<_version_OS>.tgz 83 ``` 84 85 To compile from source, please see the instructions in the 86 [contributing section in GitHub](https://github.com/hashicorp/consul-template#contributing). 87 88 ## Use Case: Consul KV 89 90 In this first use case example, we will render a template that pulls the HashiCorp address 91 from Consul KV. To do this we will create a simple template that contains the HashiCorp 92 address, run `consul-template`, add a value to Consul KV for HashiCorp's address, and 93 finally view the rendered file. 94 95 First, we will need to create a template file `find_address.tpl` to query 96 Consul's KV store: 97 98 ```liquid 99 {{ key "/hashicorp/street_address" }} 100 ``` 101 102 Next, we will run `consul-template` specifying both 103 the template to use and the file to update. 104 105 ```shell 106 $ consul-template -template "find_address.tpl:hashicorp_address.txt" 107 ``` 108 109 The `consul-template` process will continue to run until you kill it with `CRTL+c`. 110 For now, we will leave it running. 111 112 Finally, open a new terminal so we can write data to the key in Consul using the command 113 line interface. 114 115 ```shell 116 $ consul kv put hashicorp/street_address "101 2nd St" 117 118 Success! Data written to: hashicorp/street_address 119 ``` 120 121 We can ensure the data was written by viewing the `hashicorp_address.txt` 122 file which will be located in the same directory where `consul-template` 123 was run. 124 125 ```shell 126 $ cat hashicorp_address.txt 127 128 101 2nd St 129 ``` 130 131 If you update the key `hashicorp/street_address`, you can see the changes to the file 132 immediately. Go ahead and try `consul kv put hashicorp/street_address "22b Baker ST"`. 133 134 You can see that this simple process can have powerful implications. For example, it is 135 possible to use this same process for updating your [HAProxy load balancer 136 configuration](https://github.com/hashicorp/consul-template/blob/master/examples/haproxy.md). 137 138 You can now kill the `consul-template` process with `CTRL+c`. 139 140 ## Use Case: Discover All Services 141 142 In this use case example, we will discover all the services running in the Consul cluster. 143 To follow along, you use the local development agent from the previous example. 144 145 First, we will need to create a new template `all-services.tpl` to query all services. 146 147 ```liquid 148 {{range services}}# {{.Name}}{{range service .Name}} 149 {{.Address}}{{end}} 150 151 {{end}} 152 ``` 153 154 Next, run Consul template specifying the template we just created and the `-once` flag. 155 The `-once` flag will tell the process to run once and then quit. 156 157 ```shell 158 $ consul-template -template="all-services.tpl:all-services.txt" -once 159 ``` 160 161 If you complete this on your local development agent, you should 162 still see the `consul` service when viewing `all-services.txt`. 163 164 ```text 165 # consul 166 127.0.0.7 167 ``` 168 On a development or production cluster, you would see a list of all the services. 169 For example: 170 171 ```text 172 # consul 173 104.131.121.232 174 175 # redis 176 104.131.86.92 177 104.131.109.224 178 104.131.59.59 179 180 # web 181 104.131.86.92 182 104.131.109.224 183 104.131.59.59 184 ``` 185 186 ## Conclusion 187 188 In this guide we learned how to set up and use the Consul template tool. 189 To see additional examples, refer to the examples folder 190 in [GitHub](https://github.com/hashicorp/consul-template/tree/master/examples).