Мой конвейер успешно развертывает данные в моей учетной записи Hetzner. Но когда я запускаю команду «Уничтожить», он говорит: «Никакие объекты не должны быть уничтожены».
Созданные ресурсы — это виртуальные машины. Больше нечего добавлять.
.gitlab-ci-yml:
stages:
- validate
- plan
- apply
- destroy
image:
name: hashicorp/terraform:light
entrypoint:
- '/usr/bin/env'
- 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
before_script:
- export HCLOUD_TOKEN=${HCLOUD_TOKEN}
- rm -rf .terraform
- terraform --version
- terraform init
validate:
stage: validate
script:
- terraform validate
plan:
stage: plan
script:
- terraform plan -out "planfile" --var-file=secret.tfvars
dependencies:
- validate
artifacts:
paths:
- planfile
apply:
stage: apply
script:
- terraform apply -input=false "planfile"
dependencies:
- plan
when: manual
destroy:
stage: destroy
script:
- terraform destroy --var-file=secret.tfvars
when: manual
dependencies:
- apply
Файл состояния terraform недоступен для вашего задания по уничтожению. Похоже, что вы используете локальный бэкэнд, а файл состояния terraform не используется совместно заданиями применения и уничтожения.
Самым быстрым решением было бы представить его как артефакт, как вы сделали с файлом плана между планом и заданием применения.
apply:
stage: apply
script:
- terraform apply -input=false "planfile"
dependencies:
- plan
when: manual
artifacts:
paths:
- terraform.tfstate
destroy:
stage: destroy
script:
- terraform destroy --var-file=secret.tfvars
when: manual
dependencies:
- apply
Альтернативно вы можете передать его как часть кеша, добавив глобальный кеш:
cache:
key: terraform-cache
paths:
- .terraform/
- .terraform.tfstate
Другой альтернативой может быть сохранение файла состояния в самом Gitlab. Gitlab предоставляет для этого помощники Помощники состояния терраформирования Gitlab, включая изображения.
Вот что вам нужно для быстрого старта, замените его части кода на него и включенные в него файловые файлы yml, позаботьтесь обо всем продвинутым способом, идеально интегрируя terraform в gitlab. Чтобы сообщить Terraform, что он использует серверную часть http, ваш файл backend.tf должен выглядеть так, как показано ниже. И я бы удалил ваш сценарий terraform init и другие команды перед тем, как все это управляется за вас с помощью помощников:
terraform {
backend "http" {}
}
Создается ли что-нибудь вообще? Вы находитесь в правильном каталоге?