# Infrastructure as Code ## Навигация - [🏠 Главная страница курса](../../../README.md) - [📚 Модуль 3](../README.md) --- ## Что такое IaC **Infrastructure as Code (IaC)** — подход к управлению инфраструктурой через код. ## Преимущества IaC ### 1. Версионирование - История изменений инфраструктуры - Откат к предыдущим версиям - Code review для инфраструктуры ### 2. Повторяемость - Одинаковая инфраструктура в разных средах - Автоматизация развертывания - Устранение дрейфа конфигурации ### 3. Документация - Код как документация - Понятная структура инфраструктуры - Автоматическая генерация диаграмм ## Terraform **Terraform** — инструмент для управления инфраструктурой через код. ### Основные концепции: #### 1. Provider ```hcl terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 4.0" } } } provider "aws" { region = "us-west-2" } ``` #### 2. Resource ```hcl resource "aws_instance" "web" { ami = "ami-0c02fb55956c7d316" instance_type = "t2.micro" tags = { Name = "HelloWorld" } } ``` #### 3. Data Source ```hcl data "aws_ami" "ubuntu" { most_recent = true owners = ["099720109477"] filter { name = "name" values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"] } } ``` #### 4. Variables ```hcl variable "instance_type" { description = "EC2 instance type" type = string default = "t2.micro" } variable "environment" { description = "Environment name" type = string validation { condition = contains(["dev", "staging", "prod"], var.environment) error_message = "Environment must be dev, staging, or prod." } } ``` #### 5. Outputs ```hcl output "instance_ip" { description = "Public IP of the instance" value = aws_instance.web.public_ip } ``` ### Команды Terraform ```bash # Инициализация terraform init # Планирование изменений terraform plan # Применение изменений terraform apply # Уничтожение инфраструктуры terraform destroy # Просмотр состояния terraform show # Форматирование кода terraform fmt # Валидация конфигурации terraform validate ``` ### Модули Terraform ```hcl # main.tf module "vpc" { source = "./modules/vpc" environment = var.environment cidr_block = "10.0.0.0/16" } module "ec2" { source = "./modules/ec2" vpc_id = module.vpc.vpc_id subnet_id = module.vpc.public_subnet_id } ``` ## Ansible **Ansible** — инструмент автоматизации конфигурации и развертывания. ### Пример Playbook: ```yaml --- - name: Deploy web application hosts: web_servers become: yes vars: app_name: myapp app_port: 3000 tasks: - name: Install Node.js package: name: nodejs state: present - name: Install npm dependencies npm: path: /opt/{{ app_name }} state: present - name: Start application systemd: name: "{{ app_name }}" state: started enabled: yes ```