Команда 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»