Рубрики
Uncategorized

Настройка Gitlab CI с Terraform

Команда Gitlab делает такую отличную работу на своих трубопроводах CI/CD. В этом посте я покажу вам, как … Помечено терраформ, Gitlab, CICD, DevOps.

Команда Gitlab делает такую отличную работу на своих трубопроводах CI/CD. В этом посте я покажу вам, как использовать свою силу для развертывания инфраструктуры в качестве кода (IAC). Для этого мы собираемся использовать Terraform, который является инструментом для строительства, изменения и управления инфраструктурой безопасным, повторяемым способом.

Гитлаб CI

Я полагаю, что у вас уже есть учетная запись на Gitlab (если не просто перейти к gitlab.com и создайте один) или установку Gitlab CE/EE.

Итак, давайте поймем, как настроен трубопровод.

Во -первых, вам нужно будет создать файл в корне вашего репозитория под названием .gitlab-ci.yml Анкет Вы можете изменить имя файла в конфигурации репозитория, но пока давайте сохраним, как оно есть.

Стадии

Давайте настроим стадии трубопровода. В этом примере я буду определять только шаги для терраформы или инфраструктуры как кода (IAC). Вы можете определить столько, сколько другие этапы, которые вы хотите.

stages:
  - iac_validate
  - iac_plan
  - iac_apply

Стадии всегда будут работать в последовательности.

iac_validate

Мы будем использовать этот этап для проверки конфигурации Terraform. Он будет проверять только синтаксис и внутреннюю ссылку на ресурсы в конфигурации.

iac_plan

На этом этапе Terraform будет запускать план конфигурации. Он проверит все ресурсы конфигурации против государства, и он покажет вам, что будет создано, изменено или уничтожено.

iac_apply

Этот этап, как говорится в названии, будет применять предыдущий план, сгенерированный в трубопроводе.

Конфигурация по умолчанию

Для этого примера мы будем использовать официальное изображение Docker Terraform для запуска трубопровода. Итак, давайте определим его как изображение по умолчанию в файле Gitlab CI:

default:
  image:
    name: hashicorp/terraform:latest
    entrypoint:
      - /usr/bin/env
      - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
  before_script:
    - terraform init
  cache:
    key: terraform
    paths:
      - .terraform

Мы определили intrypoint Для изображения, потому что Terraform использует Terraform Бинарник как точка входа. Когда мы запускаем это в трубопроводе Gitlab CI, нам нужно изменить его на /usr/bin/env Для того, чтобы выполнить работу, иначе это потерпит неудачу. В Docker intrypoint Определяет программу, которая будет выполнена в контейнере Docker. Вы можете найти больше информации Здесь Анкет Если вы запускаете Gitlab Runner в качестве оболочки, вы можете удалить Изображение определение.

Еще одна вещь, которую мы определили в конфигурации по умолчанию, — это До_SCRICT Анкет До_SCRICT Будет работать перед каждой задачей, если вы не определите ее в работе.

И последнее, но не менее важное, кеш. Мы определили .terraform каталог будет кэширован. Этот каталог создается автоматически Terraform по каждому исполнению.

iac_validate

Как я уже упоминал ранее, этот этап будет подтверждать только синтаксис и внутреннюю ссылку ресурсов, указанных в конфигурации.

terraform_validate:
  stage: iac_validate
  script:
    - terraform validate
  except:
    refs:
      - master
  • Стадия Определяет этап, на которой будет выполняться эта работа. Вы можете определить несколько заданий для работы на одном и том же этапе
  • Скрипт получает все команды, которые будут выполнены в работе. Если какая -либо команда не удастся, задание потерпит неудачу
  • кроме сообщает, что работа не работает на ключах, в данном случае на ref Master (филиал мастер )

Мы выполним его только в филиалах функции или фиксируем, а не на Мастер ответвляться. Я предполагаю, что вы не обязуетесь, верно? 😉 Таким образом, он выполнит, и если есть какие -либо ошибки, она выведет вам.

Например, я определил неправильный аргумент в Terraform null_resource , посмотрите на ошибку, которая Terraform Validate брошен мне:

$ terraform validate
Error: Unsupported argument

  on example.tf line 2, in resource "null_resource" "example":
   2:   my_argument = "NOK"

