Gitlab CI:地表破坏不会破坏吗?

时间:2019-11-06 10:51:33

标签: terraform gitlab-ci

我定义了以下简单管道:

13

当我运行它时,一切都会成功完成-但是from itertools import chain my_list = [1, 2, 3, 4, 5, 6, 7, 8] print(list(chain(*zip(my_list[:len(my_list)//2], my_list[len(my_list)//2:]))) + ([] if len(my_list) % 2 == 0 else [my_list[-1]])) 阶段实际上并没有破坏我在image: name: hashicorp/terraform:light entrypoint: - '/usr/bin/env' - 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' variables: PLAN: dbrest.tfplan STATE: dbrest.tfstate cache: paths: - .terraform before_script: - terraform --version - terraform init stages: - validate - build - deploy - destroy validate: stage: validate script: - terraform validate plan: stage: build script: - terraform plan -state=$STATE -out=$PLAN artifacts: name: plan paths: - $PLAN - $STATE apply: stage: deploy environment: name: production script: - terraform apply -state=$STATE -input=false $PLAN - terraform state show aws_instance.bastion dependencies: - plan when: manual only: - master destroy: stage: destroy environment: name: production script: - terraform destroy -state=$STATE -auto-approve dependencies: - apply when: manual only: - master 阶段创建的环境。这是我看到的:

destroy

很明显,我打电话给apply的方式中有一些遗漏,但是我不知道是什么,请问有人可以对此加以说明吗?

1 个答案:

答案 0 :(得分:3)

您没有正确传递apply作业的状态,因为您没有像在plan-> apply中那样设置工件。您的apply工作应如下所示:

apply:
  stage: deploy
  environment:
    name: production
  script:
    - terraform apply -state=$STATE -input=false $PLAN
    - terraform state show aws_instance.bastion
  artifacts:
    name: apply
    paths:
      - $STATE
  dependencies:
    - plan
  when: manual
  only:
    - master

但是,更好的解决方案是不要在此处使用基于文件的状态,而应使用正确的remote state(例如,如果使用AWS,则使用S3),否则您将有很多麻烦多个用户(包括CI作为潜在的自发并发用户)运行Terraform时出现的问题。这样一来,您可以利用state locking的优势,并且还可以对状态文件进行版本控制,以防在Terraform操作过程中发生错误时(例如在重构时移动状态)。