Terraform: инфраструктура на уровне кода | страница 97




Закрытые Git-репозитории

Если ваш модуль находится в закрытом Git-репозитории, чтобы применять этот репозиторий в качестве источника модуля, нужно позволить Terraform в нем аутентифицироваться. Рекомендую использовать аутентификацию SSH, чтобы не пришлось хранить учетные данные для доступа к репозиторию в самом коде. Каждый разработчик сможет создать SSH-ключ и привязать его к пользователю Git. После добавления ключа в ssh-agent Terraform будет автоматически использовать его для аутентификации, если в качестве URL источника указан SSH45.

URL-адрес источника должен выглядеть так:

git@github.com:/.git//?ref=

Например:

git@github.com:acme/modules.git//example?ref=v0.1.2

Чтобы проверить, корректно ли вы отформатировали URL, попробуйте клонировать базовый адрес в терминале с помощью git clone:

$ git clone git@github.com:/.git

Если эта команда выполнится успешно, Terraform тоже сможет использовать ваш приватный репозиторий.

Теперь пройдемся по процессу внесения изменений в проекте с разными версиями модулей. Допустим, вы модифицировали модуль webserver-cluster и хотите проверить его в тестовой среде. Для начала изменения нужно зафиксировать в репозитории modules:

$ cd modules

$ git add .

$ git commit -m "Made some changes to webserver-cluster"

$ git push origin master

Затем в том же репозитории нужно создать новый тег:

$ git tag -a "v0.0.2" -m "Second release of webserver-cluster"

$ git push --follow-tags

Теперь вы можете перевести на новую версию только тот URL-адрес, который используется в тестовой среде (live/stage/services/webserver-cluster/main.tf):

module "webserver_cluster" {

  source = "git@github.com:foo/modules.git//webserver-cluster?ref=v0.0.2"

  cluster_name           = "webservers-stage"

  db_remote_state_bucket = "(YOUR_BUCKET_NAME)"

  db_remote_state_key    = "stage/data-stores/mysql/terraform.tfstate"

  instance_type = "t2.micro"

  min_size      = 2

  max_size      = 2

}

В промышленной среде (live/prod/services/webserver-cluster/main.tf) можно по-прежнему использовать версию v0.0.1 без всяких изменений:

module "webserver_cluster" {

  source = "git@github.com:foo/modules.git//webserver-cluster?ref=v0.0.1"

  cluster_name           = "webservers-prod"

  db_remote_state_bucket = "(YOUR_BUCKET_NAME)"

  db_remote_state_key    = "prod/data-stores/mysql/terraform.tfstate"

  instance_type = "m4.large"

  min_size      = 2

  max_size      = 10

}

После того как вы тщательно проверили версию v0.0.2 и убедились в ее корректности в тестовой среде, можете обновить и промышленное окружение. Но если в v0.0.2 обнаружится ошибка, это не составит большой проблемы, поскольку пользователи реальной системы не будут затронуты. Исправьте ошибку, выпустите новую версию и повторите весь процесс заново, пока ваш модуль не станет достаточно стабильным для промышленного применения.