// devops interview / infrastructure-as-code

Вопросы на собеседовании: Infrastructure as Code

Terraform state, планы изменений, модули, drift и безопасное применение инфраструктурного кода. Здесь — топ-12 по частоте на реальных собесах: у первых вопросов открыт полный разбор, у остальных — устный эталон. Весь банк темы (12 вопросов) с разборами — в приложении.

Открыть тему в приложении каждый день бесплатно: 3 эталона и 3 проверки арбитром

junior: база, с которой начинают

Чем декларативная инфраструктура в Terraform отличается от shell-скрипта, который по очереди создаёт те же ресурсы?

как ответить В Terraform я описываю желаемую конфигурацию и связи ресурсов, а Terraform через provider, state и текущие данные строит план перехода. Императивный скрипт задаёт последовательность команд и сам должен распознавать уже созданное состояние, ошибки и частичный повтор. Декларативность облегчает review и convergence, но не отменяет понимание побочных эффектов provider API.

разбор

Shell-скрипт естественно отвечает на вопрос «какие команды выполнить». Чтобы его безопасно повторять, автор вручную добавляет проверки существования, порядок, rollback и обработку частично выполненного шага. Terraform строит граф из ссылок, сопоставляет resource addresses с удалёнными объектами через state и предлагает действия для приближения факта к конфигурации.

Это даёт практические свойства:

  • изменение видно как code diff и execution plan;
  • независимые ресурсы можно обрабатывать параллельно;
  • повторный plan при отсутствии различий обычно пуст;
  • удаление блока может означать управляемое удаление объекта;
  • зависимости выражаются данными, а не sleep между командами.

Но Terraform не делает любую операцию безопасной или обратимой. Ошибка provider, eventual consistency, уникальное имя или destructive API остаются реальными. Скрипты по-прежнему уместны для локального glue-кода, однако создание долгоживущих ресурсов лучше оставлять системе с явным состоянием и планом.

чтобы прозвучать сильнее Объясни три источника решения Terraform: configuration, prior state и remote objects. Добавь, почему provisioner считается крайней мерой: его побочный эффект плохо вписывается в модель ресурсов и планирования.

devops-infrastructure-as-code-001 · junior · high

Что делают terraform init, plan и apply? Почему в автоматизации лучше применять сохранённый plan, а не снова запускать обычный apply после review?

terraform fmt -check
terraform init -input=false
terraform validate
terraform plan -out=tfplan
terraform show tfplan
terraform apply tfplan

как ответить init настраивает backend и устанавливает модули с providers, plan сравнивает конфигурацию, state и remote objects, а apply выполняет выбранные действия. plan -out сохраняет конкретный execution plan, и apply tfplan не строит вместо него новый набор изменений. Поэтому reviewer и apply-job работают с одним plan, хотя устаревшее внешнее состояние всё равно может привести к ошибке выполнения.

разбор

fmt -check и validate проверяют форму конфигурации, но не заменяют plan с реальными provider credentials. Обычный terraform plan без -out — speculative: он полезен для предварительного review, однако последующий простой terraform apply построит новый plan. Между этими действиями могли измениться код, зависимости или инфраструктура.

Безопасный автоматизированный путь:

  • инициализировать известные версии providers и backend;
  • создать non-speculative plan для конкретного workspace;
  • показать человеку текстовое или policy-представление plan;
  • связать approval с commit и digest plan artifact;
  • применить именно этот файл под state lock;
  • сохранить результат и outputs операции.

Saved plan — бинарный, чувствительный и не предназначен для commit в Git: он может содержать значения state, variables и backend metadata. Его хранят ограниченное время в защищённом artifact storage. Если plan успел устареть, безопаснее перестроить и заново проверить его, чем обходить ошибку.

чтобы прозвучать сильнее Добавь проверку exit code terraform plan -detailed-exitcode для автоматизации и policy на destructive actions. Объясни, почему approval текста plan бессмысленен, если apply запускается из другого commit или workspace.

devops-infrastructure-as-code-002 · junior · high

Зачем Terraform нужен state и почему terraform.tfstate нельзя хранить в Git как обычный файл конфигурации?

как ответить State связывает адреса ресурсов в конфигурации с конкретными удалёнными объектами и хранит metadata, нужные для планирования. Это не исходный код и не резервная копия инфраструктуры, а чувствительный изменяемый снимок управления. В команде его держат в защищённом remote backend с контролем доступа, versioning и, если backend умеет, locking.

полный разбор и проверка ответа арбитром — в приложении devops-infrastructure-as-code-003 · junior · high

Как Terraform понимает порядок создания этих ресурсов и когда здесь действительно понадобился бы depends_on?

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "app" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.1.0/24"
}

как ответить Ссылка aws_vpc.main.id создаёт неявное ребро графа, поэтому subnet будет обработан после необходимых действий над VPC. depends_on здесь лишний. Его добавляют для скрытой поведенческой зависимости, которую нельзя выразить ссылкой на данные, и используют точечно.

полный разбор и проверка ответа арбитром — в приложении devops-infrastructure-as-code-004 · junior · high

