Чем декларативная инфраструктура в 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