2020-07-16 19:58:15 +00:00
# Provision a Nomad cluster on GCP
2020-07-16 20:38:18 +00:00
[![Open in Cloud Shell ](https://gstatic.com/cloudssh/images/open-btn.svg )](https://ssh.cloud.google.com/cloudshell/editor?shellonly=true& cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fhashicorp%2Fnomad& cloudshell_working_dir=terraform%2Fgcp& cloudshell_tutorial=README.md)
2020-07-16 19:58:15 +00:00
To get started, you will need a GCP [account ](https://cloud.google.com/free ).
## Welcome
This tutorial will teach you how to deploy [Nomad ](https://www.nomadproject.io/ ) clusters to the Google Cloud Platform using [Packer ](https://www.packer.io/ ) and [Terraform ](https://www.terraform.io/ ).
Includes:
* Installing HashiCorp Tools (Nomad, Consul, Vault, Terraform, and Packer).
* Installing the GCP SDK CLI Tools, if you're not using Cloud Shell.
* Creating a new GCP project, along with a Terraform Service Account.
* Building a golden image using Packer.
2020-07-16 20:14:42 +00:00
* Deploying a cluster with Terraform.
2020-07-16 19:58:15 +00:00
## Install HashiCorp Tools
### Nomad
Download the latest version of [Nomad ](https://www.nomadproject.io/ ) from HashiCorp's website by copying and pasting this snippet in the terminal:
```console
2020-09-09 22:22:37 +00:00
curl "https://releases.hashicorp.com/nomad/0.12.4/nomad_0.12.4_linux_amd64.zip" -o nomad.zip
2020-07-16 19:58:15 +00:00
unzip nomad.zip
sudo mv nomad /usr/local/bin
nomad --version
```
### Consul
Download the latest version of [Consul ](https://www.consul.io/ ) from HashiCorp's website by copying and pasting this snippet in the terminal:
```console
2020-09-02 17:14:47 +00:00
curl "https://releases.hashicorp.com/consul/1.8.3/consul_1.8.3_linux_amd64.zip" -o consul.zip
2020-07-16 19:58:15 +00:00
unzip consul.zip
sudo mv consul /usr/local/bin
consul --version
```
### Vault
Download the latest version of [Vault ](https://www.vaultproject.io/ ) from HashiCorp's website by copying and pasting this snippet in the terminal:
```console
2020-09-02 17:14:47 +00:00
curl "https://releases.hashicorp.com/vault/1.5.3/vault_1.5.3_linux_amd64.zip" -o vault.zip
2020-07-16 19:58:15 +00:00
unzip vault.zip
sudo mv vault /usr/local/bin
vault --version
```
### Packer
Download the latest version of [Packer ](https://www.packer.io/ ) from HashiCorp's website by copying and pasting this snippet in the terminal:
```console
2020-09-02 17:14:47 +00:00
curl "https://releases.hashicorp.com/packer/1.6.2/packer_1.6.2_linux_amd64.zip" -o packer.zip
2020-07-16 19:58:15 +00:00
unzip packer.zip
sudo mv packer /usr/local/bin
packer --version
```
### Terraform
Download the latest version of [Terraform ](https://www.terraform.io/ ) from HashiCorp's website by copying and pasting this snippet in the terminal:
```console
2020-09-02 17:14:47 +00:00
curl "https://releases.hashicorp.com/terraform/0.13.1/terraform_0.13.1_linux_amd64.zip" -o terraform.zip
2020-07-16 19:58:15 +00:00
unzip terraform.zip
sudo mv terraform /usr/local/bin
terraform --version
```
2020-07-24 14:10:01 +00:00
### Install and Authenticate the GCP SDK Command Line Tools
2020-07-16 19:58:15 +00:00
2020-09-02 17:14:47 +00:00
**If you are using [Google Cloud ](https://cloud.google.com/shell ), you already have `gcloud` set up, and you can safely skip this step.**
2020-07-16 19:58:15 +00:00
2021-03-08 13:50:13 +00:00
To install the GCP SDK Command Line Tools, follow the installation instructions for your specific operating system:
2020-07-16 19:58:15 +00:00
* [Linux ](https://cloud.google.com/sdk/docs/downloads-interactive#linux )
* [MacOS ](https://cloud.google.com/sdk/docs/downloads-interactive#mac )
* [Windows ](https://cloud.google.com/sdk/docs/downloads-interactive#windows )
2020-07-24 14:10:01 +00:00
After installation, authenticate `gcloud` with the following command:
2020-07-16 19:58:15 +00:00
```console
2020-07-24 14:10:01 +00:00
gcloud auth login
2020-07-16 19:58:15 +00:00
```
## Create a New Project
2020-07-17 12:53:15 +00:00
Generate a project ID with the following command:
2020-07-16 19:58:15 +00:00
```console
2020-07-17 12:53:15 +00:00
export GOOGLE_PROJECT="nomad-gcp-$(cat /dev/random | head -c 5 | xxd -p)"
2020-07-16 19:58:15 +00:00
```
2020-07-17 12:53:15 +00:00
Using that project ID, create a new GCP [project ](https://cloud.google.com/docs/overview#projects ):
2020-07-16 19:58:15 +00:00
```console
2020-07-17 12:53:15 +00:00
gcloud projects create $GOOGLE_PROJECT
2020-07-16 19:58:15 +00:00
```
And then set your `gcloud` config to use that project:
```console
gcloud config set project $GOOGLE_PROJECT
```
### Link Billing Account to Project
Next, let's link a billing account to that project. To determine what billing accounts are available, run the following command:
```console
gcloud alpha billing accounts list
```
2020-07-17 12:53:52 +00:00
Locate the `ACCOUNT_ID` for the billing account you want to use, and set the `GOOGLE_BILLING_ACCOUNT` environment variable. Replace the `XXXXXXX` with the `ACCOUNT_ID` you located with the previous command output:
2020-07-16 19:58:15 +00:00
```console
export GOOGLE_BILLING_ACCOUNT="XXXXXXX"
```
So we can link the `GOOGLE_BILLING_ACCOUNT` with the previously created `GOOGLE_PROJECT` :
```console
gcloud alpha billing projects link "$GOOGLE_PROJECT" --billing-account "$GOOGLE_BILLING_ACCOUNT"
```
### Enable Compute API
In order to deploy VMs to the project, we need to enable the compute API:
```console
gcloud services enable compute.googleapis.com
```
### Create Terraform Service Account
Finally, let's create a Terraform Service Account user and its `account.json` credentials file:
```console
gcloud iam service-accounts create terraform \
--display-name "Terraform Service Account" \
--description "Service account to use with Terraform"
```
```console
gcloud projects add-iam-policy-binding "$GOOGLE_PROJECT" \
--member serviceAccount:"terraform@$GOOGLE_PROJECT.iam.gserviceaccount.com" \
--role roles/editor
```
```console
gcloud iam service-accounts keys create account.json \
--iam-account "terraform@$GOOGLE_PROJECT.iam.gserviceaccount.com"
```
> ⚠️ **Warning**
>
2020-07-17 19:06:39 +00:00
> The `account.json` credentials gives privileged access to this GCP project. Be careful to avoid leaking these credentials by accidentally committing them to version control systems such as `git`, or storing them where they are visible to others. In general, storing these credentials on an individually operated, private computer (like your laptop) or in your own GCP cloud shell is acceptable for testing purposes. For production use, or for teams, use a secrets management system like HashiCorp [Vault](https://www.vaultproject.io/). For this tutorial's purposes, we'll be storing the `account.json` credentials on disk in the cloud shell.
2020-07-16 19:58:15 +00:00
Now set the *full path* of the newly created `account.json` file as `GOOGLE_APPLICATION_CREDENTIALS` environment variable.
```console
export GOOGLE_APPLICATION_CREDENTIALS=$(realpath account.json)
```
### Ensure Required Environment Variables Are Set
Before moving onto the next steps, ensure the following environment variables are set:
2020-07-17 12:55:07 +00:00
* `GOOGLE_PROJECT` with your selected GCP project ID.
2020-07-17 02:49:31 +00:00
* `GOOGLE_APPLICATION_CREDENTIALS` with the *full path* to the Terraform Service Account `account.json` credentials file created in the last step.
2020-07-16 19:58:15 +00:00
2020-07-16 20:14:42 +00:00
## Build HashiStack Golden Image with Packer
2020-07-16 19:58:15 +00:00
2021-03-08 13:50:13 +00:00
[Packer ](https://www.packer.io/intro/index.html ) is HashiCorp's open source tool for creating identical machine images for multiple platforms from a single source configuration. The machine image created here can be customized through modifications to the [build configuration file ](https://github.com/hashicorp/nomad/blob/main/terraform/gcp/packer.json ) and the [shell script ](https://github.com/hashicorp/nomad/blob/main/terraform/shared/scripts/setup.sh ).
2020-07-16 19:58:15 +00:00
Use the following command to build the machine image:
```console
2020-07-16 20:17:17 +00:00
packer build packer.json
2020-07-16 19:58:15 +00:00
```
## Provision a cluster with Terraform
Change into the `env/us-east` environment directory:
```console
2020-07-16 20:17:17 +00:00
cd env/us-east
2020-07-16 19:58:15 +00:00
```
Initialize Terraform:
```console
2020-07-16 20:17:17 +00:00
terraform init
2020-07-16 19:58:15 +00:00
```
2020-07-16 20:24:16 +00:00
Plan infrastructure changes with Terraform:
2020-07-16 19:58:15 +00:00
```console
2021-03-08 13:50:13 +00:00
terraform plan -var="project=${GOOGLE_PROJECT}" -var="credentials=${GOOGLE_APPLICATION_CREDENTIALS}"
2020-07-16 19:58:15 +00:00
```
2020-07-16 20:24:16 +00:00
Apply infrastructure changes with Terraform:
2020-07-16 19:58:15 +00:00
```console
2021-03-08 13:50:13 +00:00
terraform apply -auto-approve -var="project=${GOOGLE_PROJECT}" -var="credentials=${GOOGLE_APPLICATION_CREDENTIALS}"
2020-07-16 19:58:15 +00:00
```
## Access the Cluster
2020-07-17 18:26:32 +00:00
To access the Nomad, Consul, or Vault web UI inside the cluster, create an [SSH tunnel ](https://cloud.google.com/community/tutorials/ssh-tunnel-on-gce ) using `gcloud` . To open up tunnels to *all* of the UIs available in the cluster, run these commands which will start each SSH tunnel as a background process in your current shell:
2020-07-16 19:58:15 +00:00
```console
2020-07-17 18:26:32 +00:00
gcloud compute ssh hashistack-server-0 --zone=us-east1-c --tunnel-through-iap -- -f -N -L 127.0.0.1:4646:127.0.0.1:4646
gcloud compute ssh hashistack-server-0 --zone=us-east1-c --tunnel-through-iap -- -f -N -L 127.0.0.1:8200:127.0.0.1:8200
gcloud compute ssh hashistack-server-0 --zone=us-east1-c --tunnel-through-iap -- -f -N -L 127.0.0.1:8500:127.0.0.1:8500
2020-07-16 19:58:15 +00:00
```
2020-07-17 18:26:32 +00:00
After running those commands, you can now click any of the following links to open up a Web Preview using Cloud Shell:
2020-07-16 19:58:15 +00:00
2020-07-17 18:26:32 +00:00
* [Nomad ](https://ssh.cloud.google.com/devshell/proxy?authuser=0&port=4646&environment_id=default )
* [Vault ](https://ssh.cloud.google.com/devshell/proxy?authuser=0&port=8200&environment_id=default )
* [Consul ](https://ssh.cloud.google.com/devshell/proxy?authuser=0&port=8500&environment_id=default )
2020-07-16 19:58:15 +00:00
2020-07-17 18:26:32 +00:00
If you're **not** using Cloud Shell, you can use any of these links:
2020-07-16 19:58:15 +00:00
2020-07-17 18:26:32 +00:00
* [Nomad ](http://127.0.0.1:4646 )
* [Vault ](http://127.0.0.1:8200 )
* [Consul ](http://127.0.0.1:8500 )
2020-07-16 19:58:15 +00:00
2021-03-08 13:50:13 +00:00
In case you want to try out any of the optional steps with the Vault CLI later on, set this helper variable:
2020-09-02 17:14:47 +00:00
```
export VAULT_ADDR=http://localhost:8200
```
2020-07-17 19:05:22 +00:00
2020-07-16 19:58:15 +00:00
## Next Steps
2020-09-02 17:14:47 +00:00
You have deployed a Nomad cluster to GCP! 🎉
2021-03-08 13:50:13 +00:00
Click [here ](https://github.com/hashicorp/nomad/blob/main/terraform/README.md#test ) for next steps.
2020-07-16 20:34:32 +00:00
2020-09-02 17:14:47 +00:00
> ### After You Finish
2021-03-08 13:50:13 +00:00
> Come back here when you're done exploring Nomad and the HashiCorp stack. In the next section, you'll learn how to clean up, and will destroy the demo infrastructure you've created.
2020-09-02 17:14:47 +00:00
2020-07-16 20:34:32 +00:00
## Conclusion
2021-03-08 13:50:13 +00:00
You have deployed a Nomad cluster to GCP!
2020-07-16 20:34:32 +00:00
2020-09-02 17:14:47 +00:00
### Destroy Infrastructure
2020-07-16 20:34:32 +00:00
2021-03-08 13:50:13 +00:00
To destroy all the demo infrastructure:
2020-07-16 20:34:32 +00:00
```console
2021-03-08 13:50:13 +00:00
terraform destroy -force -var="project=${GOOGLE_PROJECT}" -var="credentials=${GOOGLE_APPLICATION_CREDENTIALS}"
2020-07-17 02:34:43 +00:00
```
2020-09-02 17:14:47 +00:00
### Delete the Project
2021-03-08 13:50:13 +00:00
Finally, to completely delete the project:
2020-09-02 17:14:47 +00:00
gcloud projects delete $GOOGLE_PROJECT
> ### Alternative: Use the GUI
2021-03-08 13:50:13 +00:00
>
2020-09-02 17:14:47 +00:00
> If you prefer to delete the project using GCP's Cloud Console, follow this link to GCP's [Cloud Resource Manager](https://console.cloud.google.com/cloud-resource-manager).