Зачем одновременно нужны version constraints и .terraform.lock.hcl? Что именно lock-файл фиксирует, а что пока не фиксирует?

как ответить Constraints задают допустимый диапазон Terraform и provider versions, а lock-файл запоминает конкретно выбранные providers и их checksums для повторных init. Его коммитят и изменения ревьюят. Remote modules lock-файл не фиксирует, поэтому их version или неизменяемую source revision задают отдельно.

полный разбор и проверка ответа арбитром — в приложении devops-infrastructure-as-code-005 · junior · medium

middle: где отделяют уверенных

Два инженера одновременно запускают terraform apply. Как remote backend и state locking защищают команду, а от чего они не защищают?

как ответить Remote backend даёт участникам один актуальный state, а backend с locking не позволяет двум операциям одновременно записывать его. Terraform берёт lock автоматически для операций, способных менять state, и при неудаче не продолжает. Lock не защищает от ручных изменений в облаке, ошибок одной apply-job или двух разных state, управляющих одним объектом.

полный разбор и проверка ответа арбитром — в приложении devops-infrastructure-as-code-006 · middle · medium

Кто-то вручную изменил firewall в облачной консоли, и следующий plan хочет вернуть старое значение. Как безопасно разобрать drift и выбрать источник нужного поведения?

terraform plan -refresh-only
terraform plan

как ответить Обычный plan обновляет представление remote objects в памяти и предлагает привести их к configuration, поэтому ручное правило будет удалено или изменено. plan -refresh-only отдельно показывает, как фактическое состояние отличается от записанного state, не планируя изменение инфраструктуры. После review я либо возвращаю объект к коду, либо сначала меняю configuration и осознанно принимаю drift в state.

полный разбор и проверка ответа арбитром — в приложении devops-infrastructure-as-code-007 · middle · medium

Ресурс уже создан вручную, а теперь его нужно передать под Terraform. Что делает import и какой порядок действий не даст случайно пересоздать объект?

как ответить Import связывает существующий remote object с конкретным resource address в state; он не доказывает, что написанная конфигурация полностью совпадает с объектом. Сначала описываю destination resource или import block, делаю резервную копию state, выполняю import и внимательно проверяю последующий plan. Цель — получить no-op либо только заранее понятные изменения.

полный разбор и проверка ответа арбитром — в приложении devops-infrastructure-as-code-008 · middle · medium

Как понять, что набор Terraform-ресурсов пора вынести в module, и каким должен быть его интерфейс?

как ответить Module оправдан, когда повторяется устойчивое инфраструктурное понятие с ясными inputs, outputs и политикой, а не просто несколько строк HCL. Интерфейс должен принимать зависимости от caller и возвращать только нужные результаты, чтобы модули можно было плоско компоновать. Огромный module с десятками boolean flags скрывает решения и связывает независимые lifecycle.

полный разбор и проверка ответа арбитром — в приложении devops-infrastructure-as-code-009 · middle · medium

Когда применять create_before_destroy, prevent_destroy и ignore_changes? Какие опасные иллюзии безопасности создаёт каждая настройка?

lifecycle {
  create_before_destroy = true
  prevent_destroy       = true
  ignore_changes        = [tags["managed-externally"]]
}

как ответить create_before_destroy меняет порядок replacement, если старый и новый объект могут существовать вместе. prevent_destroy отклоняет plan с удалением, пока правило присутствует в configuration, а ignore_changes отдаёт перечисленные attributes другому владельцу при update. Ни одна настройка не заменяет review: они могут упереться в уникальные имена, быть обойдены удалением блока или скрыть опасный drift.

полный разбор и проверка ответа арбитром — в приложении devops-infrastructure-as-code-010 · middle · medium

senior: глубина и продакшн

Переменная Terraform помечена sensitive = true. Гарантирует ли это отсутствие секрета в state и plan, и как спроектировать передачу секрета безопаснее?

как ответить sensitive в первую очередь скрывает значение в CLI и UI, но обычное sensitive-значение всё ещё может храниться в state и saved plan. Поэтому state и plan защищают как секреты, а постоянные credentials не вшивают в HCL или tfvars. Если Terraform и provider поддерживают ephemeral или write-only путь, его используют, иначе передают короткоживущее значение из secret manager и минимизируют его сохранение.

полный разбор и проверка ответа арбитром — в приложении devops-infrastructure-as-code-011 · senior · low

terraform apply упал после того, как часть ресурсов уже создалась. Почему Terraform не делает автоматический rollback и как безопасно привести configuration, state и облако к согласованному состоянию?

как ответить Terraform применяет граф по шагам; при ошибке он записывает в state известные успешно завершённые изменения, снимает lock и завершает apply. Общей транзакции с API провайдера и автоматического rollback нет. Сначала устраняю причину, сверяю state с фактическими объектами и строю новый plan; предыдущий state не восстанавливаю вслепую, иначе можно осиротить уже созданные ресурсы или получить дубликаты.

полный разбор и проверка ответа арбитром — в приложении devops-infrastructure-as-code-012 · senior · low

Соседние темы того же собеса