Created: May 8, 2019

Terraform + Hetzner

Belek Eraliev.

Belek Eraliev

ex DevOps Engineer

DevOps
Terraform + Hetzner

Let's talk about "Infrastructure as code." It has already become a standard. It will be used by default in a few years in the deploying process.

How "Infrastructure as code" works

"Infrastructure as code" means that the code works directly with the target system like cluster and server. The declarativity of the written code is another feature of the methodology.

Nowadays, the system administrator can describe the final state that is expected to be seen. Today there are many tools like Terraform, which organize declarativity.

What is Terraform?

Terraform is a tool for managing and configuring a cloud infrastructure. It works with services such as DigitalOcean, Heroku, AWS, and others. If you want to learn more about Terraform, you can read the official documentation.

In our case, we'll use Hetzner as a cloud provider. Here we can implement the "infrastructure as code" approach.

To try it yourself, you should install Terraform. You also should have access to cloud resources.

How to Implement Infrastructure as Code with Hetzner

The aim: to deploy an app to Hetzner using Terraform and keeping configuration in the repository. It allows easy upgrading of the entire infrastructure or any part of it.

Solution

At first, we will write the main configuration of the hosting API, the state’s storage instance configuration, and the user data description.

The data can change, so we will store it in the variables file:

variables.tf contains variables. It is not a secret data and can be stored in the repository.

terraform.tfvars also contains variables, but it is not recommended storing it in the repository. Such data must be kept carefully.

Scheme

Implementation

1. Create the repository to store configuration there

2. Create .gitignore file

3. It is necessary to get a token before start using API

You can view the github gist here or go to the full page version here

Open Hetzner Cloud Console, choose your project, go to Access > Tokens, and create a new token. You must copy the token because it will not be shown again. The token is linked to the project, and you need to create a new token within the project for linking it with API of another one.

4. Create a configuration file in JSON format

state.tf is the backend configuration file. Here we will store infrastructure state. We choose the S3 bucket because it is easy to use. Create bucket S3 and write access to the bucket in the file.

You can view the github gist here or go to the full page version here

main.tf is the file, where we define the main configurations

You can view the github gist here or go to the full page version here

variables.tf is the variables file

You can view the github gist here or go to the full page version here

instance.tf is the instance configuration file

You can view the github gist here or go to the full page version here

user-data/instance.tpl file is a bash script with helper tasks. In our case:

  1. Install Docker

  2. Install Docker-Compose

  3. Another stuff

You can view the github gist here or go to the full page version here

In addition

There is an example of terraform.tfvars file

You can view the github gist here or go to the full page version here

Start

Just run commands in the configuration folder.

You can view the github gist here or go to the full page version here

Conclusion

So, what we have:

  1. The working instance with the installed software.

  2. Configurations that are stored in the repository and will not be lost.

  3. "Infrastructure as code" approach is implemented.

  4. Reproducibility that allows configuring the new server easy and fast.