{"id":17487,"date":"2017-06-21T12:15:15","date_gmt":"2017-06-21T09:15:15","guid":{"rendered":"https:\/\/www.webcodegeeks.com\/?p=17487"},"modified":"2017-06-21T10:42:06","modified_gmt":"2017-06-21T07:42:06","slug":"hashicorp-tools-useful-continuous-integration","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/","title":{"rendered":"HashiCorp Tools Useful for Continuous Integration"},"content":{"rendered":"<p><a href=\"https:\/\/www.hashicorp.com\/\">HashiCorp<\/a> is a company that feels like it\u2019s always been around. Quietly plugging away just out of the limelight working on awesome products and every now and then releasing something groundbreaking that you wondered how you worked without it. I attended a couple of meetups recently that covered HashiCorp tools and felt the time was ripe I dug into all they have to offer a CI workflow.<\/p>\n<h2>Vagrant<\/h2>\n<p>Before my writing career, I was an implementer of and contributor to <a href=\"http:\/\/drupal.org\">Drupal<\/a>. In a world of complex stacks consisting of different web servers, language versions, database servers, and dependencies, I heard the phrase \u201cworks on my machine\u201d on a daily basis.<\/p>\n<p>We compromised for years with tools like <a href=\"https:\/\/www.mamp.info\/en\/\">MAMP<\/a>\/<a href=\"http:\/\/www.wampserver.com\/en\/\">WAMP<\/a> and build scripts, then along came <a href=\"https:\/\/www.vagrantup.com\">Vagrant<\/a> and changed the paradigm forever. Suddenly we could start preconfigured virtual machines during development that directly mimicked production machines and share them among teams.<\/p>\n<p>Other virtualization options have stolen Vagrant\u2019s crown, but it still has a place in people\u2019s hearts and workflows.<\/p>\n<h3>Installing<\/h3>\n<p>Install Vagrant from <a href=\"https:\/\/www.vagrantup.com\/downloads.html\">binaries<\/a>, or if you use Mac OS, <a href=\"http:\/\/sourabhbajaj.com\/mac-setup\/Vagrant\/README.html\">you can also use Homebrew cask<\/a>.<\/p>\n<h3>Basic usage<\/h3>\n<p>To use Vagrant, you first need <a href=\"https:\/\/www.virtualbox.org\/wiki\/VirtualBox\">VirtualBox<\/a> installed and then download a preexisting image (a \u201cbox\u201d) from HashiCorp\u2019s official library or from other third-party links you trust. By default, Vagrant will use VirtualBox to host your virtual machines, but you can use <a href=\"https:\/\/www.vagrantup.com\/intro\/getting-started\/providers.html\">other providers<\/a>.<\/p>\n<p>The first command initializes a box by copying a <em>Vagrantfile<\/em> to your local machine that contains configuration information for the virtual machine. The second uses the <em>Vagrantfile<\/em> in the current directory to start a machine running in the provider you specify.<\/p>\n<pre class=\"brush:php\">vagrant init ubuntu\/xenial64\r\nvagrant up --provider virtualbox<\/pre>\n<p>Next, SSH into the box with:<\/p>\n<pre class=\"brush:php\">vagrant ssh<\/pre>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/hc-vagrant-ssh.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-17489\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/hc-vagrant-ssh.png\" alt=\"\" width=\"696\" height=\"727\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/hc-vagrant-ssh.png 696w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/hc-vagrant-ssh-287x300.png 287w\" sizes=\"(max-width: 696px) 100vw, 696px\" \/><\/a><\/p>\n<h3>More information<\/h3>\n<p>Of course there\u2019s a lot more to Vagrant than creating virtual machines and SSHing into them. For example, there are features such as <a href=\"https:\/\/www.vagrantup.com\/intro\/getting-started\/synced_folders.html\">file synchronization between the host and virtual machine<\/a>, <a href=\"https:\/\/www.vagrantup.com\/intro\/getting-started\/networking.html\">accessing services running on the box from your local machine<\/a>, and <a href=\"https:\/\/www.vagrantup.com\/docs\/vagrantfile\/\">a wide variety of configuration options<\/a> you can set in the <em>Vagrantfile<\/em> to set box specifications, and more.<\/p>\n<p>Read <a href=\"https:\/\/www.vagrantup.com\/docs\/index.html\">the project documentation<\/a> for more details, or <a href=\"https:\/\/www.amazon.com\/gp\/product\/1449335837\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1449335837&amp;linkCode=as2&amp;tag=vagrant-20\">buy the official book<\/a> if you\u2019re into that sort of thing.<\/p>\n<h2>Packer<\/h2>\n<p>Packer is a part of HashiCorp\u2019s Infrastructure as Code toolset, allowing you to create and automate the creation of machine images.<\/p>\n<h3>Installing<\/h3>\n<p>Install Packer from <a href=\"https:\/\/www.packer.io\/downloads.html\">binaries<\/a>, or you can use Homebrew on Mac OS and Chocolatey on Windows.<\/p>\n<h3>Basic usage<\/h3>\n<p>As Packer is designed for portability, a Getting Started guide is challenging. However, for an example, I will create a Docker image\/container and Digital Ocean droplet for Ubuntu. Remember that the intention of Packer is to create a file that describes your requirements for any platform, so in theory one file contains the information needed for any platform.<\/p>\n<pre class=\"brush:php\">{\r\n  \"builders\": [{\r\n    \"type\": \"docker\",\r\n    \"image\": \"ubuntu:14.04\",\r\n    \"commit\": true\r\n  },\r\n  {\r\n    \"type\": \"digitalocean\",\r\n    \"api_token\": \"&lt;TOKEN&gt;\",\r\n    \"image\": \"ubuntu-14-04-x64\",\r\n    \"region\": \"nyc3\",\r\n    \"size\": \"512mb\",\r\n    \"ssh_username\": \"root\"\r\n  }\r\n]\r\n}<\/pre>\n<p>Run <code>packer validate<\/code> with the JSON file as a parameter to check if the file is valid, and then build with <code>packer build<\/code>:<\/p>\n<pre class=\"brush:php\">packer validate ubuntu.json\r\npacker build ubuntu.json<\/pre>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/packer-docker-image.png\"><img decoding=\"async\" class=\"aligncenter wp-image-17490\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/packer-docker-image.png\" alt=\"\" width=\"860\" height=\"541\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/packer-docker-image.png 2500w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/packer-docker-image-300x189.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/packer-docker-image-768x484.png 768w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/packer-docker-image-1024x645.png 1024w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/packer-do-snapshots.png\"><img decoding=\"async\" class=\"aligncenter wp-image-17491\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/packer-do-snapshots.png\" alt=\"\" width=\"860\" height=\"204\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/packer-do-snapshots.png 2020w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/packer-do-snapshots-300x71.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/packer-do-snapshots-768x182.png 768w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/packer-do-snapshots-1024x242.png 1024w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<h3>More information<\/h3>\n<p><a href=\"https:\/\/www.packer.io\/docs\/builders\/index.html\">Read more here<\/a> about the builders available in Packer. If you want to know more about the format of template files, then <a href=\"https:\/\/www.packer.io\/docs\/templates\/index.html\">read here<\/a>. <a href=\"https:\/\/www.packer.io\/docs\/provisioners\/index.html\">Read here<\/a> if you want to know how to integrate Packer with other components of your DevOps tool chain.<\/p>\n<h2>Terraform<\/h2>\n<p>As application infrastructure becomes more complex, the number of tools and options to manage it has also increased, and around this, the concept of \u201cinfrastructure as code.\u201d This principle allows those involved with DevOps to represent the desired configuration for an application stack in a series of text files and create entire infrastructure from those files.<\/p>\n<h3>Installing<\/h3>\n<p>Install Terraform from <a href=\"https:\/\/www.terraform.io\/downloads.html\">binaries<\/a>, or you can use Homebrew on Mac OS.<\/p>\n<h3>Basic usage<\/h3>\n<p>Create a new <em>.tf<\/em> file with the following that creates a provider and resource on Amazon Web Services:<\/p>\n<pre class=\"brush:php\">provider \"aws\" {\r\n  access_key = \"AKIAJSXZHNQKLBRRI2LQ\"\r\n  secret_key = \"696T3Ww\/GMXBcBpYwSHp\/6SfnAe0mEYOx3oHPflx\"\r\n  region     = \"us-east-1\"\r\n}\r\n\r\nresource \"aws_instance\" \"example\" {\r\n  ami           = \"ami-2757f631\"\r\n  instance_type = \"t2.micro\"\r\n}<\/pre>\n<p>To test what Terraform will create, run <code>terraform plan<\/code> and then <code>terraform apply<\/code> if you\u2019re happy with what you see. Authentication and setup steps for cloud hosts can vary wildly, but all being well you should now see the infrastructure you specified.<\/p>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/tf-aws-instance.png\"><img decoding=\"async\" class=\"aligncenter wp-image-17492\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/tf-aws-instance.png\" alt=\"\" width=\"860\" height=\"481\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/tf-aws-instance.png 1113w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/tf-aws-instance-300x168.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/tf-aws-instance-768x429.png 768w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/tf-aws-instance-1024x572.png 1024w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<p>If you change or add to the properties of your infrastructure, then rerunning <code>terraform plan<\/code> and <code>terraform apply<\/code> will cause Terraform to destroy a current instance and create another to match the new requirements.<\/p>\n<p>At the moment, you have a machine running an image but no software or applications on the image. If you combine Terraform with Packer, then you have your own images defined that handle this step for you. Otherwise, you use \u2018<a href=\"https:\/\/www.terraform.io\/docs\/provisioners\/index.html\">provisioners<\/a>\u2018 to perform local or remote commands, copy resources, and more. For example, to issue a simple (albeit useless) command, change the <em>.tf<\/em> file to:<\/p>\n<pre class=\"brush:php\">...\r\nresource \"aws_instance\" \"example\" {\r\n  ami           = \"ami-b374d5a5\"\r\n  instance_type = \"t2.micro\"\r\n\r\n  provisioner \"local-exec\" {\r\n    command = \"echo 'Hello World' &gt; greetings.txt\"\r\n  }\r\n}<\/pre>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/tf-aws-exec.png\"><img decoding=\"async\" class=\"aligncenter wp-image-17494\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/tf-aws-exec.png\" alt=\"\" width=\"860\" height=\"521\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/tf-aws-exec.png 1265w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/tf-aws-exec-300x182.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/tf-aws-exec-768x465.png 768w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/tf-aws-exec-1024x620.png 1024w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<p>But provisioning, as the name suggests, applies <strong>only<\/strong> when you create an instance. To add provisioning steps, first use <code>terraform destroy<\/code> and then <code>terraform apply<\/code>.<\/p>\n<h3>More information<\/h3>\n<p>Terraform is one of Hashicorp\u2019s most complex and potential-laden tools, so it requires careful planning and reading around what you need for your setup.<\/p>\n<p>You probably want to use variables instead of hard-coding all the values you need. Terraform handles <a href=\"https:\/\/www.terraform.io\/intro\/getting-started\/variables.html\">input<\/a> and <a href=\"https:\/\/www.terraform.io\/intro\/getting-started\/outputs.html\">output<\/a> variables, <a href=\"https:\/\/www.terraform.io\/intro\/getting-started\/modules.html\">modularity<\/a>, <a href=\"https:\/\/www.terraform.io\/intro\/getting-started\/remote.html\">remote backends<\/a>, and <a href=\"https:\/\/www.terraform.io\/docs\/index.html\">much, much more<\/a>.<\/p>\n<p>!Sign up for a free Codeship Account<\/p>\n<h2>Vault<\/h2>\n<p>In a similar vein to <a href=\"https:\/\/blog.codeship.com\/docker-secrets-management\/\">Docker Secrets<\/a>, <a href=\"https:\/\/www.vaultproject.io\/\">Vault<\/a> helps you keep sensitive information like keys, passwords, and tokens out of your production code and repositories, and instead accessible through an API.<\/p>\n<h3>Installing<\/h3>\n<p>Install Vault from <a href=\"https:\/\/www.vaultproject.io\/downloads.html\">binaries<\/a>, or you can use Homebrew on Mac OS.<\/p>\n<h3>Basic usage<\/h3>\n<p>Vault operates as a server\/client model, with one server and multiple clients connecting to that server via CLI tools or an API. First start the Vault server. For testing purposes, start it in \u2018dev\u2019 mode.<\/p>\n<pre class=\"brush:php\">vault server -dev<\/pre>\n<p>The output of this command will tell you to <code>export VAULT_ADDR<\/code> and note the values of <code>Unseal Key<\/code> and <code>Root Token<\/code>. Make sure you do in a new terminal and keep that new terminal open.<\/p>\n<p>Write your first secret with the following:<\/p>\n<pre class=\"brush:php\">vault write secret\/bestblog value=codeship<\/pre>\n<p>And read back with:<\/p>\n<pre class=\"brush:php\">vault read secret\/bestblog<\/pre>\n<p>Whilst Vault has a CLI tool to store and access secrets, in reality, you will use its HTTP API, or client libraries from within your application, for example, to reproduce the same commands as above with HTTP calls:<\/p>\n<pre class=\"brush:php\">curl \\\r\n  -H \"X-Vault-Token: &lt;TOKEN&gt;\" \\\r\n  -H \"Content-Type: application\/json\" \\\r\n  -X POST \\\r\n  -d '{\"value\":\"codeship\"}' \\\r\n  http:\/\/127.0.0.1:8200\/v1\/secret\/bestblog<\/pre>\n<pre class=\"brush:php\">curl \\\r\n  -H \"X-Vault-Token: &lt;TOKEN&gt;\" \\\r\n  -X GET \\\r\n  http:\/\/127.0.0.1:8200\/v1\/secret\/bestblog<\/pre>\n<p>Or using the <a href=\"https:\/\/github.com\/hashicorp\/vault-ruby\">Ruby library<\/a>:<\/p>\n<pre class=\"brush:php\">Vault.with_retries(Vault::HTTPConnectionError) do\r\n  Vault.logical.write(\"secret\/bestblog\")\r\nend<\/pre>\n<pre class=\"brush:php\">Vault.with_retries(Vault::HTTPConnectionError) do\r\n  Vault.logical.read(\"secret\/bestblog\")\r\nend<\/pre>\n<h3>More information<\/h3>\n<p>Vault offers more features such as adding <a href=\"https:\/\/www.vaultproject.io\/docs\/secrets\/index.html\">Secrets backends<\/a> (local and hosted), <a href=\"https:\/\/www.vaultproject.io\/intro\/getting-started\/dynamic-secrets.html\">dynamic secrets<\/a> (non-human generated), <a href=\"https:\/\/www.vaultproject.io\/docs\/concepts\/lease.html\">rotating (changing) secrets<\/a>, and more.<\/p>\n<h2>Consul<\/h2>\n<p>Consul helps you tie together a lot of the services present in a microservice and container-based infrastructure by providing a service they can all communicate through to discover each other.<\/p>\n<p>For example, many distributed systems rely on the ability to find other instances throughout the cluster. With many cloud hosting providers (especially if you have a mixed cloud infrastructure), this can be a challenge. Consul will help you provide a medium for this setup to work. You can also use Consul as a backend for other HashiCorp tools.<\/p>\n<h3>Installing<\/h3>\n<p>Install Consul from <a href=\"https:\/\/www.consul.io\/downloads.html\">binaries<\/a>, or you can use Homebrew on Mac OS.<\/p>\n<h3>Basic usage<\/h3>\n<p>Consul runs in either server or client mode. To prevent data loss, you are <strong>strongly<\/strong> encouraged to have more than one server running in a production environment. All other instances will run as clients, reporting to serve instances.<\/p>\n<p>A Consul cluster registers and allows you to manage services. You then query these services with the DNS or HTTP API to ascertain their status. You create services by creating a service definition file (in JSON) or by using the HTTP API.<\/p>\n<p>A service file looks like the following (the service name will be the file name, for example, <em>server.json<\/em>):<\/p>\n<pre class=\"brush:php\">{\r\n  \"service\":\r\n  {\r\n    \"name\": \"server\",\r\n    \"tags\": [\"node\"],\r\n    \"port\": 3000\r\n  }\r\n}<\/pre>\n<p>The easiest way to experiment and understand Consul is to run it in development mode. The mode won\u2019t persist state, but will allow you to create a cluster on your local machine.<\/p>\n<p>Start the server, setting the configuration directory. As you change the contents of this folder, the consul cluster will reflect changes automatically:<\/p>\n<pre class=\"brush:php\">onsul agent -dev -config-dir=\/etc\/consul.d<\/pre>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/consul-agent.png\"><img decoding=\"async\" class=\"aligncenter wp-image-17495\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/consul-agent.png\" alt=\"\" width=\"860\" height=\"556\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/consul-agent.png 2500w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/consul-agent-300x194.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/consul-agent-768x496.png 768w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/consul-agent-1024x662.png 1024w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<p>Then to query a service, use the following endpoint with the name as a parameter:<\/p>\n<pre class=\"brush:php\">curl http:\/\/localhost:8500\/v1\/catalog\/service\/server<\/pre>\n<p>Or with the DNS API:<\/p>\n<pre class=\"brush:php\">dig @127.0.0.1 -p 8600 server.service.consul<\/pre>\n<p>Both of which will tell you details of the nodes running the service and basic details of it.<\/p>\n<h3>More information<\/h3>\n<p>If you want to try emulating a cluster for experimenting with Consul, <a href=\"https:\/\/www.consul.io\/intro\/getting-started\/join.html\">try the Vagrant image for a cluster<\/a>.<\/p>\n<p>Consul has a basic but helpful web UI that you can start with the <code>-ui<\/code> parameter.<\/p>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/consul-ui.png\"><img decoding=\"async\" class=\"aligncenter wp-image-17496\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/consul-ui.png\" alt=\"\" width=\"860\" height=\"330\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/consul-ui.png 2387w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/consul-ui-300x115.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/consul-ui-768x295.png 768w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/consul-ui-1024x393.png 1024w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<p>Consul is designed to allow you to create nodes. They will automatically define which role they will take on as the state of the cluster changes. If you want to manually define a node role or configure other parameters, <a href=\"https:\/\/www.consul.io\/docs\/agent\/options.html\">dive into the agent options<\/a>.<\/p>\n<p>Want to know even more about configuring Consul? Then read through <a href=\"https:\/\/www.consul.io\/docs\/guides\/index.html\">the guides section<\/a> of the Consul documentation to learn about topics such as ACL, DNS, and cross data center federation.<\/p>\n<h2>Nomad<\/h2>\n<p>The final piece of the HashiCorp puzzle is Nomad. It helps you schedule virtual machines (containers, VMs, and application runtimes) across multiple cloud providers and operating systems. A scheduler lets you work in application-level abstract, defining what sort of infrastructure your application needs and letting the scheduler handle deployment, upgrades, and machine failures.<\/p>\n<h3>Installing<\/h3>\n<p>Nomad runs as an agent on each machine that is part of the cluster, and through it, you schedule the machines you want to run. Nomad is cross-platform but has the best driver support on Linux hosts. Install Nomad from <a href=\"https:\/\/www.nomadproject.io\/downloads.html\">binaries<\/a>, or you can use Homebrew on Mac OS.<\/p>\n<h3>Basic usage<\/h3>\n<p>As with other tools in this article, there is a <code>-dev<\/code> mode that is ideal for starting a local test instance:<\/p>\n<pre class=\"brush:php\">nomad agent -dev<\/pre>\n<p>Next create an empty \u2018job\u2019 file in <a href=\"https:\/\/github.com\/hashicorp\/hcl\">hcl<\/a> format with:<\/p>\n<pre class=\"brush:php\">noamd init<\/pre>\n<p>The file defines a lot of default configuration in a format common to many other Hashicorp tools. Read through the file to get an idea of what\u2019s possible, but in summary, it creates a Redis service running in a Docker container in the default \u2018global\u2019 region and defines machine specifications. Start the job with:<\/p>\n<pre class=\"brush:php\">nomad run example.nomad<\/pre>\n<p>And inspect with:<\/p>\n<pre class=\"brush:php\">nomad status example<\/pre>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/nomad-run.png\"><img decoding=\"async\" class=\"aligncenter wp-image-17497\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/nomad-run.png\" alt=\"\" width=\"860\" height=\"556\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/nomad-run.png 2500w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/nomad-run-300x194.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/nomad-run-768x496.png 768w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/06\/nomad-run-1024x662.png 1024w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<p>As your requirements change, edit the configuration file and run the <code>nomad plan<\/code> command to see what the effect of the change will be before running the change for real.<\/p>\n<h3>More information<\/h3>\n<p><a href=\"https:\/\/www.nomadproject.io\/docs\/drivers\/index.html\">Find our more<\/a> about the useful drivers that Nomad supports for a variety of container frameworks and virtual machines. Curious to know what other commands are available? <a href=\"https:\/\/www.nomadproject.io\/docs\/commands\/index.html\">Then read more here<\/a>.<\/p>\n<p>Finally, <a href=\"https:\/\/www.nomadproject.io\/docs\/job-specification\/index.html\">read this document<\/a> to learn more about the configuration options available for jobs.<\/p>\n<h2>Tying It All Together<\/h2>\n<p>Individual HashiCorp tools are usable in isolation from each other, but several of them chain together exceptionally well to provide a platform and provider agnostic DevOps toolchain. The company rarely pushes you into paying for anything. With a handful of enterprise level offerings for Nomad, Vault, Terraform, and Consul, I guess that makes them enough income to sustain the development of the other tools.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"https:\/\/blog.codeship.com\/hashicorp-tools-useful-in-ci\/\">HashiCorp Tools Useful for Continuous Integration<\/a> from our <a href=\"http:\/\/www.webcodegeeks.com\/join-us\/wcg\/\">WCG partner<\/a>\u00a0Chris Ward at the <a href=\"http:\/\/blog.codeship.com\/\">Codeship Blog<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>HashiCorp is a company that feels like it\u2019s always been around. Quietly plugging away just out of the limelight working on awesome products and every now and then releasing something groundbreaking that you wondered how you worked without it. I attended a couple of meetups recently that covered HashiCorp tools and felt the time was &hellip;<\/p>\n","protected":false},"author":148,"featured_media":927,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[369],"class_list":["post-17487","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-web-development","tag-continuous-integration"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>HashiCorp Tools Useful for Continuous Integration - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"HashiCorp is a company that feels like it\u2019s always been around. Quietly plugging away just out of the limelight working on awesome products and every now\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"HashiCorp Tools Useful for Continuous Integration - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"HashiCorp is a company that feels like it\u2019s always been around. Quietly plugging away just out of the limelight working on awesome products and every now\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2017-06-21T09:15:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Chris Ward\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Chris Ward\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/\"},\"author\":{\"name\":\"Chris Ward\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/ec768d779e3ecb955c5f552f0f734757\"},\"headline\":\"HashiCorp Tools Useful for Continuous Integration\",\"datePublished\":\"2017-06-21T09:15:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/\"},\"wordCount\":1793,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg\",\"keywords\":[\"Continuous Integration\"],\"articleSection\":[\"Web Dev\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/\",\"name\":\"HashiCorp Tools Useful for Continuous Integration - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg\",\"datePublished\":\"2017-06-21T09:15:15+00:00\",\"description\":\"HashiCorp is a company that feels like it\u2019s always been around. Quietly plugging away just out of the limelight working on awesome products and every now\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Web Dev\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/web-development\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"HashiCorp Tools Useful for Continuous Integration\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/ec768d779e3ecb955c5f552f0f734757\",\"name\":\"Chris Ward\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e715e4a95de958fcd3da75cde89b6459b80f977d665284e37751ecdcb2b1e4c4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e715e4a95de958fcd3da75cde89b6459b80f977d665284e37751ecdcb2b1e4c4?s=96&d=mm&r=g\",\"caption\":\"Chris Ward\"},\"description\":\"Chris Ward is a technical writer, speaker, and developer.\",\"url\":\"https:\/\/www.webcodegeeks.com\/author\/chris-ward\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"HashiCorp Tools Useful for Continuous Integration - Web Code Geeks - 2026","description":"HashiCorp is a company that feels like it\u2019s always been around. Quietly plugging away just out of the limelight working on awesome products and every now","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/","og_locale":"en_US","og_type":"article","og_title":"HashiCorp Tools Useful for Continuous Integration - Web Code Geeks - 2026","og_description":"HashiCorp is a company that feels like it\u2019s always been around. Quietly plugging away just out of the limelight working on awesome products and every now","og_url":"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_published_time":"2017-06-21T09:15:15+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg","type":"image\/jpeg"}],"author":"Chris Ward","twitter_card":"summary_large_image","twitter_creator":"@webcodegeeks","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Chris Ward","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/"},"author":{"name":"Chris Ward","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/ec768d779e3ecb955c5f552f0f734757"},"headline":"HashiCorp Tools Useful for Continuous Integration","datePublished":"2017-06-21T09:15:15+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/"},"wordCount":1793,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg","keywords":["Continuous Integration"],"articleSection":["Web Dev"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/","url":"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/","name":"HashiCorp Tools Useful for Continuous Integration - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg","datePublished":"2017-06-21T09:15:15+00:00","description":"HashiCorp is a company that feels like it\u2019s always been around. Quietly plugging away just out of the limelight working on awesome products and every now","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/web-development\/hashicorp-tools-useful-continuous-integration\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Web Dev","item":"https:\/\/www.webcodegeeks.com\/category\/web-development\/"},{"@type":"ListItem","position":3,"name":"HashiCorp Tools Useful for Continuous Integration"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/ec768d779e3ecb955c5f552f0f734757","name":"Chris Ward","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e715e4a95de958fcd3da75cde89b6459b80f977d665284e37751ecdcb2b1e4c4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e715e4a95de958fcd3da75cde89b6459b80f977d665284e37751ecdcb2b1e4c4?s=96&d=mm&r=g","caption":"Chris Ward"},"description":"Chris Ward is a technical writer, speaker, and developer.","url":"https:\/\/www.webcodegeeks.com\/author\/chris-ward\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/17487","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/148"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=17487"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/17487\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/927"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=17487"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=17487"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=17487"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}