Урок 1-2: Основы Terraform и установка

Pavel 08.12.2025 18:56 8 просмотров

Что такое 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

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

Для добавления комментария необходимо войти в аккаунт

Войти / Зарегистрироваться