An argument named "my_argument" is not expected here.

Если все в порядке, это выведет вам следующее сообщение:

$ terraform validate
Success! The configuration is valid.

iac_plan

Здесь Terraform сравнит вашу конфигурацию с государством и покажет вам все ресурсы, которые необходимо создать, изменять или уничтожить.

terraform_plan:
  stage: iac_plan
  script: 
    - terraform plan --out plan
  only:
    refs:
      - master
  artifacts:
    paths:
      - plan

Теперь у нас есть два новых ключа, определенных в terraform_plan работа, это только и Артефакты .

  • только означает, что эта работа будет работать только в этих ключах, в данном случае в ref Master (главная ветвь).
  • Артефакты сохранит файл, который будет создан План терраформ , с параметром -У-из-за Анкет В этом случае план файл. Мы будем использовать этот файл в следующей работе для применения инфраструктуры.

Опять же, используя последний пример из Terraform Validate Но на этот раз, с действительной конфигурацией, давайте посмотрим, что план выведет нам:

$ terraform plan --out plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.


------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # null_resource.example will be created
  + resource "null_resource" "example" {
      + id       = (known after apply)
      + triggers = {
          + "my_variable" = "OK"
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.

-----------------------------------------------------------------------------

This plan was saved to: plan

To perform exactly these actions, run the following command to apply:
    terraform apply "plan"

Я не буду объяснять в этой статье штат Terraform, он будет предметом для будущего поста.

Если не было ничего, чтобы создать, изменить или уничтожить, Terraform вытащит его вам:

$ terraform plan --out plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.


-----------------------------------------------------------------------------

No changes. Infrastructure is up-to-date.

This means that Terraform did not detect any differences between your
configuration and real physical resources that exist. As a result, no
actions need to be performed.

Давайте перейдем к нашей последней работе.

iac_apply

И вот последняя работа, которая применит инфраструктуру.

terraform_apply:
  stage: iac_apply
  script:
    - terraform apply --auto-approve plan
  when: manual
  allow_failure: false
  only:
    refs:
      - master

Итак, новые ключи здесь. Позвольте мне объяснить Когда и Allow_failure Ключи определены здесь:

  • Когда Определяет, когда работа будет выполнена. В этом случае работа будет работать вручную
  • Alling_failure Это указывает, может ли работа потерпеть неудачу или нет

Эта работа применяет вашу инфраструктуру, используя план, который был сгенерирован в последней работе ( terraform_plan ). Взгляните на то, что Terraform вызовет вам, когда вы выполните эту работу:

$ terraform apply --auto-aprove plan
null_resource.example: Creating...
null_resource.example: Creation complete after 0s [id=5363055958456141136]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

The state of your infrastructure has been saved to the path
below. This state is required to modify and destroy your
infrastructure, so keep it safe. To inspect the complete state
use the `terraform show` command.

State path: terraform.tfstate

Мы использовали -Ауто-одобрение параметр Так что вам не нужно печатать (ну, на самом деле вы не можете печатать) Да Чтобы применить конфигурацию.

Продолжить

Мы достигли конца этого поста, давайте посмотрим, как наш последний .gitlab-ci.yml Файл:

stages:
  - iac_validate
  - iac_plan
  - iac_apply

default:
  image:
    name: hashicorp/terraform:latest
    entrypoint:
      - /usr/bin/env
      - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
  before_script:
    - terraform init
  cache:
    key: terraform
    paths:
      - .terraform

terraform_validate:
  stage: iac_validate
  script:
    - terraform validate
  except:
    refs:
      - master

terraform_plan:
  stage: iac_plan
  script: 
    - terraform plan --out plan
  only:
    refs:
      - master
  artifacts:
    paths:
      - plan

terraform_apply:
  stage: iac_apply
  script:
    - terraform apply --auto-approve plan
  when: manual
  allow_failure: false
  only:
    refs:
      - master

Было несколько вещей, которые я не освещал в этом посте Но я сделаю в будущих, так что продолжайте посещать меня!:-) Надеюсь, вам понравилась эта статья. Пожалуйста, оставьте свой комментарий, чтобы я мог улучшить будущие сообщения. Наслаждайся этим!

Оригинал: «https://dev.to/fabiomatavelli/setup-gitlab-ci-with-terraform-26l1»