хуйу нас не матерятся
Я таки добрался до девопса, и первым делом мне нужно разобраться с терраформом. Если Вы ещё не знаете, terraform - эта такая хреновина которая может управлять облачными сервисами. Нужно всего лишь написать текстовый конфиг и она сама пойдёт по апи на нужный cloud сервис и поднимет/прибьёт нужные виртуалки.
Для теста я решил использовать свой старый digitalocean аккаунт, который уже долго стоит без дела. И так, поехали.
Внезапно, это самая простая установка софта на линупсы за всю мою жизнь, просто скачиваем с офф сайта архив, распаковываем единственный файл куда-нить и всё, готово.
Для теста я скопипастил терраформ в отдельную папочку, давайте назовём её "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 переменную, то всё должно пройти хорошо, терраформ скачает ДО плагин и скажет, что всё ок:
Минимальная конфигурация для нашей виртуалки будет примерно такая:
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
И если мы не прокосячились с ссх ключами, то через пару минут всё должно успешно отработать:
Не все плагины терраформа умеют апгрейдить ресурсы, некоторые только удаляют/создают, остарожно!
Так же, хоть терраформ умеет выполнять скрипты, с помощью которых можно автоматом накотить какой-то софт или сконфигурировать что-то, тот же фаервол, он не заменит ансибл.