вторник, 17 апреля 2018 г.

Использование Terraform для управления инфраструктурой Google Cloud Platform

Terraform — это инструмент, с помощью которого можно описать серверную инфраструктуру в виде кода.
К примеру для создания определенного количества виртуальных машин и других объектов в облачной инфраструктуре не нужно каждый раз вручную создавать инстансы или писать плейбуки для Ansible или какие-то обертки над API, достаточно просто в человекочитаемом виде записать как будет представлена инфраструктура и в случае чего ее можно легко развернуть.

В заметке я опишу, как с помощью Terraform можно создать инстанс в Google Compute Engine.
Документация доступна тут.

Terraform распространяется в виде бинарного файла, поэтому проблем с его установкой нет никаких:
# apt install wget unzip -y
# wget https://releases.hashicorp.com/terraform/0.11.7/terraform_0.11.7_linux_amd64.zip
# unzip terraform_0.11.7_linux_amd64.zip && rm -f terraform_0.11.7_linux_amd64.zip
# mv terraform /usr/local/bin/
# terraform -v

Terraform установили, далее создаем сервисный акканут в Google Cloud Platform в разделе IAM с ролью Compute Admin, сохраняем сгенерированный приватный ключ в формате json на сервер, например в файл .tf-gcp-account.json

Создаем описание доступов и переменных для гуглового проекта:
# vim provider.tf 
variable "project_name" {
   default = "project-name" # gcloud projects list
}

variable "region" {
  default = "europe-west1-d" # gcloud compute zones list
}

provider "google" {
   credentials = "${file(".tf-gcp-account.json")}"
   project = "${var.project_name}"
   region = "${var.region}"
}

В этом файле создаем описание нашего инстанса:
# vim compute.tf 
resource "google_compute_instance" "k8s-master" {
   name = "k8s-master"
   machine_type = "n1-standard-1" # gcloud compute machine-types list
   zone = "${var.region}"
   boot_disk {
      initialize_params {
         image = "ubuntu-1604-xenial-v20180405" # gcloud compute images list
         size = "30"
      }
   }
   network_interface {
      network = "default"
      access_config {}
   }
}

В этом конфиге мы описали, что необходимо создать виртуалку с именем k8s-master в зоне europe-west1-d, на основе образа ubuntu-16.04 с диском размером 30GB.

Инициализируем Terraform:
# terraform init

Перед тем как создавать инстанс, проверим все ли в порядке на предмет ошибок:
# terraform plan

Если все в порядке, то применяем конфигурацию:
# terraform apply
...
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Проверим, создался ли наш инстанс:
# gcloud compute instances list --filter=k8s
NAME        ZONE            MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
k8s-master  europe-west1-d  n1-standard-1               10.240.0.5   35.195.82.203  RUNNING

Далее мы можем например по SSH подключиться к созданному инстансу:
# gcloud compute ssh k8s-master

Для того чтобы удалить инстанс есть команда destroy:
# terraform destroy
Destroy complete! Resources: 1 destroyed.

# gcloud compute instances list --filter=k8s
Listed 0 items.

Вот таким образом можно описать создание необходимой инфраструктуры в виде кода, что является очень удобным нежели чем городить мануалы по созданию серверов в облаке.

1 комментарий:

Анонимный комментирует...

Лучше при создании provider.tf назвать переменную "project_id", так как используется именно ID проекта, а не его название.