From 990dd485934d614970f34b999d2d5f9607fe7d04 Mon Sep 17 00:00:00 2001 From: cwlinode Date: Wed, 17 Oct 2018 15:07:29 -0400 Subject: [PATCH 1/6] Update Terraform for Linode provider. --- .../index.md | 525 +++++++++--------- 1 file changed, 261 insertions(+), 264 deletions(-) diff --git a/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md b/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md index ee60cdd8b83..c05d00ac5ea 100644 --- a/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md +++ b/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md @@ -4,10 +4,10 @@ author: email: docs@linode.com description: 'Use Terraform to deploy Linodes containing pre-configured application environments such as Docker or from a manual configuration.' og_description: 'Use Terraform to deploy Linodes containing pre-configured application environments such as Docker or from a manual configuration.' -keywords: ["Linode", "terraform", "plugin", "infrastructure", "IaC", "Infrastructure as Code"] +keywords: ["terraform", "infrastructure", "IaC"] license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' published: 2017-11-06 -modified: 2018-03-13 +modified: 2018-10-18 aliases: ['platform/how-to-build-your-infrastructure-using-terraform-and-linode/'] modified_by: name: Linode @@ -18,7 +18,16 @@ contributor: Infrastructure as code (IaC) is software that gives developers the ability to build, manage, and provision computing environments with a high-level [configuration syntax](https://www.terraform.io/docs/configuration/syntax.html). Some benefits include the ability to enforce DevOps best practices, process automation, and the opportunity to use version control systems for greater visibility and collaboration within a team. -[Terraform](https://www.terraform.io) stands out from other IaC solutions because it's an orchestration tool, which means it's designed specifically for bare-metal server and virtual machines. The commands in this guide should be run from a client machine running Ubuntu 16.04. +[Terraform](https://www.terraform.io) stands out from other IaC solutions because it's an orchestration tool, meaning it's designed specifically for bare-metal server and virtual machines. + +Terraform offers many ways to set up and provision your Linode using: + +* Custom scripts, which can be included in a configuration file itself or called from a local or remote file. +* Specialized software tools integrated with Terraform like Chef or Puppet. +* Container-based solutions like Docker or Kubernetes. +* Terraform plugin-based solutions. + +There are also plenty of [provisioners](https://www.terraform.io/docs/provisioners/index.html), [providers](https://github.com/terraform-providers), and even [modules](https://registry.terraform.io) available, one of which is the official [Linode-maintained provider](https://github.com/terraform-providers/terraform-provider-linode/). {{< caution >}} The configurations and commands used in this guide will result in multiple Linodes being added to your account. Be sure to monitor your account closely in the Linode Manager to avoid unwanted charges. @@ -28,171 +37,176 @@ The configurations and commands used in this guide will result in multiple Linod - You will need root access to the system and a standard user account with sudo privileges. -- Create an API key for your Linode account. Be sure to take a screen capture of the API key when it's displayed, it will only appear once. See our guide [Getting Started with the Linode API](/docs/platform/api/getting-started-with-the-linode-api/#get-an-access-token) if you need help. +- Create an API token for your Linode account. It will only appear once on the screen, so be sure to take a screen capture of the token while it's displayed. See our guide [Getting Started with the Linode API](/docs/platform/api/getting-started-with-the-linode-api/#get-an-access-token) if you need help. -- You will need [Git](https://git-scm.com/) installed on your system. +## Install Terraform -## Configure Client Machine + 1. Make a Terraform project directory to work from and `cd` into it: -### Install Terraform + mkdir terraform + cd terraform - 1. Download the following from [Terraform's website](https://www.terraform.io/downloads.html): + 1. Download the following files from [Terraform's website](https://www.terraform.io/downloads.html): - The 64-bit Linux `.zip` archive. - The SHA256 checksums file. - The checksum signature file. -2. Import the HashiCorp Security [GPG key](https://www.hashicorp.com/security.html): - gpg --keyserver keyserver.ubuntu.com --recv 348FFC4C +### Verify Download + +1. Import the HashiCorp Security [GPG key](https://www.hashicorp.com/security.html): + + gpg --recv-keys *keyID* The output should show that the key was imported: {{< output >}} - gpg: requesting key 348FFC4C from hkp server keyserver.ubuntu.com - gpg: /root/.gnupg/trustdb.gpg: trustdb created - gpg: key 348FFC4C: public key "HashiCorp Security " imported - gpg: no ultimately trusted keys found - gpg: Total number processed: 1 - gpg: imported: 1 (RSA: 1) - {{}} +root@localhost:~# gpg --recv-keys 51852D87348FFC4C +gpg: /root/.gnupg/trustdb.gpg: trustdb created +gpg: key 51852D87348FFC4C: public key "HashiCorp Security " imported +gpg: no ultimately trusted keys found +gpg: Total number processed: 1 +gpg: imported: 1 +{{}} + + {{< note >}} +If you recieve an error to the effect of `No dirmngrnupg/S.dirmngr'`, install the package `dirmngr` and run the GPG command again. +{{< /note >}} -3. Verify the checksum file's GPG signature: +1. Verify the checksum file's GPG signature: gpg --verify terraform*.sig terraform*SHA256SUMS The output should say the signature is good: + {{< output >}} - gpg: Signature made Wed 31 Jan 2018 08:53:21 PM UTC using RSA key ID 348FFC4C - gpg: Good signature from "HashiCorp Security " - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 91A6 E7F8 5D05 C656 30BE F189 5185 2D87 348F FC4C +root@localhost:~# gpg --verify terraform*.sig terraform*SHA256SUMS +gpg: Signature made Wed 15 Aug 2018 10:07:05 PM UTC +gpg: using RSA key 51852D87348FFC4C +gpg: Good signature from "HashiCorp Security " [unknown] +gpg: WARNING: This key is not certified with a trusted signature! +gpg: There is no indication that the signature belongs to the owner. +Primary key fingerprint: 91A6 E7F8 5D05 C656 30BE F189 5185 2D87 348F FC4C {{}} -4. Verify that the fingerprint matches what's on [HashiCorp's security page](https://www.hashicorp.com/security.html). +1. Verify that the fingerprint matches what's on [HashiCorp's security page](https://www.hashicorp.com/security.html). -5. Verify the `.zip` archive's checksum: +1. Verify the `.zip` archive's checksum: sha256sum -c terraform*SHA256SUMS 2>&1 | grep OK The output should show the file's name as given in the `terraform*SHA256SUMS` file: - terraform_0.11.3_linux_amd64.zip: OK - -### Install Golang - -1. Download and extract Go from the project's [downloads page](https://golang.org/dl/). Terraform requires version 1.9: - - wget -c https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz - sudo tar -C /usr/local -xzf go*.linux-amd64.tar.gz + {{< output >}} +terraform_0.11.8_linux_amd64.zip: OK +{{< /output >}} -2. Create separate directories for project executables and source code: +### Configure Terraform Environment - mkdir -p ~/go_projects/{bin,src,pkg} +1. Unzip `terraform_*_linux_amd64.zip` to your desired working directory: -3. Add Go-specific `PATH` locations to your user's environment. Add these lines to the bottom of your user's `~/.profile` file: + unzip terraform_*_linux_amd64.zip - {{< file "~/.profile" aconf >}} -export PATH=$PATH:/usr/local/go/bin -export PATH=$PATH:$HOME/go_projects/bin -export GOPATH="$HOME/go_projects" -export GOBIN="$GOPATH/bin" -{{}} {{< note >}} -You can change the variables to any location that suits you, as long as it is included it in the `PATH` variable. -{{< /note >}} +If you recieve the error: `-bash: /usr/bin/unzip: No such file or directory`, install the `unzip` package and try again. + {{< /note >}} -4. Reload your user's environment profile: +1. Add your working directory to `~/.profile` so it's available to your user's PATH. Then reload the Bash profile. + echo 'export PATH="$PATH:$HOME/terraform"' >> ~/.profile source ~/.profile -### Build a Linode Plugin for Terraform - -1. Download the Terraform repository: - - go get github.com/hashicorp/terraform - -2. Download the custom `terraform-provider-linode` repository: - - go get github.com/LinodeContent/terraform-provider-linode - -3. Source code is stored in Go's `src` directory by default. Change directories to the location of the Terraform Linode plugin and build the package. Dependencies will be handled automatically by `godeps` that's already in the plugin folder. - - cd ~/go_projects/src/github.com/LinodeContent/terraform-provider-linode/bin/terraform-provider-linode - go build -o terraform-provider-linode - -4. Move the newly created binary and the Terraform configuration file to `~/go_projects/bin`: +1. Verify Terraform can run by simply calling it with no options or arguments: - mv ~/go_projects/src/github.com/LinodeContent/terraform-provider-linode/bin/terraform-provider-linode/terraform-provider-linode ~/go_projects/bin - mv ~/go_projects/src/github.com/LinodeContent/terraform-provider-linode/linode-template.tf ~/go_projects/bin + terraform -At this point, you have all the binaries needed. If the rest of your clients use the same operating system, then you can distribute these files among them. There is no need for each client to install `Go` or build the same package. + You should see the output below: -### Prepare the Terraform Plugin - -1. Download the Terraform repository: - - go get github.com/hashicorp/terraform - -2. Get the Linode plugin for Terraform: - - wget https://github.com/linode/docs-scripts/raw/master/hosted_scripts/terraform-linode-plugin/terraform-provider-linode - -3. Move the plugin to `~go_projects/bin`: - - mv terraform-provider-linode ~/go_projects/bin/ - chmod 750 ~/go_projects/bin/terraform-provider-linode - -### Configure the Linode Provider + {{< output >}} +user@terraform-example:~$ terraform +Usage: terraform [-version] [-help] [args] + +The available commands for execution are listed below. +The most common, useful commands are shown first, followed by +less common or more advanced commands. If you're just getting +started with Terraform, stick with the common commands. For the +other commands, please read the help and docs before usage. + +Common commands: + apply Builds or changes infrastructure + console Interactive console for Terraform interpolations + destroy Destroy Terraform-managed infrastructure + env Workspace management + fmt Rewrites config files to canonical format + get Download and install modules for the configuration + graph Create a visual graph of Terraform resources + import Import existing infrastructure into Terraform + init Initialize a Terraform working directory + output Read an output from a state file + plan Generate and show an execution plan + providers Prints a tree of the providers used in the configuration + push Upload this Terraform module to Atlas to run + refresh Update local state file against real resources + show Inspect Terraform state or plan + taint Manually mark a resource for recreation + untaint Manually unmark a resource as tainted + validate Validates the Terraform files + version Prints the Terraform version + workspace Workspace management + +All other commands: + debug Debug output management (experimental) + force-unlock Manually unlock the terraform state + state Advanced state management +{{< /output >}} + + +## Building with the Linode Provider Terraform can understand two types of configuration files: JSON and HashiCorp Configuration Language (HCL). This guide [used the HCL format](#install-terraform), designated by the extension `.tf`. -1. Open `linode-template.tf` in a text editor and add the snippet displayed below. Fill in your Linode API key, public SSH key, and desired root password where indicated: +1. Create the file `linode-template.tf` and add the snippet below. Fill in your Linode API key, public SSH key, and desired root password where indicated. See [Terraform's documentation](https://www.terraform.io/docs/configuration/syntax.html) for more information on configuration syntax. - {{< file "~/go_projects/bin/linode-template.tf" aconf >}} + {{< file "~/terraform/linode-template.tf" aconf >}} provider "linode" { - key = "your-linode-API-key-here" + token = "LINODE_API_KEY_HERE" } -resource "linode_linode" "terraform-example" { - image = "Ubuntu 16.04 LTS" - kernel = "Grub 2" - name = "linode-example" - group = "terraform-test" - region = "Atlanta, GA, USA" - size = 1024 - ssh_key = "your-ssh-id_rsa.pub-here" - root_password = "your-server-password-here" +resource "linode_instance" "terraform-example" { + image = "linode/ubuntu18.04" + label = "Terraform-Example" + group = "Terraform" + region = "us-east" + type = "g6-standard-1" + authorized_keys = "PUBLIC_SSH_KEY_HERE" + root_pass = "ROOT_PASSWORD_HERE" } {{< /file >}} - See [Terraform's documentation](https://www.terraform.io/docs/configuration/syntax.html) for specific information regarding configuration syntax. - -2. Navigate to `~/go_projects/bin` and initialize the Terraform configuration: +1. Initialize the Terraform configuration: - cd ~/go_projects/bin terraform init Terraform will confirm successful initialization: + {{< output >}} - Terraform has been successfully initialized! +Terraform has been successfully initialized! {{}} -3. If an error occurs, run the command again in debug mode: +1. If an error occurs, run the command again in debug mode: TF_LOG=debug terraform init -## Use Terraform to Deploy a Linode - -### Single Server Basic Linode +### Provision a Single Server 1. Check your Terraform plan: terraform plan You will see: -{{< output >}} + + {{< output >}} Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. @@ -206,23 +220,22 @@ resource "linode_linode" "terraform-example" { Terraform will perform the following actions: - + linode_linode.your-terraform-name-here + + linode_image.your-terraform-name-here id: disk_expansion: "false" group: "your-linode-group-name-here" helper_distro: "true" - image: "Ubuntu 16.04 LTS" + image: "linode/ubuntu18.04" ip_address: - kernel: "Grub 2" manage_private_ip_automatically: "true" name: "TFtest" plan_storage: plan_storage_utilized: private_ip_address: - region: "Atlanta, GA, USA" - root_password: "wAZ9SvTofwDbrGO2FWgoI3BZFy0bvqxnQnNF1qn9pIQ=" - size: "1024" - ssh_key: "QLWOVauEwNxWGbj2ErWF9vFYIXsxW/2duL/og8gtV84=" + region: "us-south" + root_pass: "wAZ9SvTofwDbrGO2FWgoI3BZFy0bvqxnQnNF1qn9pIQ=" + type: "g6-standard-1" + authorized_keys: "QLWOVauEwNxWGbj2ErWF9vFYIXsxW/2duL/og8gtV84=" status: swap_size: "512" @@ -242,7 +255,7 @@ resource "linode_linode" "terraform-example" { The `terraform plan` command won't take any action or make any changes on your Linode account. Terraform uses a declarative approach in which your configuration file specifies the desired end-state of the infrastructure. When you run `terraform plan`, an analysis is done to determine which actions are required to achieve this state. -2. If there are no errors, start the deployment: +1. If there are no errors, start the deployment: terraform apply @@ -255,23 +268,22 @@ resource "linode_linode" "terraform-example" { Terraform will perform the following actions: - + linode_linode.your-terraform-name-here + + linode_instance.your-terraform-name-here id: disk_expansion: "false" group: "your-linode-group-name-here" helper_distro: "true" - image: "Ubuntu 16.04 LTS" + image: "linode/ubuntu18.04" ip_address: - kernel: "Grub 2" manage_private_ip_automatically: "true" name: "your-linode-name-here" plan_storage: plan_storage_utilized: private_ip_address: - region: "Atlanta, GA, USA" - root_password: "wAZ9SvTofwDbrGO2FWgoI3BZFy0bvqxnQnNF1qn9pIQ=" - size: "1024" - ssh_key: "QLWOVauEwNxWGbj2ErWF9vFYIXsxW/2duL/og8gtV84=" + region: "us-south" + root_pass: "wAZ9SvTofwDbrGO2FWgoI3BZFy0bvqxnQnNF1qn9pIQ=" + type: "g6-standard-1" + authorized_keys: "QLWOVauEwNxWGbj2ErWF9vFYIXsxW/2duL/og8gtV84=" status: swap_size: "512" @@ -285,93 +297,53 @@ resource "linode_linode" "terraform-example" { Enter a value: {{}} -3. Return to the Linode Manager. You should see the `linode-test` Linode has been added to your account. +1. Return to the Linode Manager. You should see the `linode-test` Linode has been added to your account. -### Two-Server Configuration +### Provision Additional Servers -Now that you have the `linode-example` Linode created using Terraform, imagine you need to implement a web and database server deployment. +Now imagine you need to implement a web and database server deployment in addition to the Linode created above. It's important to remember that: -* Terraform loads all files with the ".tf" extension present in the working directory into memory. As a result, all files are concatenated (in memory) and you don't need to define the provider in this file, since it was declared in `linode-template.tf`. +* Terraform loads into memory all files present in the working directory which have a `.tf` extension. As a result, all files are concatenated (in memory) and you don't need to define the provider in this file, since it was declared in `linode-template.tf`. -* Resources can't be duplicated, so you need to assign a unique name for each one. +* Resources can't be duplicated, so you need to assign a unique name for each new Linode. * In this example the same SSH key and root password are being used. You should change these values in production environments. * A new parameter `swap_size` is used to override the default value of 512Mb. You can check all available options for `terraform-provider-linode` in the plugin GitHub repository [readme.md](https://github.com/LinodeContent/terraform-provider-linode). -1. From the `linode-template.tf` create another file called `linode-www.tf` (don't delete `linode-template.tf`): +1. From the `linode-template.tf` create another file called `linode-www.tf`. **Do not delete `linode-template.tf`**. - {{< file "~/go_projects/bin/linode-www.tf" aconf >}} -resource "linode_linode" "terraform-www" { - image = "CentOS 7" - kernel = "Grub 2" + {{< file "~/terraform/linode-www.tf" aconf >}} +resource "linode_instance" "terraform-www" { + image = "linode/centos7" name = "www" group = "web" - region = "Dallas, TX, USA" - size = 2048 + region = "us-south" + type = "g6-standard-1" swap_size = 1024 - ssh_key = "your-ssh-id_rsa.pub-here" - root_password = "your-server-password-here" + authorized_keys = "PUBLIC_SSH_KEY_HERE" + root_pass = "ROOT_PASSWORD_HERE" } {{< /file >}} -2. Check your plan for errors: +1. Check your plan for errors: terraform plan -3. Apply all changes: +1. Apply all changes: terraform apply -4. Check the Linode Manager to ensure that the `www` Linode was added to the `web` display group on your account. +1. Check the Linode Manager to ensure that the `www` Linode was added to the `web` display group on your account. -### Adjust Deployment -Imagine you want to change the first server name and tag to something more relevant, and also increase the size to match the newly created Linode. - -1. Modify the `linode-template.tf` - - {{< file "~/go_projects/bin/linode-template.tf" aconf >}} -provider "linode" { - key = "your-linode-API-key-here" -} - -resource "linode_linode" "terraform-example" { - image = "Ubuntu 16.04 LTS" - kernel = "Grub 2" - name = "database" - group = "web" - region = "Atlanta, GA, USA" - size = 2048 - swap_size = 1024 - ssh_key = "your-ssh-id_rsa.pub-here" - root_password = "your-server-password-here" -} - -{{< /file >}} +### Provision Multiple Servers Using Variables +Up to this point, the procedure for adding a new node to your infrastructure was to create a new file and run `terraform apply`. But what happens when your planned infrastructure has dozens of servers? In this example, you will use a very simplistic version of a Terraform configuration file that uses variables. -2. Check your plan: - - terraform plan - -3. Apply your changes: - - terraform apply - - {{< caution >}} -Changing the size of your Linode will force your server to be powered off and migrated to a different host in the same data center. The associated disk migration will take approximately 1 minute for every 3-5 gigabytes of data. For more information about resizing read the [Resizing a Linode](/docs/platform/disk-images/resizing-a-linode/) guide. -{{< /caution >}} - -4. Return to the Linode Manager to verify the changes. - -### Advanced Configuration Example - -Up to this point, the procedure for adding a new node to your infrastructure was to create a new file and run the `terraform apply` command. But what happens when your planned infrastructure has dozens of servers? In this example, you will use a very simplistic version of a Terraform configuration file that uses variables. - -1. For the purpose of this example you will need to delete previous nodes: +1. For the purpose of this example you will need to delete the previous nodes created above: terraform plan -destroy @@ -382,7 +354,7 @@ Up to this point, the procedure for adding a new node to your infrastructure was The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. - linode_linode.your-terraform-name-here: Refreshing state... (ID: 6630470) + linode_instance.your-terraform-name-here: Refreshing state... (ID: 6630470) ------------------------------------------------------------------------ @@ -404,7 +376,7 @@ Up to this point, the procedure for adding a new node to your infrastructure was "terraform apply" is subsequently run. {{}} -2. Similar to `terraform plan`, the above command checks your infrastructure before doing any change. To perform the deletion, run: +1. Similar to `terraform plan`, the above command checks your infrastructure before doing any change. To perform the deletion, run: terraform destroy @@ -436,34 +408,34 @@ Up to this point, the procedure for adding a new node to your infrastructure was Destroy complete! Resources: 1 destroyed. {{}} -3. Verify the deletion in the Linode Manager. +1. Verify the deletion in the Linode Manager. -4. Delete (or move to a different location) all Terraform files. +1. Delete (or move to a different location) all Terraform files. - rm *.tf* + rm *.tf -5. Create a new file to define variables. You can use any name but for this example we'll use `variables.tf`: +1. Create a new file to define variables. You can use any name but for this example we'll use `variables.tf`: - {{< file "~/go_projects/bin/variables.tf" aconf >}} -variable "linode_key" {} -variable "ssh_key" {} -variable "root_password" {} + {{< file "~/terraform/variables.tf" aconf >}} +variable "token" {} +variable "authorized_keys" {} +variable "root_pass" {} variable "region" { - default = "Atlanta, GA, USA" + default = "us-south" } {{< /file >}} -6. Create the file `terraform.tfvars` to store your variables. **You can't change this filename** after creating it: +1. Create the file `terraform.tfvars` to store your variables. **You can't change this filename** after creating it. - {{< file "~/go_projects/bin/terraform.tfvars" aconf >}} -linode_key = "your-linode-API-key-here" -ssh_key = "your-ssh-id_rsa.pub-here" -root_password ="your-root-password-here" + {{< file "~/terraform/terraform.tfvars" aconf >}} +token = "LINODE_API_KEY_HERE" +authorized_keys = "PUBLIC_SSH_KEY_HERE" +root_pass ="ROOT_PASSWORD_HERE" {{< /file >}} -7. Create a new configuration file called `linode-mod-template.tf`: +1. Create a new configuration file called `linode-mod-template.tf`: - {{< file "~/go_projects/bin/linode-mod-template.tf" aconf >}} + {{< file "~/terraform/linode-mod-template.tf" aconf >}} # Linode Provider definition provider "linode" { @@ -472,49 +444,83 @@ provider "linode" { # Example Web Server -resource "linode_linode" "www-01" { - image = "CentOS 7" - kernel = "Latest 64 bit" +resource "linode_instance" "www-01" { + image = "linode/centos7" name = "www" group = "web" - region = "Dallas, TX, USA" - size = 2048 + region = "us-south" + type = "g6-standard-1" swap_size = 1024 - ssh_key = "${var.ssh_key}" - root_password = "${var.root_password}" + authorized_keys = "${var.authorized_keys}" + root_pass = "${var.root_pass}" } # Example Database Server -resource "linode_linode" "db-01" { - image = "Ubuntu 16.04 LTS" - kernel = "Latest 64 bit" +resource "linode_instance" "db-01" { + image = "linode/ubuntu18.04" name = "database" group = "web" region = "${var.region}" - size = 2048 + type = "g6-standard-1" swap_size = 1024 - ssh_key = "${var.ssh_key}" - root_password = "${var.root_password}" + ssh_key = "${var.authorized_keys}" + root_password = "${var.root_pass}" } - {{< /file >}} -8. Check your new deployment for errors: +1. Check your new deployment for errors: terraform plan -9. Apply all changes: +1. Apply all changes: terraform apply The end result is the same as before. The use of variables gives Terraform great flexibility, not only to store repetitive data (as keys) but also to assign default values to any field. -## Manage your Infrastructure with Terraform -### Terraform Modules +## Modify Live Deployments -The idea behind any code-driven solution is to avoid repetitive blocks. Terraform uses a concept called *modules* to group common server requirements and configurations. Think of modules as similar to *functions* in programming languages. +Imagine you want to change the first server's name and size without needing to destroy and rebuild it. Simply change the values in the `.tf` file. + +{{< caution >}} +Changing the size of your Linode will force your server to be powered off and migrated to a different host in the same data center. The associated disk migration will take approximately 1 minute for every 3-5 gigabytes of data. See our [Resizing a Linode](/docs/platform/disk-images/resizing-a-linode/) guide for more information. +{{< /caution >}} + +1. Modify the `linode-template.tf` + + {{< file "~/terraform/linode-template.tf" aconf >}} +provider "linode" { + token = "LINODE_API_KEY_HERE" +} + +resource "linode_instance" "terraform-example" { + image = "linode/ubuntu18.04" + name = "database" + group = "web" + region = "us-south" + type = "g6-standard-4" + swap_size = 1024 + authorized_keys = "PUBLIC_SSH_KEY_HERE" + root_pass = "ROOT_PASSWORD_HERE" +} +{{< /file >}} + +1. Check your plan: + + terraform plan + +1. Apply your changes: + + terraform apply + +1. Verify the changes in the Linode Manager. + + +## Terraform Modules + +Terraform uses a concept called *modules* to group common server requirements and configurations. Think of modules as similar to *functions* in programming languages. Take a look at the following file structure: @@ -522,43 +528,47 @@ Take a look at the following file structure: There is a directory called `modules` containing the reusable code blocks (in this case `appserver`) and a `testing` directory containing the specific configuration to implement. It's a minimal layout but enough to highlight benefits. -#### Basic Module Structure +Create the directory structure for the module files below: + + cd ~/terraform + mkdir -p modules/appserver + mkdir testing + +### Basic Module Structure The module structure is flexible, so you can use as many Terraform files as needed to describe your infrastructure. This example contains just one main configuration file describing the reusable code: -{{< file "~/go_projects/bin/modules/appserver/main.tf" aconf >}} +{{< file "~/terraform/modules/appserver/main.tf" aconf >}} # Application Server -resource "linode_linode" "appserver" { - image = "Ubuntu 16.04 LTS" - kernel = "Latest 64 bit" +resource "linode_instance" "appserver" { + image = "linode/ubuntu18.04" name = "${var.appserver_name}" group = "web" region = "${var.region}" - size = 2048 + type = "g6-standard-1" swap_size = 1024 - ssh_key = "${var.ssh_key}" - root_password = "${var.root_password}" + authorized_keys = "${var.authorized_keys}" + root_pass = "${var.root_pass}" } # Database Server -resource "linode_linode" "dbserver" { - image = "CentOS 7" - kernel = "Latest 64 bit" +resource "linode_instance" "dbserver" { + image = "centos7" name = "${var.dbserver_name}" group = "web" region = "${var.region}" - size = "${var.db_size}" + type = "${var.db_type}" swap_size = 1024 - ssh_key = "${var.ssh_key}" - root_password = "${var.root_password}" + authorized_keys = "${var.authorized_keys}" + root_pass = "${var.root_pass}" } {{< /file >}} -The configuration above reproduces the previous examples using variables. The next file contains variable definitions: +The configuration above reproduces the previous examples using variables. The next file contains variable definitions. Assign a default value for each variable. That value will be used if you don't override it when you call the module. -{{< file "~/go_projects/bin/modules/appserver/variables.tf" aconf >}} +{{< file "~/terraform/modules/appserver/variables.tf" aconf >}} variable "appserver_name" { description = "The name for the Application Server" default = "default-app" @@ -569,75 +579,62 @@ variable "dbserver_name" { default = "default-db" } -variable "db_size" { +variable "db_type" { description = "The size (plan) for your Database Linode" - default = "1024" + default = "g6-standard-1" } variable "region" { description = "The default Linode region to deploy the infrastructure" - default = "default-region" + default = "us-east" } -variable "ssh_key" { +variable "authorized_keys" { description = "The Public id_rsa.pub key used for secure SSH connections" - default = "default-ssh-key" + default = "default-ssh-public-key" } -variable "root_password" { +variable "root_pass" { description = "The default root password for the Linode server" - default = "default-root-pwd" + default = "default-root-password" } {{< /file >}} -{{< note >}} -Assign a default value for each variable. That value will be used if you don't override it when you call the module. -{{< /note >}} +### Working with Modules -Create a `main.tf` configuration file that uses the module you just created: +1. Create a `main.tf` configuration file that uses the module you just created: -{{< file "~/go_projects/bin/testing/main.tf" aconf >}} + {{< file "~/terraform/testing/main.tf" aconf >}} # Newark Testing Environment Infrastructure provider "linode" { - key = "your-linode-API-key-here" + token = "LINODE_API_KEY_HERE" } module "appserver" { - source = "/your/absolute/path/to/modules/appserver" + source = "$HOME/terraform/appserver" # Variables Specific to this Deployment -region = "Newark, NJ, USA" -ssh_key = "your-ssh-id_rsa" -root_password ="your-root-password-here" +region = "us-east" +authorized_keys = "PUBLIC_SSH_KEY_HERE" +root_pass ="ROOT_PASSWORD_HERE" # Variables Specific to Servers appserver_name = "NJ-app" dbserver_name = "NJ-db" -db_size = "8192" +db_type = "g6-standard-8" } {{< /file >}} -To use a module, call it by name with the command `module` and indicate the absolute path where it is saved. Then you can assign values to each field defined by a variable. The final result will be the same as if you pasted in all of the reusable code in the main configuration file. - - cd ~/go_projects/bin/testing/ - terraform init - terraform planned - terraform apply - -The possibilities of modules are endless. You can use several modules at once, you can mix the use of modules with traditional `resource` definitions, or you can even call modules from remote sources. For more information read the Terraform [modules documentation](https://www.terraform.io/docs/modules/index.html). - -## Server Configuration +1. To use a module, call it by name with the command `module` and indicate the absolute path where it is saved. Then you can assign values to each field defined by a variable. The final result will be the same as if you pasted in all of the reusable code in the main configuration file. -Terraform offers many ways to set up and provision your Linode, using: - -* Custom scripts, which can be included on configuration file itself or called from a local or remote file. -* Specialized software tools integrated with Terraform like Chef or Puppet. -* Container-based solutions like Docker or Kubernetes. -* Terraform plugin-based solutions. + cd ~/terraform/testing/ + terraform init + terraform planned + terraform apply -There are also plenty of [provisioners](https://www.terraform.io/docs/provisioners/index.html), [providers](https://github.com/terraform-providers), and even [modules](https://registry.terraform.io) available. + The possibilities of modules are endless. You can use several modules at once, you can mix the use of modules with traditional `resource` definitions, or you can even call modules from remote sources. For more information read the [Terraform modules documentation](https://www.terraform.io/docs/modules/index.html). From 85d65d5c5d603c1e6018b41dd452156858b03dd4 Mon Sep 17 00:00:00 2001 From: cwlinode Date: Thu, 18 Oct 2018 17:06:11 -0400 Subject: [PATCH 2/6] Terminal outputs corrected and a few other edits --- .../index.md | 256 +++++++++--------- 1 file changed, 133 insertions(+), 123 deletions(-) diff --git a/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md b/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md index c05d00ac5ea..1e01f0cb977 100644 --- a/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md +++ b/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md @@ -7,7 +7,7 @@ og_description: 'Use Terraform to deploy Linodes containing pre-configured appli keywords: ["terraform", "infrastructure", "IaC"] license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' published: 2017-11-06 -modified: 2018-10-18 +modified: 2018-10-19 aliases: ['platform/how-to-build-your-infrastructure-using-terraform-and-linode/'] modified_by: name: Linode @@ -179,7 +179,7 @@ resource "linode_instance" "terraform-example" { group = "Terraform" region = "us-east" type = "g6-standard-1" - authorized_keys = "PUBLIC_SSH_KEY_HERE" + authorized_keys = [ "PUBLIC_SSH_KEY_HERE" ] root_pass = "ROOT_PASSWORD_HERE" } {{< /file >}} @@ -207,46 +207,50 @@ Terraform has been successfully initialized! You will see: {{< output >}} - Refreshing Terraform state in-memory prior to plan... - The refreshed state will be used to calculate this plan, but will not be - persisted to local or remote state storage. - - - ------------------------------------------------------------------------ - - An execution plan has been generated and is shown below. - Resource actions are indicated with the following symbols: - + create - - Terraform will perform the following actions: - - + linode_image.your-terraform-name-here - id: - disk_expansion: "false" - group: "your-linode-group-name-here" - helper_distro: "true" - image: "linode/ubuntu18.04" - ip_address: - manage_private_ip_automatically: "true" - name: "TFtest" - plan_storage: - plan_storage_utilized: - private_ip_address: - region: "us-south" - root_pass: "wAZ9SvTofwDbrGO2FWgoI3BZFy0bvqxnQnNF1qn9pIQ=" - type: "g6-standard-1" - authorized_keys: "QLWOVauEwNxWGbj2ErWF9vFYIXsxW/2duL/og8gtV84=" - status: - swap_size: "512" - - - Plan: 1 to add, 0 to change, 0 to destroy. - - ------------------------------------------------------------------------ - - Note: You didn't specify an "-out" parameter to save this plan, so Terraform - can't guarantee that exactly these actions will be performed if - "terraform apply" is subsequently run. +Refreshing Terraform state in-memory prior to plan... +The refreshed state will be used to calculate this plan, but will not be +persisted to local or remote state storage. + + +------------------------------------------------------------------------ + +An execution plan has been generated and is shown below. +Resource actions are indicated with the following symbols: + + create + +Terraform will perform the following actions: + + + linode_instance.terraform-example + id: + alerts.#: + authorized_keys.#: "1" + authorized_keys.0: "ssh-rsa . . ." + backups.#: + backups_enabled: + boot_config_label: + group: "Terraform" + image: "linode/ubuntu18.04" + ip_address: + ipv4.#: + ipv6: + label: "Terraform-Example" + private_ip_address: + region: "us-east" + root_pass: + specs.#: + status: + swap_size: + type: "g6-standard-1" + watchdog_enabled: "true" + + +Plan: 1 to add, 0 to change, 0 to destroy. + +------------------------------------------------------------------------ + +Note: You didn't specify an "-out" parameter to save this plan, so Terraform +can't guarantee that exactly these actions will be performed if +"terraform apply" is subsequently run. {{}} If you need to fix any issues, activate debug mode: @@ -262,39 +266,43 @@ Terraform has been successfully initialized! You'll be asked to confirm the action, enter `yes` and press **Enter**: {{< output >}} - An execution plan has been generated and is shown below. - Resource actions are indicated with the following symbols: - + create - - Terraform will perform the following actions: - - + linode_instance.your-terraform-name-here - id: - disk_expansion: "false" - group: "your-linode-group-name-here" - helper_distro: "true" - image: "linode/ubuntu18.04" - ip_address: - manage_private_ip_automatically: "true" - name: "your-linode-name-here" - plan_storage: - plan_storage_utilized: - private_ip_address: - region: "us-south" - root_pass: "wAZ9SvTofwDbrGO2FWgoI3BZFy0bvqxnQnNF1qn9pIQ=" - type: "g6-standard-1" - authorized_keys: "QLWOVauEwNxWGbj2ErWF9vFYIXsxW/2duL/og8gtV84=" - status: - swap_size: "512" - - - Plan: 1 to add, 0 to change, 0 to destroy. - - Do you want to perform these actions? - Terraform will perform the actions described above. - Only 'yes' will be accepted to approve. - - Enter a value: +An execution plan has been generated and is shown below. +Resource actions are indicated with the following symbols: + + create + +Terraform will perform the following actions: + + + linode_instance.terraform-example + id: + alerts.#: + authorized_keys.#: "1" + authorized_keys.0: "ssh-rsa . . ." + backups.#: + backups_enabled: + boot_config_label: + group: "Terraform" + image: "linode/ubuntu18.04" + ip_address: + ipv4.#: + ipv6: + label: "Terraform-Example" + private_ip_address: + region: "us-east" + root_pass: + specs.#: + status: + swap_size: + type: "g6-standard-1" + watchdog_enabled: "true" + + +Plan: 1 to add, 0 to change, 0 to destroy. + +Do you want to perform these actions? + Terraform will perform the actions described above. + Only 'yes' will be accepted to approve. + + Enter a value: {{}} 1. Return to the Linode Manager. You should see the `linode-test` Linode has been added to your account. @@ -318,12 +326,12 @@ It's important to remember that: {{< file "~/terraform/linode-www.tf" aconf >}} resource "linode_instance" "terraform-www" { image = "linode/centos7" - name = "www" + label = "www" group = "web" region = "us-south" type = "g6-standard-1" swap_size = 1024 - authorized_keys = "PUBLIC_SSH_KEY_HERE" + authorized_keys = [ "PUBLIC_SSH_KEY_HERE" ] root_pass = "ROOT_PASSWORD_HERE" } {{< /file >}} @@ -347,65 +355,67 @@ Up to this point, the procedure for adding a new node to your infrastructure was terraform plan -destroy - That returns: + That should return: {{< output >}} - Refreshing Terraform state in-memory prior to plan... - The refreshed state will be used to calculate this plan, but will not be - persisted to local or remote state storage. +Refreshing Terraform state in-memory prior to plan... +The refreshed state will be used to calculate this plan, but will not be +persisted to local or remote state storage. - linode_instance.your-terraform-name-here: Refreshing state... (ID: 6630470) +linode_instance.terraform-example: Refreshing state... (ID: 10948649) - ------------------------------------------------------------------------ +------------------------------------------------------------------------ - An execution plan has been generated and is shown below. - Resource actions are indicated with the following symbols: - - destroy +An execution plan has been generated and is shown below. +Resource actions are indicated with the following symbols: + - destroy - Terraform will perform the following actions: +Terraform will perform the following actions: - - linode_linode.TFtest + - linode_instance.terraform-example - Plan: 0 to add, 0 to change, 1 to destroy. +Plan: 0 to add, 0 to change, 1 to destroy. - ------------------------------------------------------------------------ +------------------------------------------------------------------------ - Note: You didn't specify an "-out" parameter to save this plan, so Terraform - can't guarantee that exactly these actions will be performed if - "terraform apply" is subsequently run. +Note: You didn't specify an "-out" parameter to save this plan, so Terraform +can't guarantee that exactly these actions will be performed if +"terraform apply" is subsequently run. {{}} 1. Similar to `terraform plan`, the above command checks your infrastructure before doing any change. To perform the deletion, run: terraform destroy - That will return: + That should return: {{< output >}} - linode_linode.your-terraform-name-here: Refreshing state... (ID: 6630470) +linode_instance.terraform-example: Refreshing state... (ID: 10948649) - An execution plan has been generated and is shown below. - Resource actions are indicated with the following symbols: - - destroy +An execution plan has been generated and is shown below. +Resource actions are indicated with the following symbols: + - destroy - Terraform will perform the following actions: +Terraform will perform the following actions: - - linode_linode.TFtest + - linode_instance.terraform-example - Plan: 0 to add, 0 to change, 1 to destroy. +Plan: 0 to add, 0 to change, 1 to destroy. - Do you really want to destroy? - Terraform will destroy all your managed infrastructure, as shown above. - There is no undo. Only 'yes' will be accepted to confirm. +Do you really want to destroy all resources? + Terraform will destroy all your managed infrastructure, as shown above. + There is no undo. Only 'yes' will be accepted to confirm. - Enter a value: yes + Enter a value: yes - linode_linode.your-terraform-name-here: Destroying... (ID: 6630470) - linode_linode.your-terraform-name-here: Destruction complete after 0s +linode_instance.terraform-example: Destroying... (ID: 10948649) +linode_instance.terraform-example: Still destroying... (ID: 10948649, 10s elapsed) +linode_instance.terraform-example: Still destroying... (ID: 10948649, 20s elapsed) +linode_instance.terraform-example: Destruction complete after 21s - Destroy complete! Resources: 1 destroyed. +Destroy complete! Resources: 1 destroyed. {{}} 1. Verify the deletion in the Linode Manager. @@ -446,12 +456,12 @@ provider "linode" { resource "linode_instance" "www-01" { image = "linode/centos7" - name = "www" + label = "www" group = "web" region = "us-south" type = "g6-standard-1" swap_size = 1024 - authorized_keys = "${var.authorized_keys}" + authorized_keys = [ "${var.authorized_keys}" ] root_pass = "${var.root_pass}" } @@ -459,12 +469,12 @@ resource "linode_instance" "www-01" { resource "linode_instance" "db-01" { image = "linode/ubuntu18.04" - name = "database" + label = "database" group = "web" region = "${var.region}" type = "g6-standard-1" swap_size = 1024 - ssh_key = "${var.authorized_keys}" + authorized_keys = [ "${var.authorized_keys}" ] root_password = "${var.root_pass}" } {{< /file >}} @@ -497,12 +507,12 @@ provider "linode" { resource "linode_instance" "terraform-example" { image = "linode/ubuntu18.04" - name = "database" + label = "database" group = "web" region = "us-south" type = "g6-standard-4" swap_size = 1024 - authorized_keys = "PUBLIC_SSH_KEY_HERE" + authorized_keys = [ "PUBLIC_SSH_KEY_HERE" ] root_pass = "ROOT_PASSWORD_HERE" } {{< /file >}} @@ -543,12 +553,12 @@ The module structure is flexible, so you can use as many Terraform files as need resource "linode_instance" "appserver" { image = "linode/ubuntu18.04" - name = "${var.appserver_name}" + label = "${var.appserver_label}" group = "web" region = "${var.region}" type = "g6-standard-1" swap_size = 1024 - authorized_keys = "${var.authorized_keys}" + authorized_keys = [ "${var.authorized_keys}" ] root_pass = "${var.root_pass}" } @@ -556,12 +566,12 @@ resource "linode_instance" "appserver" { resource "linode_instance" "dbserver" { image = "centos7" - name = "${var.dbserver_name}" + label = "${var.dbserver_label}" group = "web" region = "${var.region}" type = "${var.db_type}" swap_size = 1024 - authorized_keys = "${var.authorized_keys}" + authorized_keys = [ "${var.authorized_keys}" ] root_pass = "${var.root_pass}" } {{< /file >}} @@ -569,12 +579,12 @@ resource "linode_instance" "dbserver" { The configuration above reproduces the previous examples using variables. The next file contains variable definitions. Assign a default value for each variable. That value will be used if you don't override it when you call the module. {{< file "~/terraform/modules/appserver/variables.tf" aconf >}} -variable "appserver_name" { +variable "appserver_label" { description = "The name for the Application Server" default = "default-app" } -variable "dbserver_name" { +variable "dbserver_label" { description = "The name for the Database Server" default = "default-db" } @@ -618,13 +628,13 @@ module "appserver" { # Variables Specific to this Deployment region = "us-east" -authorized_keys = "PUBLIC_SSH_KEY_HERE" +authorized_keys = [ "PUBLIC_SSH_KEY_HERE" ] root_pass ="ROOT_PASSWORD_HERE" # Variables Specific to Servers -appserver_name = "NJ-app" -dbserver_name = "NJ-db" +appserver_label = "NJ-app" +dbserver_label = "NJ-db" db_type = "g6-standard-8" } From d4d5687f9b8cba5acc032d3edaf0db966dac9703 Mon Sep 17 00:00:00 2001 From: leslitagordita Date: Fri, 19 Oct 2018 16:37:18 -0400 Subject: [PATCH 3/6] Tech Edits --- .../index.md | 102 ++++++++++++------ 1 file changed, 68 insertions(+), 34 deletions(-) diff --git a/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md b/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md index 1e01f0cb977..569d0c2735c 100644 --- a/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md +++ b/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md @@ -27,7 +27,7 @@ Terraform offers many ways to set up and provision your Linode using: * Container-based solutions like Docker or Kubernetes. * Terraform plugin-based solutions. -There are also plenty of [provisioners](https://www.terraform.io/docs/provisioners/index.html), [providers](https://github.com/terraform-providers), and even [modules](https://registry.terraform.io) available, one of which is the official [Linode-maintained provider](https://github.com/terraform-providers/terraform-provider-linode/). +There are also plenty of [provisioners](https://www.terraform.io/docs/provisioners/index.html), [providers](https://github.com/terraform-providers), and [modules](https://registry.terraform.io) available, one of which is the official [Linode-maintained provider](https://github.com/terraform-providers/terraform-provider-linode/). {{< caution >}} The configurations and commands used in this guide will result in multiple Linodes being added to your account. Be sure to monitor your account closely in the Linode Manager to avoid unwanted charges. @@ -37,7 +37,11 @@ The configurations and commands used in this guide will result in multiple Linod - You will need root access to the system and a standard user account with sudo privileges. -- Create an API token for your Linode account. It will only appear once on the screen, so be sure to take a screen capture of the token while it's displayed. See our guide [Getting Started with the Linode API](/docs/platform/api/getting-started-with-the-linode-api/#get-an-access-token) if you need help. +- Create an API token for your Linode account. It will only appear once on the screen, so be sure to take a screen capture of the token while it's displayed. See our guide [Getting Started with the Linode API](/docs/platform/api/getting-started-with-the-linode-api-new-manager/#get-an-access-token) if you need help. + +{{< note >}} +The Linode provider uses [Linode's API v4](https://developers.linode.com/api/v4#section/Access-and-Authentication). To generate an API v4 Personal Access Token, you will need to use the [new Linode Manager](https://cloud.linode.com/). Any Personal Access Tokens generated from the previous Linode Manager are API v3 tokens and will not work with Terraform's Linode provider. +{{}} ## Install Terraform @@ -62,8 +66,8 @@ The configurations and commands used in this guide will result in multiple Linod The output should show that the key was imported: {{< output >}} -root@localhost:~# gpg --recv-keys 51852D87348FFC4C -gpg: /root/.gnupg/trustdb.gpg: trustdb created +user@localhost:~# gpg --recv-keys 51852D87348FFC4C +gpg: /home/user/.gnupg/trustdb.gpg: trustdb created gpg: key 51852D87348FFC4C: public key "HashiCorp Security " imported gpg: no ultimately trusted keys found gpg: Total number processed: 1 @@ -78,10 +82,10 @@ If you recieve an error to the effect of `No dirmngrnupg/S.dirmngr'`, install th gpg --verify terraform*.sig terraform*SHA256SUMS - The output should say the signature is good: + The output should confimr `Good signature from "HashiCorp Security "`: {{< output >}} -root@localhost:~# gpg --verify terraform*.sig terraform*SHA256SUMS +user@localhost:~# gpg --verify terraform*.sig terraform*SHA256SUMS gpg: Signature made Wed 15 Aug 2018 10:07:05 PM UTC gpg: using RSA key 51852D87348FFC4C gpg: Good signature from "HashiCorp Security " [unknown] @@ -164,7 +168,7 @@ All other commands: ## Building with the Linode Provider -Terraform can understand two types of configuration files: JSON and HashiCorp Configuration Language (HCL). This guide [used the HCL format](#install-terraform), designated by the extension `.tf`. +Terraform can understand two types of configuration files: JSON and HashiCorp Configuration Language (HCL). This guide [used the HCL format](https://github.com/hashicorp/hcl), designated by the extension `.tf`. 1. Create the file `linode-template.tf` and add the snippet below. Fill in your Linode API key, public SSH key, and desired root password where indicated. See [Terraform's documentation](https://www.terraform.io/docs/configuration/syntax.html) for more information on configuration syntax. @@ -191,6 +195,19 @@ resource "linode_instance" "terraform-example" { Terraform will confirm successful initialization: {{< output >}} +Initializing provider plugins... +- Checking for available provider plugins on https://releases.hashicorp.com... +- Downloading plugin for provider "linode" (1.0.0)... + +The following providers do not have any version constraints in configuration, +so the latest version was installed. + +To prevent automatic upgrades to new major versions that may contain breaking +changes, it is recommended to add version = "..." constraints to the +corresponding provider blocks in configuration, with the constraint strings +suggested below. + +* provider.linode: version = "~> 1.0" Terraform has been successfully initialized! {{}} @@ -253,12 +270,12 @@ can't guarantee that exactly these actions will be performed if "terraform apply" is subsequently run. {{}} + The `terraform plan` command won't take any action or make any changes on your Linode account. Terraform uses a declarative approach in which your configuration file specifies the desired end-state of the infrastructure. When you run `terraform plan`, an analysis is done to determine which actions are required to achieve this state. + If you need to fix any issues, activate debug mode: TF_LOG=debug terraform plan - The `terraform plan` command won't take any action or make any changes on your Linode account. Terraform uses a declarative approach in which your configuration file specifies the desired end-state of the infrastructure. When you run `terraform plan`, an analysis is done to determine which actions are required to achieve this state. - 1. If there are no errors, start the deployment: terraform apply @@ -313,15 +330,15 @@ Now imagine you need to implement a web and database server deployment in additi It's important to remember that: -* Terraform loads into memory all files present in the working directory which have a `.tf` extension. As a result, all files are concatenated (in memory) and you don't need to define the provider in this file, since it was declared in `linode-template.tf`. +* Terraform loads into memory all files present in the working directory which have a `.tf` extension. As a result, all files are concatenated (in memory). This means you don't need to define the provider in new `.tf` files, since it was already declared in `linode-template.tf`. * Resources can't be duplicated, so you need to assign a unique name for each new Linode. -* In this example the same SSH key and root password are being used. You should change these values in production environments. +* In this example the same SSH key and root password are being used. In production environments, these values should be unique for each resource. * A new parameter `swap_size` is used to override the default value of 512Mb. You can check all available options for `terraform-provider-linode` in the plugin GitHub repository [readme.md](https://github.com/LinodeContent/terraform-provider-linode). -1. From the `linode-template.tf` create another file called `linode-www.tf`. **Do not delete `linode-template.tf`**. +1. Create another file called `linode-www.tf`. **Do not delete `linode-template.tf`**. {{< file "~/terraform/linode-www.tf" aconf >}} resource "linode_instance" "terraform-www" { @@ -344,7 +361,7 @@ resource "linode_instance" "terraform-www" { terraform apply -1. Check the Linode Manager to ensure that the `www` Linode was added to the `web` display group on your account. +1. Check the Linode Manager to ensure that the `www` Linode was added to your account. ### Provision Multiple Servers Using Variables @@ -384,7 +401,7 @@ can't guarantee that exactly these actions will be performed if "terraform apply" is subsequently run. {{}} -1. Similar to `terraform plan`, the above command checks your infrastructure before doing any change. To perform the deletion, run: +1. Similar to `terraform plan`, the above command checks your infrastructure before performing any changes. To destroy the Linodes, run: terraform destroy @@ -415,7 +432,7 @@ linode_instance.terraform-example: Still destroying... (ID: 10948649, 10s elapse linode_instance.terraform-example: Still destroying... (ID: 10948649, 20s elapsed) linode_instance.terraform-example: Destruction complete after 21s -Destroy complete! Resources: 1 destroyed. +Destroy complete! Resources: 2 destroyed. {{}} 1. Verify the deletion in the Linode Manager. @@ -424,7 +441,7 @@ Destroy complete! Resources: 1 destroyed. rm *.tf -1. Create a new file to define variables. You can use any name but for this example we'll use `variables.tf`: +1. Create a new file to define variables. You can use any name but for this example use `variables.tf`: {{< file "~/terraform/variables.tf" aconf >}} variable "token" {} @@ -449,7 +466,7 @@ root_pass ="ROOT_PASSWORD_HERE" # Linode Provider definition provider "linode" { - key = "${var.linode_key}" + token = "${var.token}" } # Example Web Server @@ -475,7 +492,7 @@ resource "linode_instance" "db-01" { type = "g6-standard-1" swap_size = 1024 authorized_keys = [ "${var.authorized_keys}" ] - root_password = "${var.root_pass}" + root_pass = "${var.root_pass}" } {{< /file >}} @@ -487,7 +504,7 @@ resource "linode_instance" "db-01" { terraform apply - The end result is the same as before. The use of variables gives Terraform great flexibility, not only to store repetitive data (as keys) but also to assign default values to any field. + The end result is the same as before. The use of variables gives Terraform great flexibility, not only to store repetitive data (like keys) but also to assign default values to any field. ## Modify Live Deployments @@ -498,22 +515,39 @@ Imagine you want to change the first server's name and size without needing to d Changing the size of your Linode will force your server to be powered off and migrated to a different host in the same data center. The associated disk migration will take approximately 1 minute for every 3-5 gigabytes of data. See our [Resizing a Linode](/docs/platform/disk-images/resizing-a-linode/) guide for more information. {{< /caution >}} -1. Modify the `linode-template.tf` +1. Modify the `linode-mod-template.tf` and update the `type` value to `g6-standard-4` for the `db-01` resource. + + {{< file "~/terraform/linode-mod-template.tf" aconf >}} +# Linode Provider definition - {{< file "~/terraform/linode-template.tf" aconf >}} provider "linode" { - token = "LINODE_API_KEY_HERE" + token = "${var.token}" } -resource "linode_instance" "terraform-example" { +# Example Web Server + +resource "linode_instance" "www-01" { + image = "linode/centos7" + label = "www" + group = "web" + region = "us-south" + type = "g6-standard-1" + swap_size = 1024 + authorized_keys = [ "${var.authorized_keys}" ] + root_pass = "${var.root_pass}" +} + +# Example Database Server + +resource "linode_instance" "db-01" { image = "linode/ubuntu18.04" label = "database" group = "web" - region = "us-south" + region = "${var.region}" type = "g6-standard-4" - swap_size = 1024 - authorized_keys = [ "PUBLIC_SSH_KEY_HERE" ] - root_pass = "ROOT_PASSWORD_HERE" + swap_size = 2048 + authorized_keys = [ "${var.authorized_keys}" ] + root_pass = "${var.root_pass}" } {{< /file >}} @@ -558,20 +592,20 @@ resource "linode_instance" "appserver" { region = "${var.region}" type = "g6-standard-1" swap_size = 1024 - authorized_keys = [ "${var.authorized_keys}" ] + authorized_keys = "${var.authorized_keys}" root_pass = "${var.root_pass}" } # Database Server resource "linode_instance" "dbserver" { - image = "centos7" + image = "linode/centos7" label = "${var.dbserver_label}" group = "web" region = "${var.region}" type = "${var.db_type}" swap_size = 1024 - authorized_keys = [ "${var.authorized_keys}" ] + authorized_keys = "${var.authorized_keys}" root_pass = "${var.root_pass}" } {{< /file >}} @@ -601,7 +635,7 @@ variable "region" { variable "authorized_keys" { description = "The Public id_rsa.pub key used for secure SSH connections" - default = "default-ssh-public-key" + default = ["default-ssh-public-key"] } variable "root_pass" { @@ -613,7 +647,7 @@ variable "root_pass" { ### Working with Modules -1. Create a `main.tf` configuration file that uses the module you just created: +1. Create a `main.tf` configuration file that uses the module you just created. Ensure you replace the values for `authorized_keys` and `root_pass`: {{< file "~/terraform/testing/main.tf" aconf >}} # Newark Testing Environment Infrastructure @@ -623,7 +657,7 @@ provider "linode" { } module "appserver" { - source = "$HOME/terraform/appserver" + source = "../modules/appserver" # Variables Specific to this Deployment @@ -644,7 +678,7 @@ db_type = "g6-standard-8" cd ~/terraform/testing/ terraform init - terraform planned + terraform plan terraform apply The possibilities of modules are endless. You can use several modules at once, you can mix the use of modules with traditional `resource` definitions, or you can even call modules from remote sources. For more information read the [Terraform modules documentation](https://www.terraform.io/docs/modules/index.html). From 9504aa9fc047cf313f28c9d47cb60d6b0337c75f Mon Sep 17 00:00:00 2001 From: nmelehan Date: Sat, 20 Oct 2018 05:24:12 -0400 Subject: [PATCH 4/6] Copy edit complete --- .../index.md | 532 +++++++++--------- .../terraform-modules-tree.jpg | Bin 16934 -> 0 bytes ...arted-with-linode-api-my-profile-small.png | Bin 0 -> 10866 bytes ...get-started-with-linode-api-my-profile.png | Bin 0 -> 26455 bytes .../get-started-with-linode-api-new-token.png | Bin 0 -> 27192 bytes ...rted-with-linode-api-select-my-profile.png | Bin 0 -> 9543 bytes .../index.md | 185 ++++++ 7 files changed, 446 insertions(+), 271 deletions(-) delete mode 100644 docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/terraform-modules-tree.jpg create mode 100644 docs/platform/api/getting-started-with-the-linode-api-new-manager/get-started-with-linode-api-my-profile-small.png create mode 100644 docs/platform/api/getting-started-with-the-linode-api-new-manager/get-started-with-linode-api-my-profile.png create mode 100644 docs/platform/api/getting-started-with-the-linode-api-new-manager/get-started-with-linode-api-new-token.png create mode 100644 docs/platform/api/getting-started-with-the-linode-api-new-manager/get-started-with-linode-api-select-my-profile.png create mode 100644 docs/platform/api/getting-started-with-the-linode-api-new-manager/index.md diff --git a/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md b/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md index 569d0c2735c..78305400cdd 100644 --- a/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md +++ b/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md @@ -2,8 +2,8 @@ author: name: Linode Community email: docs@linode.com -description: 'Use Terraform to deploy Linodes containing pre-configured application environments such as Docker or from a manual configuration.' -og_description: 'Use Terraform to deploy Linodes containing pre-configured application environments such as Docker or from a manual configuration.' +description: 'Use Terraform to provision Linode environments.' +og_description: 'Use Terraform to provision Linode environments.' keywords: ["terraform", "infrastructure", "IaC"] license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' published: 2017-11-06 @@ -16,18 +16,11 @@ contributor: name: Damaso Sanoja --- -Infrastructure as code (IaC) is software that gives developers the ability to build, manage, and provision computing environments with a high-level [configuration syntax](https://www.terraform.io/docs/configuration/syntax.html). Some benefits include the ability to enforce DevOps best practices, process automation, and the opportunity to use version control systems for greater visibility and collaboration within a team. +Infrastructure as code (IaC) is a development and operations methodology that allows server deployments and software configuration to be represented as code. This methodology reduces the chance for human error, makes complex systems more manageable, eases collaboration on systems engineering projets, and offers a number of other benefits. -[Terraform](https://www.terraform.io) stands out from other IaC solutions because it's an orchestration tool, meaning it's designed specifically for bare-metal server and virtual machines. +Terraform is an IaC tool that focuses on creating, modifying, and destroying servers, instead of managing the software on those servers. Terraform offers plugins to interface with different hosting providers, and an official Linode plugin is available. This guide will show how to get started with Terraform and Linode. -Terraform offers many ways to set up and provision your Linode using: - -* Custom scripts, which can be included in a configuration file itself or called from a local or remote file. -* Specialized software tools integrated with Terraform like Chef or Puppet. -* Container-based solutions like Docker or Kubernetes. -* Terraform plugin-based solutions. - -There are also plenty of [provisioners](https://www.terraform.io/docs/provisioners/index.html), [providers](https://github.com/terraform-providers), and [modules](https://registry.terraform.io) available, one of which is the official [Linode-maintained provider](https://github.com/terraform-providers/terraform-provider-linode/). +Linodes created with Terraform can be further configured with container systems like Docker, or with configuration management software like Salt, Puppet, Ansible, or Chef. {{< caution >}} The configurations and commands used in this guide will result in multiple Linodes being added to your account. Be sure to monitor your account closely in the Linode Manager to avoid unwanted charges. @@ -35,38 +28,49 @@ The configurations and commands used in this guide will result in multiple Linod ## Before You Begin -- You will need root access to the system and a standard user account with sudo privileges. +- This guide will show how to install and use the Terraform client software from a Linux system. Terraform can be installed on other operating systems, and the instructions for those platforms will be analogous to the commands presented in this guide. -- Create an API token for your Linode account. It will only appear once on the screen, so be sure to take a screen capture of the token while it's displayed. See our guide [Getting Started with the Linode API](/docs/platform/api/getting-started-with-the-linode-api-new-manager/#get-an-access-token) if you need help. + {{< note >}} +When following this guide, your Linux user may need sudo privileges in order to install supplementary software packages. +{{}} -{{< note >}} -The Linode provider uses [Linode's API v4](https://developers.linode.com/api/v4#section/Access-and-Authentication). To generate an API v4 Personal Access Token, you will need to use the [new Linode Manager](https://cloud.linode.com/). Any Personal Access Tokens generated from the previous Linode Manager are API v3 tokens and will not work with Terraform's Linode provider. +- You will need a personal access token for Linode's [v4 API](https://developers.linode.com/api/v4) to use with Terraform. Follow the [Getting Started with the Linode API](/docs/platform/api/getting-started-with-the-linode-api-new-manager/#get-an-access-token) to get a token. + + {{< note >}} +Any Personal Access Tokens generated from the previous Linode Manager are API v3 tokens and will not work with Terraform's Linode provider. {{}} ## Install Terraform - 1. Make a Terraform project directory to work from and `cd` into it: +1. Make a Terraform project directory in your home directory and then navigate to it: + + mkdir ~/terraform + cd ~/terraform + +1. Download the following files from [Terraform's website](https://www.terraform.io/downloads.html). Example `wget` commands are listed using the latest version available at time of publishing (0.11.9). You should inspect the links on the download page to see if a newer version is available and update the `wget` commands to use those URLs instead: + + - The 64-bit Linux `.zip` archive - mkdir terraform - cd terraform + wget https://releases.hashicorp.com/terraform/0.11.9/terraform_0.11.9_linux_amd64.zip - 1. Download the following files from [Terraform's website](https://www.terraform.io/downloads.html): + - The SHA256 checksums file - - The 64-bit Linux `.zip` archive. - - The SHA256 checksums file. - - The checksum signature file. + wget https://releases.hashicorp.com/terraform/0.11.9/terraform_0.11.9_SHA256SUMS + - The checksum signature file -### Verify Download + wget https://releases.hashicorp.com/terraform/0.11.9/terraform_0.11.9_SHA256SUMS.sig -1. Import the HashiCorp Security [GPG key](https://www.hashicorp.com/security.html): - gpg --recv-keys *keyID* +### Verify the Download + +1. Import the HashiCorp Security GPG key (listed on the [HashiCorp Security](https://www.hashicorp.com/security.html) page under *Secure Communications*): + + gpg --recv-keys 51852D87348FFC4C The output should show that the key was imported: {{< output >}} -user@localhost:~# gpg --recv-keys 51852D87348FFC4C gpg: /home/user/.gnupg/trustdb.gpg: trustdb created gpg: key 51852D87348FFC4C: public key "HashiCorp Security " imported gpg: no ultimately trusted keys found @@ -75,26 +79,25 @@ gpg: imported: 1 {{}} {{< note >}} -If you recieve an error to the effect of `No dirmngrnupg/S.dirmngr'`, install the package `dirmngr` and run the GPG command again. +If you receive errors that indicate the `dirmngr` software is missing or inaccessible, install `dirmngr` using your package manager and run the GPG command again. {{< /note >}} 1. Verify the checksum file's GPG signature: gpg --verify terraform*.sig terraform*SHA256SUMS - The output should confimr `Good signature from "HashiCorp Security "`: + The output should contain the `Good signature from "HashiCorp Security "` confirmation message: {{< output >}} -user@localhost:~# gpg --verify terraform*.sig terraform*SHA256SUMS gpg: Signature made Wed 15 Aug 2018 10:07:05 PM UTC gpg: using RSA key 51852D87348FFC4C -gpg: Good signature from "HashiCorp Security " [unknown] +gpg: Good signature from "HashiCorp Security <security@hashicorp.com>" [unknown] gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: 91A6 E7F8 5D05 C656 30BE F189 5185 2D87 348F FC4C {{}} -1. Verify that the fingerprint matches what's on [HashiCorp's security page](https://www.hashicorp.com/security.html). +1. Verify that the fingerprint output matches the fingerprint listed in the *Secure Communications* section of the [HashiCorp Security](https://www.hashicorp.com/security.html) page. 1. Verify the `.zip` archive's checksum: @@ -103,20 +106,20 @@ Primary key fingerprint: 91A6 E7F8 5D05 C656 30BE F189 5185 2D87 348F FC4C The output should show the file's name as given in the `terraform*SHA256SUMS` file: {{< output >}} -terraform_0.11.8_linux_amd64.zip: OK +terraform_0.11.9_linux_amd64.zip: OK {{< /output >}} -### Configure Terraform Environment +### Configure the Terraform Environment -1. Unzip `terraform_*_linux_amd64.zip` to your desired working directory: +1. Unzip `terraform_*_linux_amd64.zip` to your `~/terraform` directory: unzip terraform_*_linux_amd64.zip {{< note >}} -If you recieve the error: `-bash: /usr/bin/unzip: No such file or directory`, install the `unzip` package and try again. - {{< /note >}} +If you receive an error that indicates `unzip` is missing from your system, install the `unzip` package and try again. +{{< /note >}} -1. Add your working directory to `~/.profile` so it's available to your user's PATH. Then reload the Bash profile. +1. Edit your `~./profile` to include the `~/terraform` directory in your PATH. Then, reload the Bash profile: echo 'export PATH="$PATH:$HOME/terraform"' >> ~/.profile source ~/.profile @@ -125,10 +128,7 @@ If you recieve the error: `-bash: /usr/bin/unzip: No such file or directory`, in terraform - You should see the output below: - {{< output >}} -user@terraform-example:~$ terraform Usage: terraform [-version] [-help] [args] The available commands for execution are listed below. @@ -168,26 +168,32 @@ All other commands: ## Building with the Linode Provider -Terraform can understand two types of configuration files: JSON and HashiCorp Configuration Language (HCL). This guide [used the HCL format](https://github.com/hashicorp/hcl), designated by the extension `.tf`. +Terraform uses a declarative approach in which configuration files specify the desired end-state of the infrastructure, so the examples in this guide will simply list the Linodes that we want to create. Terraform can understand two types of configuration files: JSON, and [HashiCorp Configuration Language](https://github.com/hashicorp/hcl) (HCL). This guide uses the HCL format, and HCL files end in the `.tf` extension. -1. Create the file `linode-template.tf` and add the snippet below. Fill in your Linode API key, public SSH key, and desired root password where indicated. See [Terraform's documentation](https://www.terraform.io/docs/configuration/syntax.html) for more information on configuration syntax. +1. Create the file `linode-terraform-web.tf` in your `~/terraform` directory with the snippet below. Fill in your Linode API token, public SSH key, and desired root password where indicated. - {{< file "~/terraform/linode-template.tf" aconf >}} + {{< file "~/terraform/linode-terraform-web.tf" aconf >}} provider "linode" { - token = "LINODE_API_KEY_HERE" + token = "YOUR_LINODE_API_TOKEN" } -resource "linode_instance" "terraform-example" { +resource "linode_instance" "terraform-web" { image = "linode/ubuntu18.04" - label = "Terraform-Example" + label = "Terraform-Web-Example" group = "Terraform" region = "us-east" type = "g6-standard-1" - authorized_keys = [ "PUBLIC_SSH_KEY_HERE" ] - root_pass = "ROOT_PASSWORD_HERE" + authorized_keys = [ "YOUR_PUBLIC_SSH_KEY" ] + root_pass = "YOUR_ROOT_PASSWORD" } {{< /file >}} + This snippet creates a Linode 2GB labelled `Terraform-Web-Example` in a `Terraform` Linodes group. While the server's software won't be configured in this guide, we can imagine for now that the Linode acts as a webserver. + + {{< note >}} +See [Terraform's documentation](https://www.terraform.io/docs/configuration/syntax.html) for more information on configuration syntax. +{{< /note >}} + 1. Initialize the Terraform configuration: terraform init @@ -211,18 +217,16 @@ suggested below. Terraform has been successfully initialized! {{}} -1. If an error occurs, run the command again in debug mode: - - TF_LOG=debug terraform init + {{< note >}} +If an error occurs, run the command again in debug mode: -### Provision a Single Server + TF_LOG=debug terraform init +{{< /note >}} -1. Check your Terraform plan: +1. Run Terraform's [plan](https://www.terraform.io/docs/commands/plan.html) command: terraform plan - You will see: - {{< output >}} Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be @@ -237,26 +241,26 @@ Resource actions are indicated with the following symbols: Terraform will perform the following actions: - + linode_instance.terraform-example - id: - alerts.#: + + linode_instance.terraform-web + id: <computed> + alerts.#: <computed> authorized_keys.#: "1" - authorized_keys.0: "ssh-rsa . . ." - backups.#: - backups_enabled: - boot_config_label: + authorized_keys.0: "ssh-rsa ..." + backups.#: <computed> + backups_enabled: <computed> + boot_config_label: <computed> group: "Terraform" image: "linode/ubuntu18.04" - ip_address: - ipv4.#: - ipv6: - label: "Terraform-Example" - private_ip_address: + ip_address: <computed> + ipv4.#: <computed> + ipv6: <computed> + label: "web" + private_ip_address: <computed> region: "us-east" - root_pass: - specs.#: - status: - swap_size: + root_pass: <sensitive> + specs.#: <computed> + status: <computed> + swap_size: <computed> type: "g6-standard-1" watchdog_enabled: "true" @@ -270,145 +274,126 @@ can't guarantee that exactly these actions will be performed if "terraform apply" is subsequently run. {{}} - The `terraform plan` command won't take any action or make any changes on your Linode account. Terraform uses a declarative approach in which your configuration file specifies the desired end-state of the infrastructure. When you run `terraform plan`, an analysis is done to determine which actions are required to achieve this state. + `terraform plan` won't take any action or make any changes on your Linode account. Instead, an analysis is done to determine which actions (i.e. Linode instance creations, deletions, or modifications) are required to achieve the state described in your configuration. - If you need to fix any issues, activate debug mode: + {{< note >}} +Debug mode can be applied to the plan command if you need to perform troubleshooting: - TF_LOG=debug terraform plan + TF_LOG=debug terraform plan +{{< /note >}} 1. If there are no errors, start the deployment: terraform apply - You'll be asked to confirm the action, enter `yes` and press **Enter**: + You'll be asked to confirm the action. Enter `yes` and press **Enter**: {{< output >}} -An execution plan has been generated and is shown below. -Resource actions are indicated with the following symbols: - + create - -Terraform will perform the following actions: - - + linode_instance.terraform-example - id: - alerts.#: - authorized_keys.#: "1" - authorized_keys.0: "ssh-rsa . . ." - backups.#: - backups_enabled: - boot_config_label: - group: "Terraform" - image: "linode/ubuntu18.04" - ip_address: - ipv4.#: - ipv6: - label: "Terraform-Example" - private_ip_address: - region: "us-east" - root_pass: - specs.#: - status: - swap_size: - type: "g6-standard-1" - watchdog_enabled: "true" - - -Plan: 1 to add, 0 to change, 0 to destroy. - Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. - Enter a value: + Enter a value: yes + +linode_instance.terraform-web: Creating... + alerts.#: "" => "<computed>" + authorized_keys.#: "" => "1" + authorized_keys.0: "" => "ssh-rsa ..." + backups.#: "" => "<computed>" + backups_enabled: "" => "<computed>" + boot_config_label: "" => "<computed>" + group: "" => "Terraform" + image: "" => "linode/ubuntu18.04" + ip_address: "" => "<computed>" + ipv4.#: "" => "<computed>" + ipv6: "" => "<computed>" + label: "" => "web" + private_ip_address: "" => "<computed>" + region: "" => "us-east" + root_pass: "<sensitive>" => "<sensitive>" + specs.#: "" => "<computed>" + status: "" => "<computed>" + swap_size: "" => "<computed>" + type: "" => "g6-standard-1" + watchdog_enabled: "" => "true" +linode_instance.terraform-web: Still creating... (10s elapsed) +linode_instance.terraform-web: Still creating... (20s elapsed) +linode_instance.terraform-web: Still creating... (30s elapsed) +linode_instance.terraform-web: Still creating... (40s elapsed) +linode_instance.terraform-web: Still creating... (50s elapsed) +linode_instance.terraform-web: Creation complete after 52s (ID: 10975739) + +Apply complete! Resources: 1 added, 0 changed, 0 destroyed. {{}} -1. Return to the Linode Manager. You should see the `linode-test` Linode has been added to your account. +1. Visit the Linode Manager. You should see that the `Terraform-Web-Example` Linode has been added to your account. ### Provision Additional Servers -Now imagine you need to implement a web and database server deployment in addition to the Linode created above. +In the previous step, you used Terraform to provision a Linode that could act as a webserver. To illustrate how to add another Linode via Terraform, let's say you now also need a separate database server. To do this, you can create another Terraform configuration file for the second Linode. -It's important to remember that: - -* Terraform loads into memory all files present in the working directory which have a `.tf` extension. As a result, all files are concatenated (in memory). This means you don't need to define the provider in new `.tf` files, since it was already declared in `linode-template.tf`. - -* Resources can't be duplicated, so you need to assign a unique name for each new Linode. - -* In this example the same SSH key and root password are being used. In production environments, these values should be unique for each resource. +{{< note >}} +When deploying multiple Linodes with Terraform, remember that you need to assign a unique name for each Linode. -* A new parameter `swap_size` is used to override the default value of 512Mb. You can check all available options for `terraform-provider-linode` in the plugin GitHub repository [readme.md](https://github.com/LinodeContent/terraform-provider-linode). +In production environments, your SSH key and root password should be unique for each resource. Having said that, the example Linodes in this guide will share keys and root passwords. +{{< /note >}} -1. Create another file called `linode-www.tf`. **Do not delete `linode-template.tf`**. +1. Create another file called `linode-terraform-db.tf`. Substitute in your SSH key and root password where indicated. **Do not delete** `linode-terraform-web.tf`. - {{< file "~/terraform/linode-www.tf" aconf >}} -resource "linode_instance" "terraform-www" { + {{< file "~/terraform/linode-terraform-db.tf" aconf >}} +resource "linode_instance" "terraform-db" { image = "linode/centos7" - label = "www" + label = "Terraform-Db-Example" group = "web" region = "us-south" type = "g6-standard-1" swap_size = 1024 - authorized_keys = [ "PUBLIC_SSH_KEY_HERE" ] - root_pass = "ROOT_PASSWORD_HERE" + authorized_keys = [ "YOUR_PUBLIC_SSH_KEY" ] + root_pass = "YOUR_ROOT_PASSWORD" } {{< /file >}} -1. Check your plan for errors: - - terraform plan - -1. Apply all changes: - - terraform apply - -1. Check the Linode Manager to ensure that the `www` Linode was added to your account. - - -### Provision Multiple Servers Using Variables + You may notice that the Terraform provider is not specified in this file as it was in `linode-terraform-web.tf`. Terraform loads into memory and concatenates all files present in the working directory which have a `.tf` extension. This means you don't need to define the provider again in new `.tf` files. -Up to this point, the procedure for adding a new node to your infrastructure was to create a new file and run `terraform apply`. But what happens when your planned infrastructure has dozens of servers? In this example, you will use a very simplistic version of a Terraform configuration file that uses variables. + {{< note >}} +In this configuration a new parameter, `swap_size`, is used to override the default value of 512MB. You can check all available options for the Linode Terraform provider in the plugin's GitHub repository [readme.md](https://github.com/LinodeContent/terraform-provider-linode). +{{< /note >}} -1. For the purpose of this example you will need to delete the previous nodes created above: +1. Review the Terraform plan: - terraform plan -destroy + terraform plan - That should return: + Terraform knows that your Terraform-Web-Example Linode still exists, so the plan only shows that the Terraform-Db-Example Linode would be created: {{< output >}} -Refreshing Terraform state in-memory prior to plan... -The refreshed state will be used to calculate this plan, but will not be -persisted to local or remote state storage. - -linode_instance.terraform-example: Refreshing state... (ID: 10948649) - ------------------------------------------------------------------------- - An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: - - destroy + + create Terraform will perform the following actions: - - linode_instance.terraform-example + + linode_instance.terraform-db + # [...] +Plan: 1 to add, 0 to change, 0 to destroy. -Plan: 0 to add, 0 to change, 1 to destroy. +# [...] +{{< /output >}} ------------------------------------------------------------------------- +1. Apply the configuration: -Note: You didn't specify an "-out" parameter to save this plan, so Terraform -can't guarantee that exactly these actions will be performed if -"terraform apply" is subsequently run. -{{}} + terraform apply -1. Similar to `terraform plan`, the above command checks your infrastructure before performing any changes. To destroy the Linodes, run: +1. Check the Linode Manager to ensure that the `Terraform-Db-Example` Linode was added to your account. - terraform destroy +### Destroy Servers - That should return: +Terraform includes a [destroy](https://www.terraform.io/docs/commands/destroy.html) command to remove servers managed by Terraform. Prior to running the destroy command, you can run the plan command with the `-destroy` option to see which servers would be removed: - {{< output >}} -linode_instance.terraform-example: Refreshing state... (ID: 10948649) + terraform plan -destroy + +{{< output >}} +# [...] An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: @@ -416,66 +401,69 @@ Resource actions are indicated with the following symbols: Terraform will perform the following actions: - - linode_instance.terraform-example + - linode_instance.terraform-db + - linode_instance.terraform-web -Plan: 0 to add, 0 to change, 1 to destroy. -Do you really want to destroy all resources? - Terraform will destroy all your managed infrastructure, as shown above. - There is no undo. Only 'yes' will be accepted to confirm. +Plan: 0 to add, 0 to change, 2 to destroy. - Enter a value: yes +# [...] +{{< /output >}} -linode_instance.terraform-example: Destroying... (ID: 10948649) -linode_instance.terraform-example: Still destroying... (ID: 10948649, 10s elapsed) -linode_instance.terraform-example: Still destroying... (ID: 10948649, 20s elapsed) -linode_instance.terraform-example: Destruction complete after 21s +1. Run the destroy command to remove the servers from the last section. Confirm the deletion with `yes` when prompted: -Destroy complete! Resources: 2 destroyed. -{{}} + terraform destroy -1. Verify the deletion in the Linode Manager. +1. Verify that the Linodes were removed in the Linode Manager. -1. Delete (or move to a different location) all Terraform files. +1. Remove the configuration files: rm *.tf -1. Create a new file to define variables. You can use any name but for this example use `variables.tf`: +### Provision Multiple Servers Using Variables + +Up to this point, the procedure for adding a new node to your infrastructure was to create a new file and run `terraform apply`. There are some downsides to this approach: + +- You need to repeatedly copy certain values across each file, like your SSH key. + +- If you want to change certain parameters across multiple servers, like the Linodes' `group` attribute, then you need to change each file. + +To solve these issues, Terraform allows you to declare variables and insert those variables' values into your configurations: + +1. Create a new file to define your variable names and optional default variable values. This file can have any name; for this example, use `variables.tf`: {{< file "~/terraform/variables.tf" aconf >}} variable "token" {} variable "authorized_keys" {} variable "root_pass" {} variable "region" { - default = "us-south" + default = "us-southeast" } {{< /file >}} -1. Create the file `terraform.tfvars` to store your variables. **You can't change this filename** after creating it. +1. Create the file `terraform.tfvars` to store your variables' values. Substitute in your API token, SSH key, and root password where indicated. **You cannot change this file's name** after creating it. {{< file "~/terraform/terraform.tfvars" aconf >}} -token = "LINODE_API_KEY_HERE" -authorized_keys = "PUBLIC_SSH_KEY_HERE" -root_pass ="ROOT_PASSWORD_HERE" +token = "YOUR_LINODE_API_TOKEN" +authorized_keys = "YOUR_PUBLIC_SSH_KEY" +root_pass ="YOUR_ROOT_PASSWORD" {{< /file >}} -1. Create a new configuration file called `linode-mod-template.tf`: +1. Create a new configuration file called `linode-terraform-template.tf`: - {{< file "~/terraform/linode-mod-template.tf" aconf >}} + {{< file "~/terraform/linode-terraform-template.tf" aconf >}} # Linode Provider definition - provider "linode" { token = "${var.token}" } # Example Web Server - -resource "linode_instance" "www-01" { +resource "linode_instance" "terraform-web" { image = "linode/centos7" - label = "www" - group = "web" - region = "us-south" + label = "Terraform-Web-Example" + group = "Terraform" + region = "${var.region}" type = "g6-standard-1" swap_size = 1024 authorized_keys = [ "${var.authorized_keys}" ] @@ -483,11 +471,10 @@ resource "linode_instance" "www-01" { } # Example Database Server - -resource "linode_instance" "db-01" { +resource "linode_instance" "terraform-db" { image = "linode/ubuntu18.04" - label = "database" - group = "web" + label = "Terraform-Db-Example" + group = "Terraform" region = "${var.region}" type = "g6-standard-1" swap_size = 1024 @@ -500,60 +487,53 @@ resource "linode_instance" "db-01" { terraform plan -1. Apply all changes: +1. Apply the configuration: terraform apply - The end result is the same as before. The use of variables gives Terraform great flexibility, not only to store repetitive data (like keys) but also to assign default values to any field. + The end result should be the same as before. +### Modify Live Deployments -## Modify Live Deployments - -Imagine you want to change the first server's name and size without needing to destroy and rebuild it. Simply change the values in the `.tf` file. +Terraform allows you to change a server's name, size, or other attributes without needing to destroy and rebuild it. Terraform handles this through changes to the configuration files. {{< caution >}} Changing the size of your Linode will force your server to be powered off and migrated to a different host in the same data center. The associated disk migration will take approximately 1 minute for every 3-5 gigabytes of data. See our [Resizing a Linode](/docs/platform/disk-images/resizing-a-linode/) guide for more information. {{< /caution >}} -1. Modify the `linode-mod-template.tf` and update the `type` value to `g6-standard-4` for the `db-01` resource. +1. Modify `linode-terraform-template.tf` and update the `type` value to `g6-standard-4` for the `terraform-db` resource. - {{< file "~/terraform/linode-mod-template.tf" aconf >}} -# Linode Provider definition + {{< file "~/terraform/linode-terraform-template.tf" aconf >}} +# [...] -provider "linode" { - token = "${var.token}" +resource "linode_instance" "terraform-db" { + # [...] + type = "g6-standard-4" + # [...] } +{{< /file >}} -# Example Web Server +1. Review the plan: -resource "linode_instance" "www-01" { - image = "linode/centos7" - label = "www" - group = "web" - region = "us-south" - type = "g6-standard-1" - swap_size = 1024 - authorized_keys = [ "${var.authorized_keys}" ] - root_pass = "${var.root_pass}" -} + terraform plan -# Example Database Server + {{< output >}} +# [...] -resource "linode_instance" "db-01" { - image = "linode/ubuntu18.04" - label = "database" - group = "web" - region = "${var.region}" - type = "g6-standard-4" - swap_size = 2048 - authorized_keys = [ "${var.authorized_keys}" ] - root_pass = "${var.root_pass}" -} -{{< /file >}} +An execution plan has been generated and is shown below. +Resource actions are indicated with the following symbols: + ~ update in-place -1. Check your plan: +Terraform will perform the following actions: - terraform plan + ~ linode_instance.terraform-db + type: "g6-standard-1" => "g6-standard-4" + + +Plan: 0 to add, 1 to change, 0 to destroy. + +# [...] +{{< /output >}} 1. Apply your changes: @@ -564,31 +544,29 @@ resource "linode_instance" "db-01" { ## Terraform Modules -Terraform uses a concept called *modules* to group common server requirements and configurations. Think of modules as similar to *functions* in programming languages. +Terraform uses a concept called [*modules*](https://www.terraform.io/docs/modules/index.html) to group common server requirements and configurations. Think of modules as similar to *functions* in programming languages. -Take a look at the following file structure: +As an example, let's say that you run a web agency and need to deploy identical pairs of webservers and database servers for different clients. To facilitate this, you can create a reusable Terraform module which describes the webserver and database server pairing. -![Terraform Modules Tree](terraform-modules-tree.jpg) +The module's description allows for variable substition of relevant attributes (passwords, keys, etc), just as in the configuration from the previous section. Once the module is configured, new servers can be instantiated for each of your clients by combining the module code with a new set of variable values. -There is a directory called `modules` containing the reusable code blocks (in this case `appserver`) and a `testing` directory containing the specific configuration to implement. It's a minimal layout but enough to highlight benefits. - -Create the directory structure for the module files below: +### Basic Module Structure - cd ~/terraform - mkdir -p modules/appserver - mkdir testing +The module structure is flexible, so you can use as many Terraform files as needed to describe your infrastructure. This example contains just one configuration file describing the reusable code. -### Basic Module Structure +1. Create a `modules/app-deployment/` directory to hold the module configuration: -The module structure is flexible, so you can use as many Terraform files as needed to describe your infrastructure. This example contains just one main configuration file describing the reusable code: + cd ~/terraform + mkdir -p modules/app-deployment -{{< file "~/terraform/modules/appserver/main.tf" aconf >}} -# Application Server +1. Create a `main.tf` configuration file inside `modules/app-deployment/`: -resource "linode_instance" "appserver" { + {{< file "~/terraform/modules/app-deployment/main.tf" aconf >}} +# Web Server +resource "linode_instance" "terraform-web" { image = "linode/ubuntu18.04" - label = "${var.appserver_label}" - group = "web" + label = "${var.webserver_label}" + group = "Terraform" region = "${var.region}" type = "g6-standard-1" swap_size = 1024 @@ -597,11 +575,10 @@ resource "linode_instance" "appserver" { } # Database Server - -resource "linode_instance" "dbserver" { +resource "linode_instance" "terraform-db" { image = "linode/centos7" label = "${var.dbserver_label}" - group = "web" + group = "Terraform" region = "${var.region}" type = "${var.db_type}" swap_size = 1024 @@ -610,12 +587,14 @@ resource "linode_instance" "dbserver" { } {{< /file >}} -The configuration above reproduces the previous examples using variables. The next file contains variable definitions. Assign a default value for each variable. That value will be used if you don't override it when you call the module. +1. The configuration above reproduces the previous examples using variables. The next file contains variable definitions. Assign a default value for each variable. That value will be used if you don't override it when you call the module. + + Substitute in your SSH key and root password where indicated: -{{< file "~/terraform/modules/appserver/variables.tf" aconf >}} -variable "appserver_label" { - description = "The name for the Application Server" - default = "default-app" + {{< file "~/terraform/modules/app-deployment/variables.tf" aconf >}} +variable "webserver_label" { + description = "The name for the Web Server" + default = "default-web" } variable "dbserver_label" { @@ -642,43 +621,54 @@ variable "root_pass" { description = "The default root password for the Linode server" default = "default-root-password" } - {{< /file >}} ### Working with Modules -1. Create a `main.tf` configuration file that uses the module you just created. Ensure you replace the values for `authorized_keys` and `root_pass`: +Create a deployment for an imaginary client: - {{< file "~/terraform/testing/main.tf" aconf >}} -# Newark Testing Environment Infrastructure +1. Create a `client1` directory: + + cd ~/terraform + mkdir client1 + +1. Create a `main.tf` configuration file inside `client1/` that uses your module. The module is referenced by providing the path to the module's configuration. Substitute in your API token, SSH key, and root password where indicated: + {{< file "~/terraform/testing/main.tf" aconf >}} +# Client 1 Infrastructure provider "linode" { - token = "LINODE_API_KEY_HERE" + token = "YOUR_LINODE_API_TOKEN" } -module "appserver" { - source = "../modules/appserver" +module "app-deployment" { + source = "../modules/app-deployment" # Variables Specific to this Deployment - region = "us-east" -authorized_keys = [ "PUBLIC_SSH_KEY_HERE" ] -root_pass ="ROOT_PASSWORD_HERE" +authorized_keys = [ "YOUR_PUBLIC_SSH_KEY" ] +root_pass ="YOUR_ROOT_PASSWORD" # Variables Specific to Servers - -appserver_label = "NJ-app" -dbserver_label = "NJ-db" +webserver_label = "client1-web" +dbserver_label = "client1-db" db_type = "g6-standard-8" - } {{< /file >}} -1. To use a module, call it by name with the command `module` and indicate the absolute path where it is saved. Then you can assign values to each field defined by a variable. The final result will be the same as if you pasted in all of the reusable code in the main configuration file. +1. The file structure for your module and for `client1` should now look as follows. This structure is not mandated by Terraform, but it is useful as as simple example: - cd ~/terraform/testing/ + {{< output >}} +client1 +└── main.tf +modules +└── app-deployment +    ├── main.tf +    └── variables.tf +{{< /output >}} + +1. Initiatize the Terraform configuration for the client, review the plan, and apply it: + + cd ~/terraform/client1/ terraform init terraform plan terraform apply - - The possibilities of modules are endless. You can use several modules at once, you can mix the use of modules with traditional `resource` definitions, or you can even call modules from remote sources. For more information read the [Terraform modules documentation](https://www.terraform.io/docs/modules/index.html). diff --git a/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/terraform-modules-tree.jpg b/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/terraform-modules-tree.jpg deleted file mode 100644 index a3359bcb6b5b717213f7b6d5241ec7d02f1a1128..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16934 zcmb`u2UHXJA1@jUA|N7NK*%c6MJynKn5?pZfDoyn2w7y2CL#++l#r~n(6b^%K|lng z8RNunZ6W)$MADZKgL`|f@3ymMbU@7}=ga5yvh&3tF(_x*m#cebXs z77+U!Z0&6k+qNMP+u$F>)(pZL{_lV8^Pfrn=VpMvz4aO)zZ-E20qodz2(ev$+Yb3{ zTRjLQe4Y~jb#BD}{@J#D$4-e|lDnm(W#AoJ_aU}#+p%N&&K(jGJ9ol+C&1egJLM%5 z4jw-dr<$iPg_`8 z|7K%rcfsDl&E3Nj>*ehe_(#yy;E>R;=$P1>arj%elafi(i(O!EfI;Hu*oG ze}Dcbu5E}N|NWBv*TDWSammARZQr?b$4<%r#I{dE|xBOYRl=ewiK>5m_!_q2;O*uN?e?t2&k^O%QEb;$WWdA*||06CoV$Y6k@XgyH zk3b{Da+M>k7h?MT!u(E&jn#kh1y0Y#E1O?9o%rrDdhprHu?FKv_VMtj`0APEqCb92 zG`;=Kwyv4#w~DHo?X*8ns{$gs<)raszB%--z}kOV>tJSYnG6ag9zaVA(N*l(rCLt> zpd8^30Jo;YMJvvQpK@I~xjd;pkn*E@eh=%>2k-FPvDuAP{Enj3k~*i@>cJ{utMkq5 z+hb;KkD6%1=I`#Yf*>nKNoAg!Yk5|ckS-!Kze z?ZoO73`AEc>+H{Su{oHc98m+c`>Qb$0F6~ioZ#;hF ztlDIwxriMT`o6N$_DK3zikYN^e(iY0c~ybOGv#t}xfAJjV_3@)D>g6pbcR0FA1q@S z5Oe?@XT3*Yq6Hy)izItA9eaGFry(D-=FEzgB50CgN|9Xg`9ZdFiR78=fE?beuSRr5 zR{UntWl)2!{vL0 z)#+ZB-s4Zwu?Li1 z>O>xVoMEK>>*EZ4#Q)3Ku}R@OOb~a5kN{`WjKexV1&RbCx#Yw$K2?7Q^TGI93JdFzi@mu^>;6cork^%k8L6HaKx#3 z{w-t^SzJe-siU7=;%eL~2#k-v`{qzX-t{tRKv-O8c==mrs54>Ir9~-EA>+P{p?l>+ zs$RzR@5K}WU)R#+O|RjQkImuA#ltVF%}riSa`l7?8>;gHE%Dr{OwcJfm<#mae8c*i`r@fa{|x z_(SQD)XFlC(JqgL$mvD?^-ac9)Q`{9kkj$}!gbXn#bMPaqFe0*|MWVHesXn~+Z_Gu;NT*!{n2E?xyGfTS;uPoxIYTN4OaI@;Q#($$Jc5s7b-#Hyg{wEIhT||R1sPN*c|aryf$t)M%J9E{)Acsk$Zer{k2|>wL0Pnaa5lb z`>L?p57~+A7G%DUZdJpK*;h){ie>4&U~Y}EsU}fIW~M$oBG4hi*LjRPx*6|#i<9Xw z${BB&J?WXl*l@gNrg@67>2f{7_;cnQIt-mkJSe(P55Z;8n-AdRW2yU>NX^tfWV*l1 zu-O!c2C!1ZogC6WYO0AavI=sFoxM5F=x9$X2cBl1<+8(mrhJTAVh2^SUwvCDXf_!c z8Vuz$P5Ud*)SR>Qv0gVToZSjeN|Y=#@40%^Ff1kyfDRCmQr0u0gb|i!l1I}>&j=+6 zr(f$sGg8DT8pa0W6h4j?WiWUrR0{)|zJI(?Gk%0A>!y`&`7FyPnxd;cJ?6hz9;&4Y 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 literal 0 HcmV?d00001 diff --git a/docs/platform/api/getting-started-with-the-linode-api-new-manager/get-started-with-linode-api-my-profile.png b/docs/platform/api/getting-started-with-the-linode-api-new-manager/get-started-with-linode-api-my-profile.png new file mode 100644 index 0000000000000000000000000000000000000000..bacfcfa4c691c80892d1d257e1b88908d61038ad GIT binary patch literal 26455 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%0D_?f0@{Rp&gc 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 Q-)_)U6*Uw}?wI@k7e}3XCjbBd literal 0 HcmV?d00001 diff --git a/docs/platform/api/getting-started-with-the-linode-api-new-manager/get-started-with-linode-api-new-token.png b/docs/platform/api/getting-started-with-the-linode-api-new-manager/get-started-with-linode-api-new-token.png new file mode 100644 index 0000000000000000000000000000000000000000..d5394fdfd272187220da45395f83ecec3fc72bf9 GIT binary patch literal 27192 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 literal 0 HcmV?d00001 diff --git a/docs/platform/api/getting-started-with-the-linode-api-new-manager/get-started-with-linode-api-select-my-profile.png b/docs/platform/api/getting-started-with-the-linode-api-new-manager/get-started-with-linode-api-select-my-profile.png new file mode 100644 index 0000000000000000000000000000000000000000..a18cf85de3432a68af4401ad907973f8dd6d8ef3 GIT binary patch literal 9543 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 +If you are building an application which will need to authenticate multiple users (for example, a custom interface to Linode's infrastructure for your organization), you can set up an [OAuth authentication flow](https://developers.linode.com/v4/access) to generate tokens for each user. +{{< /note >}} + +### Create an API Token + +1. Log in to the Manager and select the **API Tokens** tab from the **My Profile** menu: + + ![Select My Profile.](get-started-with-linode-api-select-my-profile.png "Select My Profile.") + + ![Select API Tokens tab in My Profile Settings.](get-started-with-linode-api-my-profile-small.png "Select the API Tokens tab in My Profile Settings.") + +2. Click on **Add a Personal Access Token** and choose the access rights you want users authenticated with the new token to have. Privileges are cascading, so a token with *Create* access will also have *Modify* and *View* access. + + ![Add a Personal Access Token](get-started-with-linode-api-new-token.png "Add a Personal Access Token") + + When you have finished, click **Submit** to generate an API token string. Copy the token and save it in a secure location. **You will not be able to view the token through the Manager after closing the popup.** + +### Authenticate Requests + +This token must be sent as a header on all requests to authenticated endpoints. The header should use the format: + + Authorization: Bearer + +Store the token as a temporary shell variable to simplify repeated requests. Replace `` in this example: + + TOKEN= + +## Get Configuration Parameters + +Specify the type, region, and image for the new Linode. + +1. Review the list of available images: + + curl https://api.linode.com/v4/images/ + + Choose one of the images from the resulting list and make a note of the `id` field. + +1. Repeat this procedure to choose a type: + + curl https://api.linode.com/v4/linode/types/ + +1. Choose a region: + + curl https://api.linode.com/v4/regions + +## Build the Final Query + +Replace the values in the command below with your chosen type, region, and image, and choose a label and secure password. + + curl -X POST https://api.linode.com/v4/linode/instances \ + -H "Authorization: Bearer $TOKEN" -H "Content-type: application/json" \ + -d '{"type": "g5-standard-2", "region": "us-east", "image": "linode/debian9", "root_pass": "root_password", "label": "prod-1"}' + +## Advanced Query Options + +### Pagination + +If a results list contains more than 100 items, the response will be split into multiple pages. Each response will include the total number of pages and the current page. To view additional pages, add a `page` parameter to the end of the URL. For example, querying the available kernels produces more than 200 results: + + curl https://api.linode.com/v4/linode/kernels + + + {{< highlight json "linenos=table,hl_lines=2 25" >}} +{ + "results": 214, + "page": 1, + "data": [ + { + "kvm": false, + "architecture": "i386", + "version": "2.6.28", + "xen": true, + "label": "2.6.28.3-linode17", + "id": "linode/2.6.28.3-linode17", + "pvops": true + }, + { + "kvm": false, + "architecture": "i386", + "version": "2.6.18", + "xen": true, + "label": "2.6.18.8-linode16", + "id": "linode/2.6.18.8-linode16", + "pvops": false + }, + ] + ... + "pages": 3 +} +{{< /highlight >}} + +The `pages` field indicates that the results are divided into three pages. View the second page: + + curl https://api.linode.com/v4/linode/kernels?page=2 + +If you prefer a smaller number of items per page, you can override the default value with the `page_size` parameter: + + curl https://api.linode.com/v4/linode/kernels?page_size=50 + +### Filter Results + +The API also supports filtering lists of results. Filters are passed using the `X-Filter` header and use JSON format. You can filter on almost any field that appears in a response object and the [API documentation](https://developers.linode.com/v4/introduction) specifies which fields are filterable. + +The following query uses the `deprecated` and `vendor` fields to return all current Debian images: + + curl https://api.linode.com/v4/images/ -H 'X-Filter: { "vendor": "Debian", "deprecated": false}' + + {{< highlight json "linenos=table" >}} +{ + "page": 1, + "pages": 1, + "data": [ + { + "size": 1024, + "type": "manual", + "label": "Debian 8", + "created_by": "linode", + "vendor": "Debian", + "is_public": true, + "created": "2015-04-27T20:26:41", + "deprecated": false, + "id": "linode/debian8", + "description": "" + }, + { + "size": 1100, + "type": "manual", + "label": "Debian 9", + "created_by": "linode", + "vendor": "Debian", + "is_public": true, + "created": "2017-06-16T20:02:29", + "deprecated": false, + "id": "linode/debian9", + "description": null + } + ], + "results": 2 +} +{{< /highlight >}} + +More complex searches are possible through the use of logical operators. Use `or` to return a list of all Debian and Ubuntu images: + + curl https://api.linode.com/v4/images/ -H "{"+or": [{"vendor":"Debian"}, {"vendor":"Ubuntu"}]}" + +See the [Linode API documentation](https://developers.linode.com/v4/filtering) for a full list of supported operators. From 08542828825f56d34083ed841b02932e12cb96a1 Mon Sep 17 00:00:00 2001 From: leslitagordita Date: Sat, 20 Oct 2018 10:10:05 -0400 Subject: [PATCH 5/6] Remove trailing whitespace --- .../index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md b/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md index 78305400cdd..fd30b80fbfc 100644 --- a/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md +++ b/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md @@ -546,7 +546,7 @@ Plan: 0 to add, 1 to change, 0 to destroy. Terraform uses a concept called [*modules*](https://www.terraform.io/docs/modules/index.html) to group common server requirements and configurations. Think of modules as similar to *functions* in programming languages. -As an example, let's say that you run a web agency and need to deploy identical pairs of webservers and database servers for different clients. To facilitate this, you can create a reusable Terraform module which describes the webserver and database server pairing. +As an example, let's say that you run a web agency and need to deploy identical pairs of webservers and database servers for different clients. To facilitate this, you can create a reusable Terraform module which describes the webserver and database server pairing. The module's description allows for variable substition of relevant attributes (passwords, keys, etc), just as in the configuration from the previous section. Once the module is configured, new servers can be instantiated for each of your clients by combining the module code with a new set of variable values. From 685950c9c332fe3be6bc45408efb8fe0d14880c4 Mon Sep 17 00:00:00 2001 From: nmelehan Date: Sat, 20 Oct 2018 14:11:00 -0400 Subject: [PATCH 6/6] Fixing Linode group label (minor fix) --- .../index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md b/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md index 78305400cdd..d96d3f303fd 100644 --- a/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md +++ b/docs/applications/configuration-management/how-to-build-your-infrastructure-using-terraform-and-linode/index.md @@ -344,7 +344,7 @@ In production environments, your SSH key and root password should be unique for resource "linode_instance" "terraform-db" { image = "linode/centos7" label = "Terraform-Db-Example" - group = "web" + group = "Terraform" region = "us-south" type = "g6-standard-1" swap_size = 1024