Использование Terraform в Облаке КРОК
С недавнего времени в Облаке КРОК появилась поддержка Terraform – средства декларативного управления вашей виртуальной инфраструктурой. Terraform позволяет безопасно и предсказуемо создавать, изменять и улучшать вашу инфраструктуру.
Terraform избавляет от вас необходимость напрямую использовать API-интерфейсы не только Облака КРОК, но и AWS, Google Cloud, Azure или DigitalOcean, давая вам возможность использовать декларативные конфигурационные файлы, в которые могут использоваться всеми членами вашей команды разработки или эксплуатации. Другими словами, описание вашей инфраструктуры может изменяться и версионироваться так же, как и программное обеспечение, которое работает поверх нее.
Вся суть работы с Terraform сводится к тому, чтобы:
- Описать инфраструктуру, которая должна быть развернута
- Просмотреть запланированные изменения относительно ее предыдущей версии
- Внести необходимые изменения одной командой
При этом описанная вами инфраструктура каждый раз будет развернута совершенно одинаково, и это не зависит от того, где именно вы ее разворачиваете: в облаке КРОК, AWS, Google, Azure, DigitalOcean, платформах виртуализации таких как OpenStack, VMware или же непосредственно на железе.
Установка Terraform
Скачайте последнюю поддерживаемую версию Terraform (на момент написания статьи это версия v0.7.13): Скачать Terraform.
Распакуйте архив и положите исполняемый файл в любую удобную вам директорию, например, ~/bin/ (я кладу ПО, распространяющееся в виде уже скомпилированных исполняемых файлов в эту директорию). В моем случае:
$ mkdir -p ~/bin
$ unzip ~/Downloads/linux_amd64.zip -d ~/bin
Добавьте эту директорию в переменную окружения PATH, что иметь возможность выполнять команду Terraform без указания пути до нее: vi ~/.bash_profile:
export PATH=$PATH:~/bin
Выполните следующую команду для обновления сессии терминала:
$ source ~/.bash_profile
Для того чтобы проверить инсталляцию Terraform, выполните следующую команду и убедитесь, что ваш вывод совпадает с продемонстрированым:
$ terraform --version
Terraform v0.7.13
Если вывод совпадает,значит, вы правильно установили Terraform. Если что-то не так, вернитесь
на шаг назад и попробуйте установить его еще раз. Также вы можете задать ваш
вопрос в обсуждении этой статьи, и мы обязательно вам поможем.
Создание директории проекта
Первый шаг к созданию вашей инфраструктуры при помощи Terraform — это создание директории проекта, в которой будут храниться файлы конфигурации. Имя директории не имеет значения, поэтому мы будем использовать «croc_terraform_example» для примера (вы можете изменить свое название):
$ mkdir ~/croc_terraform_example
$ cd ~/croc_terraform_example
Конфигурационные файлы Terraform — это текстовые файлы, заканчивающиеся на
.tf
. Они человекочитаемы и поддерживаюсь
комментарии. Terraform также
поддерживает JSON-формат конфигурационных файлов, но мы не будем
использовать их в этом примере. В процессе своей работы Terraform будет каждый
раз прочитывать все конфигурационные файлы в вашей рабочей директории,
поэтому порядок ресурсов и определенных переменных не имеет никакого
значения. Вся ваша инфраструктура может быть описана и в одном большом длинном
файле, но в этом примере мы разобьем конфигурационные файлы по типу описываемых
в них ресурсов.Если что-то идет не так
Если что-то идет не так, и Terraform не работает так, как ожидается, вы всегда можете начать заново, предварительно удалив файл terraform.tfstate
и в ручную удалив созданные ресурсы.
Также вам может потребоваться вывод отладочной информации на экран, чтобы видеть, что Terraform пытается сделать. Включите вывод отладочной информации следующим образом:
$ export TF_LOG=1
Создание конфигурации провайдера
Terraform поддерживает множество провайдеров услуг при помощи описания «providers». Так как Облако КРОК ориентируется на AWS API, то мы будем использовать далее именно провайдера для AWS. Давайте настроим его.
Создайте файл с именем provider.tf:
$ vi provider.tf
Добавьте в этот файл следующие строки:
variable «c2_access_key» {}
variable «c2_secret_key» {}
provider «aws» {
endpoints {
ec2 = «https://api.cloud.croc.ru:443/»
s3 = «https://storage.cloud.croc.ru:443» // ВНИМАНИЕ: пока не поддерживается
}
skip_credentials_validation = true
skip_requesting_account_id = true
access_key = «${var.c2_access_key}»
secret_key = «${var.c2_secret_key}»
region = «us-east-1» // регион в Облаке КРОК не имеет значения, но т.к. для работы с AWS он требуется, нужно указать любой существующий AWS-регион
}
В этом файле определяется провайдер подключения к Облаку КРОК, а также две переменные, предназначенные для передачи ключей доступа для обращения к API Облака. Ключи доступа можно получить перейдя в «Настройки» вашей Консоли управления и кликнув на «Получить настройки для доступа по API». Настройки доступа будут скачаны в виде файла c2rc.sh, который необходимо положить в директорию с проектом.
Измените значение переменной C2_PROJECT в файле c2rc.sh. Она должна содержать название вашего проекта.
Примените в ваше окружение переменные, определенные в c2rc.sh:
$ source c2rc.sh
Проверим, что Terraform может подключиться к Облаку, запустив команду terraform plan со следующими аргументами:
$ terraform plan -var «c2_access_key=${AWS_ACCESS_KEY_ID}» -var «c2_secret_key=${AWS_SECRET_ACCESS_KEY}»
При запуске команды terraform plan (показать какие изменения Terraform должен сделать с инфраструктурой, определенной в конфигурационных файлах) при помощи ключа -var мы определяем переменные c2_access_key и c2_secret_key при помощи переменных окружения AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY, заданных из файла c2rc.sh на прошлом шаге.
Виртуальные частные облака (VPC)
С недавних пор в Облаке КРОК как и в AWS отказались от использования общего маршрутизируемого адресного пространства в Облаке, оставив пользователям возможность запускать свои виртуальные инфраструктуры только внутри изолированных сетевых сегментов (VPC). То есть для того, чтобы иметь возможность развернуть свою инфраструктуру, пользователь сначала должен создать и запустить в своей учетной записи VPC.
Для того, чтобы определить VPC в вашей виртуальной инфраструктуре, в которой будут располагаться виртуальные машины, в директории ~/croc_terraform_example создайте файл example_vpc.tf и следующего содержания:
resource «aws_vpc» «example_vpc» {
cidr_block = «192.168.0.0/16»
}
resource «aws_subnet» «external_subnet» {
vpc_id = «${aws_vpc.example_vpc.id}»
cidr_block = «192.168.1.0/24»
}
Первый блок содержит описание Виртуального Частного Облака (VPC), в котором Terraform создаст Виртуальную сеть, определенную во втором блоке. Общее адресное пространство для VPC задано в переменной cidr_block
в ресурсе aws_vpc
с именем example_vpc
. Адресное пространство Виртуальной сети задается по аналогии в блоке aws_subnet
.
Правила фаервола
Для того, чтобы для определенной нами Виртуальной сети задать правила фаервола, необходимо описать ресурсы aws_security_group_rule. В качестве примера приведу определение ресурса, разрешающего SSH подключения к виртуальным машинам. Делается это вот так:
resource «aws_security_group_rule» «ssh_access» {
type = «ingress»
from_port = 22
to_port = 22
protocol = «tcp»
cidr_blocks = [«0.0.0.0/0»]
security_group_id = «${aws_subnet.external_subnet.id}»
}
Т.е. в ресурсе aws_security_group_rule с именем ssh_access определено следующее правило:
type = «ingress»
— правило для входящего трафикаfrom_port = 22
— начальный порт диапазона портов, на которые будут разрешены подключенияto_port = 22
— конечный порт диапазонаprotocol = «tcp»
— правило для TCP протоколаcidr_blocks = [«0.0.0.0/0»]
— адреса с которых разрешены подключенияsecurity_group_id = «${aws_subnet.external_subnet.id}»
— ID определенной выше виртуальной сети
Виртуальная машина
Для завершения примера давайте определим в нашей виртуальной сети запуск хотя бы одной виртуальной машины:
resource «aws_instance» «coreos-1» {
ami = «cmi-11CCE5BA»
instance_type = «m1.large»
subnet_id = «${aws_subnet.external_subnet.id}»
depends_on = [«aws_subnet.external_subnet»]
monitoring = true
key_name = «Lenovo-T410»
}
В данном примере при помощи ресурса aws_instance с именем coreos-1 я запускаю виртуальную машину с ОС CoreOS из собственного шаблона со следующими параметрами:
- ami = «cmi-11CCE5BA» — ID Шаблона Виртуальной машины
- instance_type = «m1.large» — размер виртуальной машины
- subnet_id = «${aws_subnet.external_subnet.id}» — подключить виртуальную машину к сети external_subnet
- depends_on = [«aws_subnet.external_subnet»] — создавать и изменять этот ресурс после того,
как изменена или создана виртуальная сеть external_subnet - monitoring = true — включить Мониторинг виртуальной машины
- key_name = «Lenovo-T410» — имя вашего публичного SSH-ключа, используемого в Web-интерфейсе Консоли управления Облаком
Автоматическое создание инфаструктуры
В результате наших с вами совместных действий получился небольшой проект:
$ tree croc_terraform_example
croc_terraform_example
├── c2rc.sh
├── example_vpc.tf
├── provider.tf
Содержание example_vpc.tf:
variable "c2_access_key" {}
variable "c2_secret_key" {}
provider "aws" {
endpoints {
ec2 = "https://api.cloud.croc.ru:443/"
s3 = "https://storage.cloud.croc.ru:443"
}
skip_credentials_validation = true
skip_requesting_account_id = true
access_key = "${var.c2_access_key}"
secret_key = "${var.c2_secret_key}"
region = "us-east-1"
}
Содержание example_vpc.tf:
resource "aws_vpc" "example_vpc" {
cidr_block = "192.168.0.0/16"
}
resource "aws_subnet" "external_subnet" {
vpc_id = "${aws_vpc.example_vpc.id}"
cidr_block = "192.168.1.0/24"
}
resource "aws_security_group_rule" "ssh_access" {
type = "ingress"
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
security_group_id = "${aws_subnet.external_subnet.id}"
}
resource "aws_instance" "coreos-1" {
ami = "cmi-11CCE5BA"
instance_type = "m1.large"
subnet_id = "${aws_subnet.external_subnet.id}"
depends_on = ["aws_subnet.external_subnet"]
monitoring = true
key_name = "Lenovo-T410"
}
Для того, чтобы посмотреть на планируемые изменения, выполните команду:
terraform plan -var "c2_access_key=${AWS_ACCESS_KEY_ID}" -var "c2_secret_key=${AWS_SECRET_ACCESS_KEY}"
Посмотреть взаимосвязи описанных вами ресурсов и переменных можно при помощи следующих команд:
terraform graph | dot -Tpng > graph.png
open graph.png
Утилита dot входит в состав библиотеки GraphViz.
Чтобы применить изменения и создать инфраструктуру, выполните:
terraform apply -var "c2_access_key=${AWS_ACCESS_KEY_ID}" -var "c2_secret_key=${AWS_SECRET_ACCESS_KEY}"
Чтобы полностью удалить инфраструктуру:
terraform destroy -var "c2_access_key=${AWS_ACCESS_KEY_ID}" -var "c2_secret_key=${AWS_SECRET_ACCESS_KEY}"
Заключение
Terraform представляет собой чрезвычайно мощный инструмент, предназначенный для декларативного создания, изменения и удаления вашей инфраструктуры в различных облачных средах. В этой статье мы создали очень простую инфраструктуру, состоящую из VPC, Виртуальной сети, правила фаервола и виртуальной машины. В следующей статье я покажу как при помощи Terraform создать отказоустойчивый кластер CoreOS, развернуть поверх него Docker Swarm, а следом запустить в контейнерах отказоустойчивую инсталляцию MySQL (Active-Active), к которой мы подключим масштабируемый бекенд с WordPress.
Более того, созданная вами в следующей статье архитектура, позволит вам не только развернуть отказоустойчивое LAMP Web-приложение у любого облачного провайдера, но и чрезвычайно просто и в считанные мгновения смигрировать его в любое другое Облако или Датацентр при необходимости!
Подписывайтесь на обновления! Впереди масса всего интересного!