Урок 1-2: Основы Terraform и установка
Что такое Terraform?
Terraform — это open-source инструмент для создания инфраструктуры через код (Infrastructure as Code - IaC), разработанный компанией HashiCorp.
Основные характеристики
| Параметр | Описание |
|---|---|
| Язык | HCL (HashiCorp Configuration Language) |
| Файлы | .tf расширение (обычные текстовые файлы) |
| Компиляция | Не требуется, интерпретируется напрямую |
| ОС | Windows, macOS, Linux |
| Лицензия | Open Source (BSL) |
| Первая версия | 2014 год |
Преимущества Terraform
- ✅ Infrastructure as Code — вся инфраструктура описывается в коде
- ✅ Версионирование — отслеживание изменений через Git
- ✅ Повторяемость — одинаковые развертывания каждый раз
- ✅ Модульность — переиспользование кода через модули
- ✅ Multi-cloud — поддержка AWS, GCP, Azure, Яндекс.Облако и других
- ✅ Plan & Apply — предварительный просмотр изменений
- ✅ State Management — отслеживание состояния инфраструктуры
Поддерживаемые платформы
| Облако | Поддержка | Примечание |
|---|---|---|
| AWS | ✅ Полная | Самая популярная |
| GCP | ✅ Полная | Google Cloud |
| Azure | ✅ Полная | Microsoft Azure |
| Yandex Cloud | ✅ Полная | Яндекс.Облако |
| Alibaba Cloud | ✅ Полная | Alibaba Cloud |
| DigitalOcean | ✅ Полная | Хостинг |
| Kubernetes | ✅ Полная | Оркестрация контейнеров |
| GitHub | ✅ Полная | Управление репозиториями |
| Другие | ✅ 100+ | Всего поддерживается 100+ провайдеров |
Синтаксис Terraform
Пример: Создание статического IP адреса на AWS
resource "aws_eip" "example" {
instance = aws_instance.web.id
domain = "vpc"
tags = {
Name = "example-eip"
}
# Чтобы установить порядок создания, укажите явную зависимость
depends_on = [aws_internet_gateway.example]
}
Структура:
- resource — тип объявления (ресурс)
- "aws_eip" — тип ресурса (провайдер_название)
- "example" — имя ресурса в коде (может быть любым)
- {} — параметры ресурса (обязательные и опциональные)
Пример: То же самое для GCP
resource "google_compute_address" "example" {
name = "my-static-ip"
}
Пример: То же самое для Azure
resource "azurerm_public_ip" "example" {
name = "example-pip"
location = azurerm_resource_group.example.location
resource_group_name = azurerm_resource_group.example.name
allocation_method = "Static"
}
Альтернативы Terraform
| Инструмент | Описание | Минусы |
|---|---|---|
| Ansible | Configuration Management | Больше для конфигурации, чем для инфраструктуры |
| CloudFormation | AWS только | Только для AWS |
| Pulumi | Программные языки | Более сложно |
| Chef | Конфигурация серверов | Не для инфраструктуры |
| Puppet | Управление конфигурацией | Не специализирован на IaC |
Установка Terraform
Windows
Способ 1: Ручная загрузка
# 1. Перейти на https://www.terraform.io/downloads.html
# 2. Скачать Windows (64-bit или 32-bit)
# 3. Распаковать архив
# 4. terraform.exe скопировать в папку (например, C:\terraform)
# 5. Добавить в PATH
Способ 2: Через Chocolatey
choco install terraform
Способ 3: Через Scoop
scoop install terraform
Проверка установки
terraform version
Ожидаемый результат:
Terraform v1.5.0
on windows_amd64
Linux
Ubuntu/Debian
# Добавить ключ GPG
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
# Добавить репозиторий
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
# Установить
sudo apt update && sudo apt install terraform
CentOS/RHEL
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install terraform
Проверка
terraform version
macOS
Через Homebrew
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
Проверка
terraform version
Основные команды Terraform
# Проверка синтаксиса
terraform fmt
# Инициализация рабочей директории
terraform init
# Валидация конфигурации
terraform validate
# Просмотр плана изменений
terraform plan
# Применение конфигурации
terraform apply
# Уничтожение инфраструктуры
terraform destroy
# Просмотр текущего состояния
terraform show
# Форматирование кода
terraform fmt
Структура файлов Terraform проекта
my-terraform-project/
├── main.tf # Основные ресурсы
├── variables.tf # Объявление переменных
├── outputs.tf # Объявление выходов
├── terraform.tfvars # Значения переменных
├── provider.tf # Конфигурация провайдеров
├── .gitignore # Файлы для игнорирования Git
└── modules/ # Переиспользуемые модули
└── vpc/
├── main.tf
├── variables.tf
└── outputs.tf
Пример: Первый проект на Terraform
Файл: provider.tf
terraform {
required_version = ">= 1.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "us-west-2"
}
Файл: main.tf
# Создание VPC
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
enable_dns_support = true
tags = {
Name = "main-vpc"
}
}
# Создание подсети
resource "aws_subnet" "main" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "us-west-2a"
tags = {
Name = "main-subnet"
}
}
# Создание Security Group
resource "aws_security_group" "web" {
name = "web-sg"
description = "Allow HTTP and HTTPS"
vpc_id = aws_vpc.main.id
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "web-sg"
}
}
# Создание EC2 инстанса
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0" # Amazon Linux 2
instance_type = "t2.micro"
subnet_id = aws_subnet.main.id
vpc_security_group_ids = [aws_security_group.web.id]
tags = {
Name = "web-server"
}
}
Файл: variables.tf
variable "region" {
description = "AWS region"
type = string
default = "us-west-2"
}
variable "instance_type" {
description = "EC2 instance type"
type = string
default = "t2.micro"
}
Файл: outputs.tf
output "vpc_id" {
description = "ID of VPC"
value = aws_vpc.main.id
}
output "instance_id" {
description = "ID of the EC2 instance"
value = aws_instance.web.id
}
output "instance_public_ip" {
description = "Public IP of the EC2 instance"
value = aws_instance.web.public_ip
}
Использование
# Инициализация
terraform init
# Просмотр плана
terraform plan
# Применение конфигурации
terraform apply
# Просмотр выходов
terraform output
# Удаление инфраструктуры
terraform destroy
Важные концепции
State файл
Terraform хранит состояние инфраструктуры в файле terraform.tfstate. Этот файл:
- ✅ Должен храниться безопасно
- ✅ Никогда не должен коммитится в Git
- ✅ Должен быть в .gitignore
Backend
Для команды разработчиков используйте Remote State: - AWS S3 + DynamoDB - Terraform Cloud - Azure Storage - Consul
Workflow
1. Write (Написать код)
↓
2. Plan (Посмотреть план)
↓
3. Apply (Применить изменения)
↓
4. Destroy (При необходимости удалить)
Полезные ресурсы
- Official Registry: https://registry.terraform.io
- Documentation: https://www.terraform.io/docs
- Community: https://discuss.hashicorp.com
- GitHub: https://github.com/hashicorp/terraform