Что такое Infrastructure as a Code?

Что такое IaC, основные принципы и предназначение

IaC - это подход к развертыванию инфраструктуры, в котором ручные действия сведены к минимуму, либо вовсе отсутствуют.

Без инструментов не обходится не один подход в DevOps, поэтому у нас целый зоопарк есть:

  • Terraform - пожалуй самый популярный инструмент для управление почти любыми ресурсами. Есть множество модулей и провайдеров на все случаи жизни.
  • AWS CloudFormation - по функционалу это subset terraform. Умеет управлять только ресурсами AWS
  • Azure Resource Manager
  • GCP Cloud Deployment Manager
  • Ansible - часто используется в дополнение к вышеперечисленным, т.к. имеет отличия в назначении и работе

Пример кода на Terraform:

 1data "yandex_compute_image" "ubuntu-2004-latest" {
 2  family = "ubuntu-2004-lts"
 3}
 4
 5resource "yandex_compute_instance" "my-virtual-machine" {
 6  name = "my-virtual-machine"
 7  zone = "ru-central1-a"
 8  resources {
 9    cores         = 4
10    memory        = 8
11    core_fraction = 100
12    gpus          = 0
13  }
14  boot_disk {
15    initialize_params {
16      image_id = data.yandex_compute_image.ubuntu-2004-latest.id
17      size     = 100
18      type     = "network-hdd"
19    }
20  }
21  network_interface {
22    subnet_id      = yandex_vpc_subnet.k8s-vpc-subnet-a.id
23    nat            = true
24    nat_ip_address = "11.22.33.44"
25  }
26  metadata = {
27    ssh-keys = "ubuntu:${var.sshkey-ivanov}"
28  }
29}

Данный код описывает создание виртуальной машины с заданными параметрами и сетевыми настройками

Подход "Инфраструктура как Код" стал стандартом в мире DevOps, и этому есть несколько причин:

  • Код это еще и документация, которая всегда актуальна, в отличие от других типов документаций. Но комментарии в самом коде никто не отменял, они все еще полезны.
  • Повторное развертывание проверенного стека автоматизировано и лишено ошибок, которые легко допустить если развертывать инфраструктуру руками
  • Это стандартизация процессов и взаимодействия внутри инфраструктурной команды

Когда использование IaC лишено смысла:

  • Если заведо известно что планируемое развертывание будет одноразовым и временным. Например для тестирования чего либо
  • Когда после развертывания приходится часто что-то изменять вручную. Из-за этого возникает так называемый drift, то есть расхождение между актуальным и описанным состоянием.
  • Когда написание кода занимает слишком много времени по сравнению с ручным развертыванием, при этом известно что повторяться процедура будет не часто, либо никогда
  • Когда получившийся код ненадежен, работает криво, использует модули, которые более не поддерживаются
  • Когда поддержка самого кода и обновления версий IaC инструментов занимает много времени