Что такое 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 инструментов занимает много времени