Изучаем terraform

Я таки добрался до девопса, и первым делом мне нужно разобраться с терраформом. Если Вы ещё не знаете, terraform - эта такая хреновина которая может управлять облачными сервисами. Нужно всего лишь написать текстовый конфиг и она сама пойдёт по апи на нужный cloud сервис и поднимет/прибьёт нужные виртуалки.

Для теста я решил использовать свой старый digitalocean аккаунт, который уже долго стоит без дела. И так, поехали.

Установка terraform

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

Для теста я скопипастил терраформ в отдельную папочку, давайте назовём её "my_do_terraform". В ней же, нужно создать main.tf в котором будем описывать конфигурацию:

Настройка доступа

Нам нужно создать ключ, который автоматом будет раскидываться на каждый сервер, и с помощью которого мы будем подключаться по ssh:

ssh-keygen -f ~/.ssh/my_do_terraform

Этот ключ нужно добавить в настройках аккаунта на digitalocean:

Обратите внимание на Fingerprint, он нам понадобится дальше.

И ещё нужно создать апи ключ, не забудьте его сразу куда-нибудь сохранить, дальше его нигде нельзя будет подсмотреть, только заново перегенерировать:

И вот только теперь мы можем сделать самую базовую конфигурацию, открываем наш main.ts и фигачим:
variable "do_token" {
  type = string
  default = "asdasdasdasdasd"
}
variable "pub_key" {
  type = string
  default = "~/.ssh/my_do_terraform.pub"
}
variable "pvt_key" {
  type = string
  default = "~/.ssh/my_do_terraform"
}
variable "ssh_fingerprint" {
  type = string
  default = "91:1d:f8:7c:27:82:e5:fe:63:97:53:c8:01:a7:5c:06"
}

provider "digitalocean" {
  token = "${var.do_token}"
}
Сохраняем, и выполняем:
./terraform init

Если Вы не забыли указать правильный апи токен в do_token переменную, то всё должно пройти хорошо, терраформ скачает ДО плагин и скажет, что всё ок:

Создаём сервер с помощью terraform

Минимальная конфигурация для нашей виртуалки будет примерно такая:

resource "digitalocean_droplet" "terra_test_1" {
  image = "ubuntu-18-04-x64"
  name = "terra-1"
  region = "fra1"
  size = "s-1vcpu-1gb"
  ssh_keys = [
    "${var.ssh_fingerprint}"
  ]
}
Выполняем:
./terraform plan

И получаем:

Но обычно, после того, как сервер поднялся, мы делаем ещё какие-то стандартные телодвижения, обновляем систему, ставим какой-то базовый софт итд. Для этого нужно заюзать provisioner "remote-exec":

resource "digitalocean_droplet" "terra_test_1" {
  image = "ubuntu-18-04-x64"
  name = "terra-1"
  region = "fra1"
  size = "s-1vcpu-1gb"
  ipv6 = true
  private_networking = true
  ssh_keys = [
    "${var.ssh_fingerprint}"
  ]

  provisioner "remote-exec" {
    connection { # Настройка подключения по ссх
      user = "root"
      type = "ssh"
      private_key = "${file(var.pvt_key)}"
      timeout = "2m"
      host = "${digitalocean_droplet.terra_test_1.ipv4_address}"
    }
  
    inline = [ # массив с командами, которые выполнятся, когда поднимится сервер
      "export PATH=$PATH:/usr/bin",
      "sudo apt-get update",
      "sudo apt-get -y install nginx"
    ]
  }
}

Обратите внимание, что у меня указано:

host = "${digitalocean_droplet.terra_test_1.ipv4_address}"

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

Ещё раз запускаем:

./terraform plan

Вывод должен быть таким же как и в прошлый раз, если так, выполняем:

./terraform apply

И если мы не прокосячились с ссх ключами, то через пару минут всё должно успешно отработать:

Пара мыслей в дополнение

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




(0) Комментариев